使用 Gnome 库 (GDK) 获取键盘修改器状态仅获取初始状态
Getting keyboard modifiers state using Gnome libs (GDK) fetches initial state only
我正在尝试通过 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);
}
}
这里是一个示例输出,其中大写锁定处于活动状态然后处于非活动状态但没有变化:
$ ./gdk_mod
display found!
mod state: 2
mod state: 2
mod state: 2
mod state: 2
mod state: 2
^C
目前正在使用 Kubuntu 15.04。
我的代码有什么问题?
确实,我需要一个事件循环,正如 andlabs 在他的评论中所说的那样。他关于使用 GTK gtk_init()
& 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);
}
参考文献:
您将需要 运行 GTK+ 事件循环才能工作。事件循环是 GLib 的 主循环 的一部分。当你调用 gtk_main()
时,这个主循环是 运行。我不知道它是轮询事件还是将事件推送给它,但它不会像您尝试的那样即时询问键盘状态。
设置 GDK 的最简单方法是使用 gtk_init()
和 gtk_main()
通过 GTK+ 进行设置。您可以单独使用 GDK,但我不知道如何使用。你似乎已经想通了,这行得通。
而不是调用 g_usleep()
,这只会阻止您的程序,您可以将周期性超时挂接到主循环中。这是用 g_timeout_add()
完成的。您传递给 g_timeout_add()
returns 一个布尔值的函数,该值决定是否应停止计时器,因此您不必担心重新安排您的函数,因为 GLib 会为您完成.
我正在尝试通过 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);
}
}
这里是一个示例输出,其中大写锁定处于活动状态然后处于非活动状态但没有变化:
$ ./gdk_mod
display found!
mod state: 2
mod state: 2
mod state: 2
mod state: 2
mod state: 2
^C
目前正在使用 Kubuntu 15.04。
我的代码有什么问题?
确实,我需要一个事件循环,正如 andlabs 在他的评论中所说的那样。他关于使用 GTK
gtk_init()
>k_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); }
参考文献:
您将需要 运行 GTK+ 事件循环才能工作。事件循环是 GLib 的 主循环 的一部分。当你调用 gtk_main()
时,这个主循环是 运行。我不知道它是轮询事件还是将事件推送给它,但它不会像您尝试的那样即时询问键盘状态。
设置 GDK 的最简单方法是使用 gtk_init()
和 gtk_main()
通过 GTK+ 进行设置。您可以单独使用 GDK,但我不知道如何使用。你似乎已经想通了,这行得通。
而不是调用 g_usleep()
,这只会阻止您的程序,您可以将周期性超时挂接到主循环中。这是用 g_timeout_add()
完成的。您传递给 g_timeout_add()
returns 一个布尔值的函数,该值决定是否应停止计时器,因此您不必担心重新安排您的函数,因为 GLib 会为您完成.