我创建了一个复合小部件,其中webkit_webview小部件存储在带有gtkvbox基本小部件的滚动窗口中。当任何包含的小部件有焦点时,如何使基本gtkvbox小部件处于焦点?具体来说,我正在尝试添加仅在复合窗口小部件处于焦点时才应处于活动状态的加速器。要确定复合窗口小部件是否在焦点上,我调用gtk_widget_get_focused(),然后遍历窗口小部件父级到填充查找基本窗口小部件。似乎应该有更好的方法。
答案 0 :(得分:1)
一次只有一个窗口小部件可以具有全局输入焦点,这是用户在屏幕上看到的焦点,以及击键出现的位置。如果gtk_widget_has_focus(widget)
返回TRUE
,则widget
具有全局输入焦点。您不能拥有webview,并且vbox同时具有全局输入焦点。
您可以做的是在复合窗口小部件的父窗口上调用gtk_container_get_focus_child()
,如果返回值是复合窗口小部件,则焦点位于复合窗口小部件中。
或者您可以连接到复合小部件上的"focus-in-event"
和"focus-out-event"
信号。我很相信当其中一个包含的小部件获得或失去焦点时,它们会通知您。 (请记住先在小部件上调用gdk_window_set_events(widget->window, gdk_window_get_events(widget->window) | GDK_FOCUS_CHANGE_MASK)
,如GTK文档中所述。)