* fix(evdev): keep key suppression when /dev/uinput is write-only
python-evdev opens /dev/uinput O_RDWR, but the kernel only needs write
access for the uinput setup ioctls and event injection. Installs that
still carry the original 80-dotool.rules line (MODE=0620, write-only
for the input group) therefore fail UInput() with EACCES and fall back
to ungrabbed monitoring, where the dictation shortcut is detected but
also reaches the focused application. Retry the clone on an O_WRONLY
descriptor via a small _WriteOnlyUInput subclass so suppression keeps
working there (refs #871).
Also populate _withheld_modifier lazily in _event_is_shortcut: the
AltGr-replay machinery was dead code because nothing created the
per-fd map, so a withheld modifier press was never replayed and
composition (e.g. RightAlt+e) lost its modifier.
* fix(evdev): byte-truncate clone names and cover the write-only path
- _clone_device_name now truncates the encoded name by bytes: the
kernel limit is 79 bytes, and a long multibyte device name could push
the " (vocalinux)" suffix past the cut so rescan would not skip the
clone.
- _WriteOnlyUInput closes the fd explicitly when _prepare_events fails
before the _uinput calls; the helpers close it themselves on any
later failure.
- Tests now instantiate the real subclass with mocked OS/native calls
(open flags, setup sequence, write/write_event/syn ordering, fd
cleanup, name truncation).
---------
Co-authored-by: Jatin K Malik <jatinkrmalik@gmail.com>