Я пытаюсь получить текущее состояние модификаторов клавиатуры через gnome GDK или GTK-библиотеку, чтобы реализовать расширение оболочки gnome доступности, которое показывает это состояние.Получение состояния модификаторов клавиатуры с использованием Gnome libs (GDK) только для исходного состояния
Я знаю, как получить его состояние с помощью xlib, но нет полного связывания для gns gns.
Код ниже получает только начальное состояние. Он не обновляет состояние.
/*
* compiling: gcc `pkg-config --cflags gdk-3.0` -o gdk_mod gdk_mod.c `pkg-config --libs gdk-3.0`
*/
#include <gdk/gdk.h>
int main (int argc, char **argv) {
gdk_init(&argc, &argv);
GdkDisplay * disp;
disp = gdk_display_open(NULL);
if (disp!=NULL) g_printf("display connected!\n");
GdkKeymap * kmap;
kmap = gdk_keymap_get_for_display(disp);
guint state;
state = gdk_keymap_get_modifier_state(kmap);
g_printf("mod state: %x\n", state);
while (1) {
g_usleep(1000000);
//kmap = gdk_keymap_get_for_display(disp);
state = gdk_keymap_get_modifier_state(kmap);
g_printf("mod state: %x\n", state);
}
}
Вот пример вывод с CAPS зафиксировался активными затем неактивные, но никаких изменений:
$ ./gdk_mod
display found!
mod state: 2
mod state: 2
mod state: 2
mod state: 2
mod state: 2
^C
В настоящее время с помощью Kubuntu 15.04.
Что случилось с моим кодом?
Для этого вам, вероятно, понадобится запустить цикл событий GTK +. Попробуйте изменить цикл 'g_usleep()' на [g_timeout_add()] на основе [loop] (https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#G- SOURCE-CONTINUE: CAPS), используя 'gtk_init()' вместо 'gdk_init()' и запуская 'gtk_main()'. – andlabs
@andlabs, вы отлично работаете. Не могли бы вы отправить ответ. Я буду ждать немного дольше, чтобы принять его, потому что я предполагаю, что некоторые функции уровня gdk, вызванные циклом gtk_main', вытягивают/обновляют события из X в очередь событий gdk. Если эти функции существуют, я могу исправить свой исходный код и сохранить его с помощью чистого GDK. –
@andlabs, вы заслуживаете заслуги и репутации ответа. Я написал один для документирования моего решения. Если вы скопируете этот комментарий в качестве ответа, я его приму. –