Skip to content

[BUG] Ctrl shortcuts broke system-wide until relogin #658

Description

@hopsayer

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions