【发布时间】:2015-08-05 07:28:40
【问题描述】:
我正在尝试通过 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。
我的代码有什么问题?
【问题讨论】:
-
您可能需要运行 GTK+ 事件循环才能使其工作。尝试将
g_usleep()循环更改为基于g_timeout_add()的loop,使用gtk_init()而不是gdk_init(),并运行gtk_main()。 -
@andlabs ,您的方法非常有效。您能否发布一个答案。我会再等一会儿来接受它,因为我想
gtk_main循环调用了一些gdk级别的函数来将事件从X 拉/更新到gdk 事件队列。如果这些函数存在,我可以修复我的原始代码并使用纯 GDK 保留它。 -
@andlabs ,您应该得到答案的荣誉和声誉。我写了一个只是为了记录我的解决方案。如果您复制该评论作为答案,我会接受。
-
啊,我本来打算研究如何单独使用 GDK,但你自己想通了,所以我想这行得通。
标签: c gtk gnome gdk gnome-shell-extensions