【发布时间】:2011-06-20 12:38:45
【问题描述】:
我在 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
【问题讨论】:
-
您至少应该将
ev.Window设置为正确的值。 -
Gcc 说 ev 没有成员窗口(也没有窗口)。如果您的意思是
ev.xkey.window,我尝试使用ev.xkey.window = *xtW;,但应用仍然无法获取密钥。 -
是的,ev 实际上是一个联合,它没有
window成员,但所有联合成员都有。所以你对ev.xkey.window语法是正确的。您还应该专门启用xterm以接受使用XSendEvent发送的事件,方法是将其allowSendEvents资源设置为True。 -
非常感谢! 它有效! 设置该资源就可以了! 非常感谢!