Got to reading short stories in Column Reader from laptop screen before sleep recently, and for an extra-lazy points, don't want to drag my hand to keyboard to flip pages (or columns, as the case might be).
Hard part is figuring out how to properly do it all in Xorg - need to build xf86-input-joystick first (somehow not in Arch core), then figure out how to make it act like a dumb event source, not some mouse emulator, and then stuff like xev and xbindkeys will probably help.
This is way more complicated than it needs to be, and gets even more so when you factor-in all the Xorg driver quirks, xev's somewhat cryptic nature (modifier maps, keysyms, etc), fact that xbindkeys can't actually do "press key" actions (have to use stuff like xdotool for that), etc.
All the while reading these events from linux itself is as trivial as evtest /dev/input/event11 (or for event in dev.read_loop(): ...) and sending them back is just ui.write(e.EV_KEY, e.BTN_RIGHT, 1) via uinput device.
Hence whole binding thing can be done by a tiny python loop that'd read events from whatever specified evdev and write corresponding (desired) keys to uinput.
So instead of +1 pre-naptime story, hacked together a script to do just that - evdev-to-xev (python3/asyncio) - which reads mappings from simple YAML and runs the loop.
For example, to bind right joystick's (on the same XBox 360 controller) extreme positions to cursor keys, plus triggers, d-pad and bumper buttons there:
map: ## Right stick # Extreme positions are ~32_768 ABS_RX <-30_000: left ABS_RX >30_000: right ABS_RY <-30_000: up ABS_RY >30_000: down ## Triggers # 0 (idle) to 255 (fully pressed) ABS_Z >200: left ABS_RZ >200: right ## D-pad ABS_HAT0Y -1: leftctrl leftshift equal ABS_HAT0Y 1: leftctrl minus ABS_HAT0X -1: pageup ABS_HAT0X 1: pagedown ## Bumpers BTN_TL 1: [h,e,l,l,o,space,w,o,r,l,d,enter] BTN_TR 1: right timings: hold: 0.02 delay: 0.02 repeat: 0.5
Given how all iterations of X had to work with whatever input they had at the time, plus not just on linux, even when evdev was around, hard to blame it for having a bit of complexity on top of way simplier input layer underneath.
In linux, aforementioned Xbox 360 gamepad is supported by "xpad" module (so that you'd get evdev node for it), and /dev/uinput for simulating arbitrary evdev stuff is "uinput" module.
Most similar tool to such script seem to be actkbd, though afaict, one'd still need to run xdotool from it to simulate input :O=
Github link: evdev-to-xev script (in the usual mk-fg/fgtk scrap-heap)