LINUX.ORG.RU

Как правильно сделать глобальные хоткеи?


0

0

пишу на Python + PyQt4, необходимо сделать хоткеи, которые работали бы даже когда приложение свёрнуто в трей (т.е. ниодно из его окон не в фокусе).

пока что додумался взять python-xlib и сделать такое:
from Xlib.display import Display
disp = Display()
root = disp.screen().root
root.change_attributes(event_mask = X.KeyPressMask)
и дальше для каждой кнопки такое:
root.grab_key(keycode, X.Mod4Mask, True, X.GrabModeAsync, X.GrabModeAsync)

хоткеи при этом назначаются, но если включить Num Lock, они перестают работать.
решил выполнением вот этого для каждой кнопки:
root.grab_key(keycode, X.Mod4Mask | 1<<4, True, X.GrabModeAsync, X.GrabModeAsync)
внимание на второй аргумент: | 1<<4 - подобрано случайным образом.

после этого хоткеи работают и при включеном Num Lock, но при запуске программы получаю много ошибок такого вида:
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 316, sequence_number = 11, major_opcode = 33, minor_opcode = 0

расскажите как правильно такое делается.


Я, конечно, не знаю, как это принято у вас, в кде.

Но вообще такими вещами должен заниматься WM, а не прикладные приложения.

Davidov ★★★★
()
Ответ на: комментарий от anotheranonymous

Вообще-то он прав. Ключевая фраза тут:
> ниодно из его окон не в фокусе

Пока окно не в фокусе, оно никаких сообщений от иксов не получит.

LamerOk ★★★★★
()

Не надо только реализовывать это в приложении. Вот правильное решение:

man rhythmbox-client

rhythmbox-client - controls a running instance of rhythmbox

rhythmbox-client  is a tool for controlling an already running instance of rhythmbox.  It’s useful for remote control scripting or printing details of what’s playing.

OPTIONS
       -?,--help
              Show help options

       --debug
              Enable debug output

       --no-start
              Do not start a new instance of rhythmbox

       --quit Quit rhythmbox

       --no-present
              Don’t present an existing rhythmbox window

       --hide Hide the rhythmbox window

       --next Jump to next song

       --previous

a3
()
Ответ на: комментарий от Begemoth

Можно, но нужно явно подписываться на каждый эвент. Способа подписаться на все эвенты сразу я не знаю.

Учитывая, что топикстаретр "пишет на Python + PyQt4", жопой чую, ему совсем не это нужно.

LamerOk ★★★★★
()
Ответ на: комментарий от a3

> Вот правильное решение:

Ога ога. И в системе под нагрузкой от нажатия хоткея до реакции пройдёт пару секунд. Лично мне не надо вот таких "правильных решений".

Товарищи любители пихать свой "йунегз-вей" куда только можно - вы вообще представляете себе примерно процесс запуска бинарника? Вы своим мозгом способны понять, что в подобных случаях на запуск бинарника будет затрачено раз 20 больше ресурсов, тем на собственно выполнение полезного действия?

Правильное решение, блин...

P.S. Извиняюсь за излишние содержание злости в этом посте.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.