Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GTK和x2B的GTKDrawinga区域截获X11按键事件;3在Linux上_Gtk_X11_Gtk3 - Fatal编程技术网

在GTK和x2B的GTKDrawinga区域截获X11按键事件;3在Linux上

在GTK和x2B的GTKDrawinga区域截获X11按键事件;3在Linux上,gtk,x11,gtk3,Gtk,X11,Gtk3,GTK+版本:3.18.9 我用以下代码创建了一个绘图区域(GtkWidget content = gtk_drawing_area_new(); gtk_widget_set_can_focus(content, TRUE); gtk_widget_add_events(content, GDK_ALL_EVENTS_MASK); g_signal_connect(content, "draw", G_CALLBACK(&drawCallback), ctx); gtk_widget_

GTK+版本:3.18.9

我用以下代码创建了一个绘图区域(GtkWidget

content = gtk_drawing_area_new();
gtk_widget_set_can_focus(content, TRUE);
gtk_widget_add_events(content, GDK_ALL_EVENTS_MASK);
g_signal_connect(content, "draw", G_CALLBACK(&drawCallback), ctx);
gtk_widget_realize(content);

// Add a filter for interception
gdk_window_add_filter(content, gtk_widget_get_window(content),
  OnXEvent, NULL);
问题是,当我单击wideget时,我得到了如下XEvents序列:

LeaveNotify
FocusIn
EnterNotify
ButtonPress
FocusOut    // Lost focus!
ButtonRelease
上面的FocusOut表明我们在单击后立即失去了焦点。 这意味着我们无法接收任何键盘事件,因为它们仅在焦点中可用

这是GTK的限制吗?如果没有,是否有任何工具/方法来确定哪个小部件/窗口触发焦点输出

参考资料:


从GTK+3.18.9版开始,它对顶级窗口使用额外的X窗口,任何键盘事件都由该窗口捕获。因此,需要将过滤器添加为全局过滤器,即

gdk\u窗口\u添加\u过滤器(NULL,OnXEvent,NULL)


请注意,在GTK+4.x中删除了API。

那么,FocusOut事件的
详细信息
字段的值是多少?另外,您是否可以在此处打印所有事件的
窗口
字段,以查看是否所有这些事件都发送到同一窗口?您能否解释一下您是如何实现
OnXEvent
功能的。我正在尝试有条件地将左/右箭头键按转换为SHOT+TAB/TAB。即使我完全填充了GdkEvent联合,我在运行时得到的只是以下警告。“Gdk警告**:13:16:43.246:类型为8的事件未持有Gdk设备。它很可能是在Gdk/GTK+之外合成的。”