【发布时间】:2011-10-01 01:48:18
【问题描述】:
在我的 Xlib 应用程序中,我需要将键盘设置为专注于特定组件,我想用XSetInputFocus 来做。出于某种原因,即使我的窗口是可见的,我总是会收到 BadMatch 错误(并且手册页说导致此错误的原因是一个不可见/映射的窗口)。当我说它可见时,我的意思是我可以在屏幕上看到它,并且我知道请求列表已经被刷新。
因此,我没有分享我庞大的代码,而是在互联网上找到了一个较小的演示并尝试对其进行修改。我采用了 Xlib 中的事件处理代码,如我发现的 example 中的 Xlib programming tutorial 所示。我尝试添加以下行:
XSetInputFocus (display, win, RevertToNone, CurrentTime);
就在行前
/* perform an events loop */
我得到的错误是:
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 42 (X_SetInputFocus)
Serial number of failed request: 12
Current serial number in output stream: 12
这与我在自己的应用程序中遇到的错误完全相同,事件序列完全相同:
- 使用
XCreateSimpleWindow创建一个窗口(应该是InputOutput窗口) - 使用
XSelectInput并在掩码中选择也可以得到KeyPressMask) - 映射窗口 (
XMapWindow) - 使用
XSetInputFocus或RevertToNone或RevertToParent请求焦点(均失败)
我怀疑这与我需要使用XNextEvent 处理窗口创建事件这一事实有关,直到我完成对窗口的重新父级处理,但在那种情况下,我不知道什么时候我应该等待(在尝试此之前我应该收到哪些事件?)。在我的程序中第一次调用 XNextEvent 之前,我目前正在这样做。
任何帮助都会受到高度评价。提前致谢!
【问题讨论】: