Joy

From The Hei Canon

joy maps a game controller (DualSense, Xbox, etc.) to mouse and keyboard input on Wayland. Uses evdev + uinput to work natively without X11.

Stack: Python. Private repo.

Configuration

joy-config is a controller-shaped terminal UI to remap every button per profile. Buttons are laid out to mirror a real DualSense — D-Pad and face buttons as diamonds, triggers on top, system buttons and sticks below — so you map by the controller's physical layout instead of scanning a list. Layout is responsive: on narrow terminals the clusters reflow into a single stacked column. Click a button (or Tab + Enter) to pick an action via a fuzzy finder. Ctrl+S saves, Ctrl+Q quits. Config saves to ~/.config/joy/config.json.

Default mappings

Controller Action
Left / Right stick Mouse movement (scroll in scroll mode)
Cross (X) Left click
Circle (O) Right click
Square Enter
Triangle F14
L1 / R1 Super / Toggle profile 2
L2 / R2 Ctrl / Alt
Start / Select Super / Escape
PS Game mode toggle (controller passed through to games)
D-pad Arrow keys
Touchpad click Passthrough (remappable)

Install as a service via sudo ./install.sh; or run manually with sudo .venv/bin/python controller_mouse.py.

Sources

See also