Summary
Once, on 0.15.0 (AppImage) / GNOME Wayland, Ctrl-based keyboard shortcuts
stopped working system-wide (not just in vocalinux's target apps) until I
logged out and back in. Hard to reproduce on demand, so filing this
separately from #657 as a lower-confidence report with a
possible mechanism, not a repeatable bug.
What happened
Ctrl+A (select all) and Ctrl+V (paste) stopped registering — affected Telegram (Qt), Obsidian (Electron), Nautilus (GTK4).
- Mouse-based equivalents (drag-select, right-click paste) worked fine.
- Plain text typing was unaffected — characters weren't dropped, altered, or
misinterpreted as shortcuts.
- Quitting/disabling vocalinux did not fix it — only logout/login did.
- After relogin, keyboard layout also seemed to stop influencing injected
text at all (possibly related, possibly a side effect of the relogin
resetting something else — unclear).
I don't have a reliable reproduction path for this one.
Possible mechanism (unconfirmed, from reading the code)
I first suspected vocalinux itself was holding an exclusive grab on an input
device, but that doesn't check out: neither evdev_backend.py nor
pynput_backend.py calls .grab()/EVIOCGRAB or pynput's suppress=True —
they only listen, they don't intercept.
A more concrete candidate is _inject_via_clipboard_paste() in
text_injector.py, which simulates Ctrl+V as a single ydotool key call
with a 3-second timeout:
_YDOTOOL_V1_CTRL_V = ["ydotool", "key", "29:1", "47:1", "47:0", "29:0"]
# 29 = LEFTCTRL, 47 = V — press Ctrl, press V, release V, release Ctrl
...
subprocess.run(cmd, check=True, stderr=subprocess.PIPE, text=True, timeout=3)
except (subprocess.CalledProcessError, subprocess.TimeoutExpired) as e:
logger.warning(f"Paste simulation failed: {e}")
If ydotoold stalls and this hits the 3s timeout, the client process gets
killed mid-sequence. If the daemon had already applied 29:1 (Ctrl-down) to
its virtual uinput device before the client was killed, but never received
29:0 (Ctrl-up), the virtual Ctrl key could stay logically "held" on that
device — separate from the real keyboard. That would explain: real typing
unaffected (different device), mouse actions unaffected (not
modifier-dependent), Ctrl shortcuts broken system-wide (Mutter aggregates
modifier state across all input devices for global shortcuts), and only
logout fixing it (restarts the session's input stack, presumably including
ydotoold's uinput device — quitting vocalinux alone doesn't touch the
separate ydotoold process).
Not confirmed, just flagging a specific, checkable spot rather than "Mutter
broke." If it holds up, an explicit safety-net release (e.g. always send a
bare ydotool key 29:0 after a TimeoutExpired/CalledProcessError here)
would be a cheap mitigation regardless of the exact trigger.
If it happens again, I'll try to look into logs of Voca and gnome-shell.
Environment
- vocalinux 0.15.0, AppImage
- GNOME on Wayland
- Arch latest packages
Summary
Once, on 0.15.0 (AppImage) / GNOME Wayland, Ctrl-based keyboard shortcuts
stopped working system-wide (not just in vocalinux's target apps) until I
logged out and back in. Hard to reproduce on demand, so filing this
separately from #657 as a lower-confidence report with a
possible mechanism, not a repeatable bug.
What happened
Ctrl+A(select all) andCtrl+V(paste) stopped registering — affected Telegram (Qt), Obsidian (Electron), Nautilus (GTK4).misinterpreted as shortcuts.
text at all (possibly related, possibly a side effect of the relogin
resetting something else — unclear).
I don't have a reliable reproduction path for this one.
Possible mechanism (unconfirmed, from reading the code)
I first suspected vocalinux itself was holding an exclusive grab on an input
device, but that doesn't check out: neither
evdev_backend.pynorpynput_backend.pycalls.grab()/EVIOCGRABor pynput'ssuppress=True—they only listen, they don't intercept.
A more concrete candidate is
_inject_via_clipboard_paste()intext_injector.py, which simulates Ctrl+V as a singleydotool keycallwith a 3-second timeout:
If
ydotooldstalls and this hits the 3s timeout, the client process getskilled mid-sequence. If the daemon had already applied
29:1(Ctrl-down) toits virtual uinput device before the client was killed, but never received
29:0(Ctrl-up), the virtual Ctrl key could stay logically "held" on thatdevice — separate from the real keyboard. That would explain: real typing
unaffected (different device), mouse actions unaffected (not
modifier-dependent), Ctrl shortcuts broken system-wide (Mutter aggregates
modifier state across all input devices for global shortcuts), and only
logout fixing it (restarts the session's input stack, presumably including
ydotoold's uinput device — quitting vocalinux alone doesn't touch theseparate
ydotooldprocess).Not confirmed, just flagging a specific, checkable spot rather than "Mutter
broke." If it holds up, an explicit safety-net release (e.g. always send a
bare
ydotool key 29:0after aTimeoutExpired/CalledProcessErrorhere)would be a cheap mitigation regardless of the exact trigger.
If it happens again, I'll try to look into logs of Voca and gnome-shell.
Environment