Trackpad Emulation
The Steam Deck trackpads are exceptional input hardware. Steam Input's trackpad support — trackball-style cursor with inertia, scroll with momentum, haptic click-grid feedback, configurable sensitivity — is one of the best controller-based trackpad experiences available. Deckery's goal is to match this quality, and go beyond it, without Steam in the loop.
The Goal
Currently, cursor movement and scrolling on the Steam Deck depend on either the kernel's Lizard Mode (when Steam isn't running) or Steam Input itself. Both are limited: Lizard Mode is hardcoded with no customisation, and Steam Input requires Steam to run. Deckery replaces this dependency layer by layer.
The full roadmap:
| Status | Feature | Issue |
|---|---|---|
| ✅ | Virtual MT devices — expose raw trackpad data to the Linux input stack | — |
| ⏳ | Lizard Mode suppression — hold the hidraw device open so the kernel driver doesn't override our output | makima-deckery#11 |
| ⏳ | libinput device profile — tune acceleration curves and trackball inertia for Steam Input-quality cursor feel | deckery#5 |
| ⏳ | Scrolling via gesture tool — replace Steam Input's scroll emulation entirely | deckery#4 |
| ⏳ | Gesture tool integration — discrete gesture zones trigger makima actions; continuous gestures go directly to the input stack | deckery#3 |
| ⏳ | Combined two-pad gesture device — both pads together as two fingers for pinch-zoom and pan | deckery#7 |
| ⏳ | Haptic feedback — haptic pulses via FF_HAPTIC back-channel, matching Steam's click-grid feel | makima-deckery#9 |
| ⏳ | Hardware settings via TOML — trackpad pressure thresholds, sensitivity, haptic intensity in the makima config | makima-deckery#13 |
How it works
The Steam Deck kernel driver (hid-steam) delivers trackpad data as absolute axes on the gamepad device:
| Raw axis | Meaning | Range |
|---|---|---|
ABS_HAT0X / ABS_HAT0Y |
Left trackpad position | −32767 … +32767 |
ABS_HAT1X / ABS_HAT1Y |
Right trackpad position | −32767 … +32767 |
BTN_THUMB |
Left trackpad physical click | — |
BTN_THUMB2 |
Right trackpad physical click | — |
Makima translates these to ABS_MT_POSITION_X/Y + BTN_TOUCH + BTN_TOOL_FINGER frames on the virtual uinput device. The Y-axis is corrected to libinput convention — hardware reports up as negative; the virtual device flips this.
Once the virtual devices exist, gesture tools read them and map swipes, taps, and zones to arbitrary actions — independently configurable per pad.
Virtual devices
With LPAD = "trackpad" or RPAD = "trackpad" in the config, makima creates:
| Device name | Source |
|---|---|
Deckery Left Trackpad |
Left trackpad (ABS_HAT0X/Y) |
Deckery Right Trackpad |
Right trackpad (ABS_HAT1X/Y) |
Deckery Trackpad |
Both pads combined into a single MT device |
Configuration
[settings]
LPAD = "trackpad" # creates "Deckery Left Trackpad" virtual MT device
RPAD = "trackpad" # creates "Deckery Right Trackpad" virtual MT device
# LPAD = "disabled" # default — no virtual device
Trackpad position, touch state, and press state are always tracked and exported to state.json regardless of the mode setting — the HUD can visualise trackpad input even when mode is "disabled".
Lizard Mode
Full Steam independence requires suppressing the hid-steam kernel driver's built-in mouse/scroll fallback (Lizard Mode). While Steam is running, Steam handles this automatically. Makima-native Lizard Mode suppression is in progress — see makima-deckery#11.
libinput tuning
When the virtual devices are registered, libinput applies generic touchpad profiles to them. For good cursor movement and gesture recognition, the Deckery trackpad devices may need custom libinput configuration via libinput quirks. This is a prerequisite for making the trackpad feel as responsive as Steam Input's trackball mode. See deckery#2.