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时,得到的XEvent序列如下:
LeaveNotify
FocusIn
EnterNotify
ButtonPress
FocusOut // Lost focus!
ButtonRelease
在 FocusOut 上方,我们单击后立即失去了焦点。 这意味着我们无法接收任何键盘事件,因为它们仅在焦点范围内可用。
这是GTK的限制吗?如果没有,是否有任何工具/方法可以找出哪个小部件/寡妇触发了FocusOut?
参考文献:
答案 0 :(得分:0)
从GTK +版本3.18.9开始,它为顶层窗口使用了一个额外的X窗口,并且该窗口捕获了所有键盘事件。因此,需要添加一个过滤器作为全局过滤器,即
gdk_window_add_filter(NULL, OnXEvent, NULL)
请注意,该API已在GTK + 4.x的this commit中删除。