使用 Gnome 库 (GDK) 获取键盘修饰符状态仅获取初始状态

2023-12-14

我正在尝试通过 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。

我的代码有什么问题吗?


您需要运行 GTK+ 事件循环才能使其工作。事件循环是 GLib 的一部分主循环。你打电话时gtk_main(),这个主循环就运行了。我不知道它是否轮询事件或将事件推送给它,但它不会像您试图做的那样即时询问键盘状态。

设置 GDK 最简单的方法是通过 GTK+ 使用gtk_init() and gtk_main()。你可以单独使用GDK,但我不知道如何使用。你似乎已经明白了,这很有效。

而不是打电话g_usleep(),它只会阻塞您的程序,您可以将定期超时挂接到主循环中。这是用完成的g_timeout_add()。您传递给的函数g_timeout_add()返回一个布尔值,决定计时器是否应该停止,因此您不必担心重新安排您的函数,因为 GLib 会为您做这件事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Gnome 库 (GDK) 获取键盘修饰符状态仅获取初始状态 的相关文章

随机推荐