X11,用XSendEvent发送事件(3)

时间:2011-06-20 12:38:46

标签: c linux x11 xterm motif

我在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

1 个答案:

答案 0 :(得分:1)

首先,你假设XQueryTree只会返回一个子窗口 - 也许它会返回多个并且你将事件传递给错误的窗口?

我不确定XQueryTree调用的while循环是什么。

完成后,您还应该调用XFree释放子窗口列表,否则您将泄漏内存。