moses-palmer / pynput

Sends virtual input commands
GNU Lesser General Public License v3.0
1.73k stars 243 forks source link

pynput not detecting media keys on kde plasma wayland #580

Open walksanatora opened 7 months ago

walksanatora commented 7 months ago

Description A clear and concise description of what the bug is. all keyboard and numpad keys (excluding the media keys) are being detected but not the play/pause, stop, or skip foward/back buttons

Platform and pynput version Your operating system and version, and the version of pynput. Linux archiev3 6.6.6-arch1-1 #1 SMP PREEMPT_DYNAMIC Mon, 11 Dec 2023 11:48:23 +0000 x86_64 GNU/Linux pynput 1.7.6 I should also specify I am on wayland desktop

To Reproduce

def on_press(key):
    if str(key) == 'Key.media_next':
        print("media next")
    elif str(key) == 'Key.media_play_pause':
        print("media play/pause")
    elif str(key) == '<269025045>':
        print("media stop")
    elif str(key) == 'Key.media_previous':
        print("media previous")
    else: 
        print("unknown key:", str(key))
        pass

listener_thread = Listener(on_press=on_press, on_release=None)
listener_thread.start()

while true:
    pass

press mmedia keys and none appear

blu006 commented 3 months ago

Hello,

I have had a similar issue in KDE plasma wayland.

My function keys f13-f18 (haven't tested further yet) do not work.

I think this is because "under the hood," pynput does not have bindings for wayland but only for xorg.

Here is what my code looks like, btw. Nice to see that somebody else has found another way to work around this issue:

#!/usr/bin/python3

# toggles LEDs based on the button pressed

import sys
import sal_kblib as sal
import json
from pynput import keyboard
from threading import Event

def on_press(key):
    print(key)
    if key == keyboard.KeyCode(269025153):
        sal.toggle_led(interface, 0)
    if key == keyboard.KeyCode(269025093):
        sal.toggle_led(interface, 1)
    if key == keyboard.KeyCode(269025094):
        sal.toggle_led(interface, 2)
    if key == keyboard.KeyCode(269025095):
        sal.toggle_led(interface, 3)
    if key == keyboard.KeyCode(269025096):
        sal.toggle_led(interface, 4)
    if key == keyboard.KeyCode(269025097):
        sal.toggle_led(interface, 5)

if __name__ == '__main__':
    evnt = Event()
    interface = sal.get_hid_interface();

    listener = keyboard.Listener(on_press = on_press)
    listener.start()

    while True:
        # essentially does nothing but reset the watchdog
        sal.toggle_led(interface, 0xff)
        evnt.wait(1);