moses-palmer/pynput

Hotkeys <space> and <tab> not working

JanBeelte opened this issue · 3 comments

Description
Keys like <ctrl> and all "normal ascii characters" are working, while <space> and <tab> are broken.
Tested on the following Keyboard-Layouts:

  • English (intl., with AltGr dead keys) - my default
  • English (US) - for testing

the behavior is the same on both.

Platform and pynput version
Linux jan-desktop 5.15.122-1-MANJARO #1 SMP PREEMPT Tue Jul 25 07:09:46 UTC 2023 x86_64 GNU/Linux
pynput==1.7.6

To Reproduce

from pynput import keyboard


# Minimal example to reproduce the <space> and <tab> bug:
def trigger_working():
    print("working")


def trigger_not_working():
    print("never seen")


listener = keyboard.GlobalHotKeys(
    {
        "<space>": trigger_not_working,
        "<tab>": trigger_not_working,
        "a": trigger_working,
        "<ctrl>": trigger_working,
    }
)

with listener:
    listener.join()

the space and tab keys are not added to _MODIFIER_KEYS in https://github.com/moses-palmer/pynput/tree/master/lib/pynput/keyboard/init.py line 42

Thanks for the input! Not sure this is the correct explaination, in my use-case I want to listen for e.g. "<ctrl>+<space>" or "<ctrl>+<tab>". While debugging the issue I realised that even "<space>" and "<tab>" are not working. Instead of having them as modifier keys I expect to have them as "normal keys" that behave like "a" but this does not seem to be the case. Any pointer on why this could be the case?

Thank you for your report.

When I run your script and press a, ctrl, space and tab in that order, I get the following printout:

working
working
never seen
never seen

I changed the space hotkey to ctrl + space, and that also worked. This, however, was when running under Wayland, so it only worked while an application running under XWayland had focus. The fact that it works indicates that the state managing code is not to blame.

Could you please add logging to pynput.keyboard.HotKey.press, just after self._state.add(key)? The value of self._state compared to self._keys might show what is wrong.