Gnome Keybinder не связывается должным образом с XF86AudioPlay - PullRequest
0 голосов
/ 13 января 2020

Мне удалось получить Python программу для прослушивания Control + Alt + P и Control + Alt + O , даже если у окна нет фокуса.

Однако я не могу захватить <FX86Audio...> событий, даже если успешно выполняется связывание (если написано правильно).

Вот фрагмент кода, который работает:

Как упоминалось ранее, эти привязки клавиш принимаются, но не работают:

    key.bind("<XF86AudioPlay>", self.say, "World :)")
    key.bind("<XF86AudioPause>", self.say, "World :(")
    key.bind("<AudioPlay>", self.say, "World :/")

Клавиатура работает для паузы и игры с rhythembox.

Думая, что Unity мешает, я переставил <XF86AudioPlay> комбинацию клавиш в другую последовательность, но безрезультатно.

На других сайтах он говорит о gsettings и моё кажется нормальным для Ubuntu 16.04 с интерфейсом Unity:

gsettings glugins.media-keys.png

Ответить на комментарии

Вот xev вывод:

KeymapNotify event, serial 37, synthetic NO, window 0x0,
    keys:  13  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   16  0   0   0   0   0   0   0   0   0   0   

KeyRelease event, serial 37, synthetic NO, window 0x3a00001,
    root 0x259, subw 0x0, time 802402347, (1900,975), root:(3820,1027),
    state 0x10, keycode 172 (keysym 0x1008ff14, XF86AudioPlay), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Добавление init и изменение порядка не сделали XF86AudioPlay работой, но, с другой стороны, не сломались Contr ol + Alt + P и Control + Alt + O , которые продолжают работать.

Вот что я добавил / изменил в порядке:

    Keybinder.init()
    key = Keybinder  # The module to bind keys
    key.init()  # Call the mainloop something like Gtk.main()

Ответ на комментарий 2

Добавлено:

if not Keybinder.bind("<control><alt>p", A.say, "Bad News 1"):
    print "Keybinder.bind() failed 1."
if not Keybinder.bind("<XF86AudioPlay>", A.say, "Bad News 2"):
    print "Keybinder.bind() failed 2."

Первая клавиатура успешно, но второй выводит на терминал:

Keybinder.bind() failed 2.

1 Ответ

1 голос
/ 15 января 2020

Вопрос : «Keybinder» неправильно связывается с '<XF86AudioPlay>'

  1. В соответствии с документацией, человек должен позвонить Keyboard.init() перед любой другой Keyboard.... функцией.

  2. Путем вычисления возвращаемого значения из функции Keyboard.bind(... человек может проверить, была ли привязка успешной.

    keysym = '<XF86AudioPlay>'
    if not Keybinder.bind(keysym, callback):
        print('bind "{}" failed!'.format(keysym))
    
  3. Согласно выводу xev и GNOME gettings keysym должны быть 'XF86AudioPlay' без скобок.
    Keybinder.bind('XF86AudioPlay', callback)
    

Ссылка :

  • gtk-keybinder-not-response
  • Keybinder.init

    Инициализация библиотеки клавиш. Эта функция должна вызываться после инициализации GTK, перед вызовом любой другой функции в библиотеке. Может быть вызван только один раз.

  • Keybinder.bind

    Возвращает: True если акселератор может быть захвачен
    Возьмите ключ глобальную комбинацию и зарегистрируйте обратный вызов для вызова при каждом нажатии комбинации клавиш.


Протестировано с Python: 3,5 - ги .__ версия__: 3.22.0 - keybinder-3.0, 0.3.2-1

...