Недавно столкнулся с необходимостью перехвата событий клавиатуры в X (для написания утилиты для работы с мультимедийными клавишами).
На данный момент получать заветные key-коды с помощью XWindowEvent (Xlib) мне удается только после захвата клавиатуры с помощью XKeyboardGrub. Xtrap, к сожалению, работает некорректно (да и не очень-то хочется тащить с собой тащить изменения xorg.conf в качестве зависимостей). Идея подчерпнута из исходных кодов xmacro. Я пробовал гуглить но, к сожалению, не нашел ничего нового. Между тем, заветная возможность как-то реализована в gnome-settings-daemon (alsa-регулятор громкости), но читать его исходники, учитывая великое разнообразие функционала очень тяжело. Каково может быть решение проблемы?
[help :(]Перехват событий клавиатуры в X-server
Модератор: Модераторы разделов
-
minoru-kun
- Сообщения: 621
- ОС: Debian GNU/Linux
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
-
minoru-kun
- Сообщения: 621
- ОС: Debian GNU/Linux
Re: [help :(]Перехват событий клавиатуры в X-server
Расковырял исходники xkbevd, а так же покурил спецификацию The X Keyboard Extension от 1995, примером использования которой, собственно говоря, является xkbevd. Прекрасно поддерживается (и мне удалось заставить работать) перехват таких событий, как:
...получение и редактирование физической информации о клавиатуре, а так же множество аналогичной информации (всего - на 240 страниц). Однако никаких упоминаний о тривиальных keyboard events trapping ни в коде, ни спецификации мне обнаружить совершенно не удалось. Видимо, Extension есть Extension. Insufficient in mediflorians, may be? %_%
Код: Выделить всё
XkbStateNotifyEvent
XkbMapNotifyEvent
XkbControlsNotifyEvent
XkbIndicatorNotifyEvent
XkbBellNotifyEvent # Даже так! o_O
<...>...получение и редактирование физической информации о клавиатуре, а так же множество аналогичной информации (всего - на 240 страниц). Однако никаких упоминаний о тривиальных keyboard events trapping ни в коде, ни спецификации мне обнаружить совершенно не удалось. Видимо, Extension есть Extension. Insufficient in mediflorians, may be? %_%
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: [help :(]Перехват событий клавиатуры в X-server
Мда, похоже xkbevd изменился. Я точно помню, что с дефолтным конфигом он прекрасно перехватывал все клавиши, а теперь на дефолтный конфиг он вообще ругается "Syntax Error".
-
minoru-kun
- Сообщения: 621
- ОС: Debian GNU/Linux
Re: [help :(]Перехват событий клавиатуры в X-server
...Пока суть да дело, решил присмотреться к gdk. Конечно, тащить за своей программой в виде зависимости монстра по имени gdk неприятно, но все же лучше, чем ничего.
Тем не менее, весьма простенький код, направленный на проверку возможностей, по самым непонятным причинам сегфолтится. По всей видимости, где-то в недрах GDK. Из-за чего интуиция не может не подсказывать плохое предчувствие.
Тем не менее, весьма простенький код, направленный на проверку возможностей, по самым непонятным причинам сегфолтится. По всей видимости, где-то в недрах GDK. Из-за чего интуиция не может не подсказывать плохое предчувствие.
Код: Выделить всё
#include <stdio.h>
#include <gdk/gdkx.h>
int main (int argc, char *argv)
{
if ( !gdk_init_check(argc, argv) )
printf ("error initializing GDK\n");
GtkWindow *window = gdk_x11_get_default_root_xwindow(); #вот на этой строчке
}-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: [help :(]Перехват событий клавиатуры в X-server
GtkWindow *window = gdk_x11_get_default_root_xwindow(); #вот на этой строчке
Код: Выделить всё
Window gdk_x11_get_default_root_xwindow (void);найди разницу
зы: почему падает хз )
все сказанное есть имхо...
-
minoru-kun
- Сообщения: 621
- ОС: Debian GNU/Linux
Re: [help :(]Перехват событий клавиатуры в X-server
Код: Выделить всё
/*Codesheet from Awesome 2.3.1 main function*/
if(!(dpy = XOpenDisplay(NULL)))
eprint("cannot open display\n");
<..>
for(screen = 0; screen < ScreenCount(dpy); screen++)
/* this causes an error if some other window manager is running */
XSelectInput(dpy, RootWindow(dpy, screen), SubstructureRedirectMask);Одного поля ягода. Вот невозможно так просто взять и разделить контроль над root window events с другой программой. ^^ Программистская интуиция начинает мне подсказывать, что если способ и существует, то он противоречит моим религиозным убеждениям, что равноценно случаю, если бы он не существовал и вовсе. С другой стороны, я не могу исключать того, что с самого начала мог двигаться в неправильном направлении. Если это так, то дайте пинка. ^^