Fork of it that has LINUX
  • Makefile 70.4%
  • C++ 13.9%
  • CMake 11.2%
  • C 4%
  • Nix 0.2%
  • Other 0.3%
Find a file
2026-05-28 10:03:22 +00:00
build-flake initial port to linux 2026-05-27 22:47:27 -06:00
build-flake2 initial port to linux 2026-05-27 22:47:27 -06:00
nix packaging stuff 2026-05-27 23:39:33 -06:00
resources packaging stuff 2026-05-27 23:39:33 -06:00
src Add Windows vendor trackpad haptics matching Linux. 2026-05-28 03:59:07 -06:00
third_party/ViGEmClient-1.16.18.0 Initial release 2026-05-10 19:28:03 -07:00
.gitignore Add trackpad haptics and vendor trackpad mouse mode. 2026-05-28 03:59:06 -06:00
CMakeLists.txt Add Windows vendor trackpad haptics matching Linux. 2026-05-28 03:59:07 -06:00
CMakePresets.json Add Start with Windows, installer script, and release build support 2026-05-10 19:57:47 -07:00
flake.lock initial port to linux 2026-05-27 22:47:27 -06:00
flake.nix Add trackpad haptics and vendor trackpad mouse mode. 2026-05-28 03:59:06 -06:00
LICENSE Initial release 2026-05-10 19:28:03 -07:00
README.md Update README.md 2026-05-28 04:03:06 -06:00

SteamlessController

A lightweight system tray app that lets you use a Steam Controller as a standard gamepad — without Steam running.

image

When Steamless Mode is active, the app disables the controller's built-in keyboard/mouse emulation (lizard mode) and exposes it as a virtual Xbox 360 controller via ViGEmBus, making it compatible with any game that supports XInput or the Xbox controller.

Features

  • System tray icon shows connection and mode status
  • Steamless Mode — disables lizard mode and exposes controller as Xbox 360 gamepad
  • Trackpad Mouse — use the right (or left) trackpad as a mouse cursor
  • Back Buttons for Clicking — map R4/R5 (or L4/L5) to left/right mouse click
  • Trackpad Haptics — click and scroll feedback on the trackpads (Linux only — see Windows limitations)
  • Use Left Trackpad Instead — mirror all trackpad/back-button functionality to the left side for left-handed users
  • Start with Windows / Start at Login — launch automatically at login
  • Settings persist across restarts
  • Single-instance guard — safe to leave running
image

Requirements

Windows

To run

  • Windows 10 or later (64-bit)
  • ViGEmBus driver installed
  • Steam Controller (VID 0x28DE / PID 0x1302)
  • Steam closed (Steam claims the controller when running)

To build

  • Visual Studio 2022 with the Desktop development with C++ workload
  • CMake 3.20 or later (included with Visual Studio, or install separately)
  • Windows SDK 10.0.22000 or later (installed via Visual Studio Installer)

Windows limitations

  • Trackpad haptics do not fire on Windows. The vendor HID interface used to drive the controller's haptic actuators is not accessible to user-mode applications on Windows due to OS permission limitations on that interface. The code path is wired up and works on Linux (where the kernel exposes the raw HID node to processes in the input group), but the same feature reports are silently rejected on Windows.

Linux

To run

  • A Wayland desktop with a system tray (Qt 6 status notifier)
  • Steam Controller (VID 0x28DE / PID 0x1302 or dongle 0x1304)
  • Membership in the input group (for /dev/uinput) or run as root
  • Steam closed

To build

  • CMake 3.20+, a C++20 compiler, Git, Qt 6 Widgets, and libudev development headers (e.g. systemd-dev on NixOS, libudev-dev on Debian/Ubuntu)

Building

Windows

git clone https://github.com/your-username/SteamlessController.git
cd SteamlessController
cmake -B build
cmake --build build --target SteamlessController

The executable will be at build\Debug\SteamlessController.exe.

For a release build:

cmake -B build/release -G "Visual Studio 18 2025"
cmake --build build/release --config Release --target SteamlessController

If you have Visual Studio 2022, replace "Visual Studio 18 2025" with "Visual Studio 17 2022".

Linux

git clone https://github.com/your-username/SteamlessController.git
cd SteamlessController
nix develop   # optional: enter dev shell with all build deps
cmake -B build
cmake --build build

Run the tray app (right-click the tray icon for the menu):

./build/steamless-controller

Install system-wide (or into $HOME/.local):

cmake --install build --prefix ~/.local
# ensure ~/.local/bin is on PATH

Start at Login symlinks the packaged XDG autostart entry into ~/.config/autostart/ — it runs steamless-controller from your PATH, not a hardcoded /nix/store/... path, so it survives package updates when installed properly.

A headless CLI build is also available:

./build/SteamlessControllerCli --trackpad --back-buttons

Add your user to the input group if virtual gamepad creation fails:

sudo usermod -aG input "$USER"
# log out and back in

Nix / Home Manager

Build from this flake:

nix build
./result/bin/steamless-controller

Add as a flake input in Home Manager:

# flake.nix
steamless-controller.url = "git+ssh://git@ssh.critchlow.net/tylercritchlow/SteamlessController.git";
steamless-controller.inputs.nixpkgs.follows = "nixpkgs";

# home.packages (Linux only)
inputs.steamless-controller.packages.${pkgs.system}.default

HTTPS also works: git+https://git.critchlow.net/tylercritchlow/SteamlessController.git

The installed package ships steamless-controller on PATH plus the XDG autostart template under $out/share/steamless-controller/. Use the tray menu Start at Login toggle to symlink it into ~/.config/autostart/.

CMake Targets

Target Platform Description
SteamlessController Windows System tray application
SteamlessController Linux Qt system tray application
SteamlessControllerCli Linux Headless CLI (optional flags for trackpad/back buttons)
SteamProbe All Console diagnostic tool — dumps raw HID report bytes
RawControllerProbe Windows Checks whether Windows.Gaming.Input.RawGameController can enumerate the Steam Controller

How it works

The Steam Controller exposes a vendor HID collection (usage page 0xFF00) that carries all game input in a 54-byte report (ID 0x42) at ~60 Hz. By default the firmware runs in lizard mode, emulating a keyboard and mouse so the controller works without drivers.

SteamlessController sends HID feature reports to disable lizard mode, then reads the raw input reports and translates them into a virtual Xbox 360 controller via ViGEmBus. A background heartbeat re-sends the disable command every 800 ms to keep lizard mode off.

The full input report layout is documented in src/steam/SteamController.h.

Third-party

  • ViGEmClient — MIT License, built from source as a static library