X11:弹出窗口的输入焦点

时间:2014-08-15 01:53:37

标签: user-interface focus x11

对于一些有趣和自我教育,我正在修改自己编写的X11工具包。这是让我感到难过的东西。

我有一个传统的组合框显示元素,一个带有下拉弹出列表的典型组合框,就像所有流行的工具包一样。

对于下拉弹出列表,我创建了一个新窗口,一个根窗口的子窗口,正确位于主组合框显示元素下面。

下拉弹出列表是一个完全正确的窗口,它实现了基于键盘的导航,以便在下拉列表中选择各个条目。

所以,我使用SetInputFocus在打开后将输入焦点设置为弹出窗口。

我发现当我这样做时,窗口管理器然后重新绘制主窗口的框架以指示它不再具有输入焦点。这在技术上是正确的,但是我没有看到与更主流的工具包相同的结果,在可比的情况下,主窗口的框架显示它仍然具有输入焦点。

对于弹出窗口,除了设置覆盖重定向之外,我还会做我能想到的一切,告诉窗口管理器发生了什么:设置窗口组领导者ID在弹出窗口的WM_HINTS中,设置WM_TRANSIENT_FOR,并将_NET_WM_WINDOW_TYPE设置为_NET_WM_WINDOW_TYPE_COMBO;这似乎都没有用(我通过xprop验证了属性是合理设置的。)

似乎我必须将输入焦点保持在组合框窗口中,并将按键和键释放事件转发到下拉弹出窗口中的显示元素,这感觉很笨拙。我是否会忽略一些属性,告诉窗口管理器弹出窗口的输入焦点是与主窗口(除了我提到的那些)之外的链接,这将保留主窗口&# 39;绘制的框架显示它有输入焦点,当输入焦点实际上在弹出窗口中时?

1 个答案:

答案 0 :(得分:4)

大多数X11覆盖 - 重定向独占弹出窗口(菜单,组合框,......)通过被动或主动抓取来抓取键盘和/或指针。

请参阅X11编程手册中的XGrabKeyXGrabKeyboardXGrabButtonXGrabPointer

或者也许没有,因为手册完全不清楚这些功能是什么以及如何使用它们。在interwebs中搜索用法示例,可能在其他小部件库中。不幸的是,我不知道一个简单的信息示例。

根本不需要调用XSetInputFocus,因为所有键盘和/或指针事件都会报告给抓取的客户端。