SmartestHome/hosts/touch-panel/configs/udev/99-touchscreen-override.rules

43 lines
2.7 KiB
Plaintext

# Forces a specific touchscreen to be classified as ID_INPUT_TOUCHSCREEN instead of
# ID_INPUT_MOUSE. Installed to /etc/udev/rules.d/99-touchscreen-override.rules.
#
# THE PROBLEM this fixes: some cheap USB touch controllers implement single-touch by
# emulating an absolute-position HID mouse (BTN_LEFT + ABS_X/ABS_Y) rather than a
# proper HID digitizer (BTN_TOUCH). udev's stock 60-input-id rules (via the
# `input_id` builtin) read those capability bits to decide ID_INPUT_TOUCHSCREEN vs.
# ID_INPUT_MOUSE, and get it wrong for exactly this class of hardware — libinput then
# hands sway a `type:pointer` device instead of `type:touch`, which is what
# configs/sway/config's `input type:pointer {}` block degrades gracefully for.
#
# THE REAL FIX, not just a workaround: re-tag the specific device by its USB
# vendor/product ID so udev (and therefore libinput, and therefore sway) treats it as
# a genuine touchscreen — full multi-touch/wl_touch semantics, not the single-touch
# click-drag ceiling of the type:pointer fallback.
#
# 99- (not 61- or similar): udev processes rule files in filename order, and the
# ID_INPUT_* properties this needs to override are set by the *stock* rules around
# priority 60 (60-input-id.rules / 60-persistent-input.rules, packaged with udev
# itself). A rule that runs after them can overwrite what they set; one that runs
# before cannot. 99 guarantees "after."
#
# SETUP — do this once real touch-panel hardware is chosen:
# 1. Plug the touchscreen in, find its input event node:
# ls -l /dev/input/by-id/ # or: libinput list-devices
# 2. Get its USB vendor/product ID:
# udevadm info -a /dev/input/eventN | grep -m1 -E 'idVendor|idProduct'
# (walk up with -p if the input node itself has no idVendor/idProduct attrs —
# udev's ATTRS{} match below walks the parent chain automatically either way)
# 3. Replace the 0000/0000 placeholders below with the real values (lowercase hex,
# no "0x" prefix — exactly as `udevadm info` prints them).
# 4. udevadm control --reload-rules && udevadm trigger
# 5. Confirm: `udevadm info /dev/input/eventN | grep ID_INPUT` should now show
# ID_INPUT_TOUCHSCREEN=1 and no ID_INPUT_MOUSE=1. `swaymsg reload` afterward so
# sway re-evaluates the device against configs/sway/config's `input type:touch`
# block instead of `input type:pointer`.
#
# Ships as an inert template: 0000:0000 matches no real hardware, so this file does
# nothing on an unconfigured image — the type:pointer fallback in configs/sway/config
# is what makes an unconfigured (or not-yet-matched) touchscreen usable in the
# meantime, not this file.
SUBSYSTEM=="input", ATTRS{idVendor}=="0000", ATTRS{idProduct}=="0000", ENV{ID_INPUT_TOUCHSCREEN}="1", ENV{ID_INPUT_MOUSE}=""