我正在尝试通过gnome GDK或GTK库来获取当前的键盘修饰符,目的是实现显示该状态的可访问性gnome shell扩展。
我知道如何使用xlib获得状态,但gnome gjs没有完全绑定。
以下代码仅获取初始状态。它不会更新状态。
/*
* 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。
我的代码出了什么问题?
答案 0 :(得分:2)
您需要运行GTK +事件循环才能生效。事件循环是GLib的主循环的一部分。当您调用gtk_main()
时,将运行此主循环。我不知道它是否针对事件进行了民意调查或是否有事件被推送到它,但它不会像你想要的那样在飞行中询问键盘状态。
设置GDK的最简单方法是使用gtk_init()
和gtk_main()
通过GTK +进行设置。您可以单独使用GDK,但我不知道如何使用。你好像已经弄明白了,哪个有效。
而不是调用只阻止程序的g_usleep()
,你可以将定期超时挂钩到主循环中。这是通过g_timeout_add()
完成的。传递给g_timeout_add()
的函数返回一个布尔值,该值决定是否应该停止计时器,因此您不必担心重新安排函数,因为GLib会为您执行此操作。< / p>
答案 1 :(得分:1)
事实上,正如andlabs在评论中所说,我需要一个事件循环。他建议使用GTK gtk_init()
&amp; gtk_main()
效果很好。
/*
* compiling: gcc `pkg-config --cflags gtk+-3.0` -o gtk_xkbmod3 gtk_xkbmod3.c `pkg-config --libs gtk+-3.0`
*/
#include <gtk/gtk.h>
static void update(GdkKeymap * kmap) {
guint state;
state = gdk_keymap_get_modifier_state(kmap);
g_printf("%i\n", state);
}
int main (int argc, char **argv) {
gtk_init(&argc, &argv);
GdkKeymap * kmap;
kmap = gdk_keymap_get_default();
g_timeout_add_seconds(1, (GSourceFunc) update, kmap);
gtk_main();
}
我也可以将GDK与GLib GMainLoop一起使用。
/*
* compiling: gcc `pkg-config --cflags gdk-3.0` -o gdk_xkbmod4 gdk_xkbmod4.c `pkg-config --libs gdk-3.0`
*/
#include <gdk/gdk.h>
GMainLoop *mainloop;
static void update(GdkKeymap * kmap) {
guint state;
state = gdk_keymap_get_modifier_state(kmap);
g_printf("%i\n", state);
}
int main (int argc, char **argv) {
gdk_init(&argc, &argv);
GdkKeymap * kmap;
kmap = gdk_keymap_get_default();
g_timeout_add_seconds(1, (GSourceFunc) update, kmap);
mainloop = g_main_loop_new(g_main_context_default(), FALSE);
g_main_loop_run(mainloop);
}
<强>参考文献:强>