我在一个Motif窗口中嵌入了一个X11应用程序(xterm)。一切似乎都很正常,但如果我在指针不在嵌入式应用程序上方时按下一个键,它就不会得到它。为了解决这个问题,我更改了主应用程序的主循环。现在是这样的:
XEvent ev;
for (;;)
{
XtAppNextEvent (app, &ev);
/* If the event is a keypress, send it to
* the xterm window. Else, dispatch it.
*/
Window *xtW = NULL, parent, _root;
unsigned int noC;
if (ev.type == KeyPress || ev.type == KeyRelease)
{
#ifdef DEBUG
fprintf (stderr, "Key event\n");
#endif
while (xtW == NULL)
XQueryTree (XtDisplay (drawW), XtWindow (drawW), &_root,
&parent, &xtW, &noC);
XSendEvent (XtDisplay (drawW), *xtW, True,
(KeyPressMask | KeyReleaseMask), &ev);
XFlush (XtDisplay (drawW));
#ifdef DEBUG
fprintf (stderr, "sent key event\n");
#endif
}
else
XtDispatchEvent (&ev);
}当我在嵌入式xterm外部按下一个键时,正在打印调试行,但是xterm没有打印我发送的键。
我该如何解决这个问题呢?如果需要,我会发布代码。
--mghis
发布于 2011-06-20 20:51:56
首先,你假设XQueryTree只返回一个子窗口--也许它返回了多个子窗口,而你把事件传递给了错误的子窗口?
我也不确定围绕XQueryTree调用的while循环是为了什么。
一旦完成子窗口列表,您还应该调用XFree来释放它,否则将会泄漏内存。
https://stackoverflow.com/questions/6411259
复制相似问题