Sam*_*hik 2 x11 user-interface focus
为了获得一些乐趣和自我教育,我正在尝试编写自己的X11工具包。这让我很沮丧。
我有一个传统的组合框显示元素,一个有下拉菜单的典型组合框,就像所有流行的工具包一样。
对于下拉弹出列表,我创建了一个新窗口,它是根窗口的子窗口,适当地位于主组合框显示元素下方。
下拉弹出列表是一个单独的窗口,该窗口实现了基于键盘的导航,以选择下拉列表中的各个条目。
因此,我使用SetInputFocus将输入焦点设置为打开后的弹出窗口。
我发现,执行此操作后,窗口管理器将重新绘制主窗口的框架,以指示其不再具有输入焦点。从技术上讲,这是正确的,但是在主流工具包中我看不到相同的结果,在可比较的情况下,主窗口的框架显示它仍然具有输入焦点。
对于弹出窗口,除了设置覆盖重定向之外,我还想尽一切办法告诉窗口管理器发生了什么:在弹出窗口的WM_HINTS中设置窗口组领导者ID,设置WM_TRANSIENT_FOR,并将_NET_WM_WINDOW_TYPE设置为_NET_WM_WINDOW_TYPE_COMBO; 所有这些似乎都不起作用(我验证了通过xprop正确设置了属性)。
看来我必须将输入焦点保持在组合框窗口中,并将按键和按键释放事件转发到下拉弹出窗口中的显示元素,这感觉很笨拙。我是否在忽略某个属性,该属性会告诉窗口管理器弹出窗口的输入焦点已链接到主窗口的窗口(除了我提到的那些窗口之外),因此可以保持绘制主窗口的框架以显示其具有输入焦点。输入焦点实际上在弹出窗口中?
大多数X11覆盖重定向独占弹出式窗口(菜单,组合框等)都可以通过被动或主动方式来抓住键盘和/或指针。
见XGrabKey,XGrabKeyboard,XGrabButton,XGrabPointer在X11编程手册。
也许不是,因为手册完全不清楚这些功能的含义以及如何使用它们。在互联网上搜索用法示例,可能在其他窗口小部件库中。不幸的是,我不知道有一个简单的有用的例子。
完全没有必要进行调用XSetInputFocus,因为所有键盘和/或指针事件都已报告给捕获的客户端。