[help :(]Перехват событий клавиатуры в X-server

Модератор: Модераторы разделов

Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

[help :(]Перехват событий клавиатуры в X-server

Сообщение minoru-kun »

Недавно столкнулся с необходимостью перехвата событий клавиатуры в X (для написания утилиты для работы с мультимедийными клавишами).
На данный момент получать заветные key-коды с помощью XWindowEvent (Xlib) мне удается только после захвата клавиатуры с помощью XKeyboardGrub. Xtrap, к сожалению, работает некорректно (да и не очень-то хочется тащить с собой тащить изменения xorg.conf в качестве зависимостей). Идея подчерпнута из исходных кодов xmacro. Я пробовал гуглить но, к сожалению, не нашел ничего нового. Между тем, заветная возможность как-то реализована в gnome-settings-daemon (alsa-регулятор громкости), но читать его исходники, учитывая великое разнообразие функционала очень тяжело. Каково может быть решение проблемы?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: [help :(]Перехват событий клавиатуры в X-server

Сообщение /dev/random »

UTSL xkbevd
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: [help :(]Перехват событий клавиатуры в X-server

Сообщение minoru-kun »

Расковырял исходники xkbevd, а так же покурил спецификацию The X Keyboard Extension от 1995, примером использования которой, собственно говоря, является xkbevd. Прекрасно поддерживается (и мне удалось заставить работать) перехват таких событий, как:

Код: Выделить всё

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

Сообщение /dev/random »

Мда, похоже xkbevd изменился. Я точно помню, что с дефолтным конфигом он прекрасно перехватывал все клавиши, а теперь на дефолтный конфиг он вообще ругается "Syntax Error".
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: [help :(]Перехват событий клавиатуры в X-server

Сообщение minoru-kun »

...Пока суть да дело, решил присмотреться к 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

Сообщение d_n_k »

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

Сообщение minoru-kun »

Код: Выделить всё

    /*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 с другой программой. ^^ Программистская интуиция начинает мне подсказывать, что если способ и существует, то он противоречит моим религиозным убеждениям, что равноценно случаю, если бы он не существовал и вовсе. С другой стороны, я не могу исключать того, что с самого начала мог двигаться в неправильном направлении. Если это так, то дайте пинка. ^^
Спасибо сказали: