gpt4 book ai didi

c - 使用 Gnome 库 (GDK) 获取键盘修改器状态仅获取初始状态

转载 作者:行者123 更新时间:2023-12-01 12:33:01 26 4
gpt4 key购买 nike

我正在尝试通过 gnome GDK 或 GTK 库获取当前的键盘修改器状态,目的是实现一个显示该状态的可访问性 gnome shell 扩展。

我知道如何使用 xlib 获取它们的状态,但是没有针对 gnome gjs 的完全绑定(bind)。

下面的代码只获取初始状态。它不更新状态。

/*
* 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+ 事件循环才能使其工作。事件循环是 GLib 的主循环的一部分。当您调用 gtk_main() 时,将运行此主循环。我不知道它是轮询事件还是将事件推送给它,但它不会像您尝试的那样即时询问键盘状态。

设置 GDK 的最简单方法是通过 GTK+ 使用 gtk_init()gtk_main() 来完成。您可以单独使用 GDK,但我不知道如何使用。您似乎已经弄明白了,这行得通。

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

关于c - 使用 Gnome 库 (GDK) 获取键盘修改器状态仅获取初始状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31826035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com