Joy
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.