2

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

4

1 に答える 1

1

まず、子ウィンドウが1つだけ返されると想定しています。XQueryTreeおそらく、複数のウィンドウが返され、イベントが間違ったウィンドウに渡されているのでしょうか。

XQueryTreeどちらの場合も、呼び出しのwhileループが何であるかはわかりません。

XFreeまた、子ウィンドウリストを使い終わったら、それを解放するように呼び出す必要があります。そうしないと、メモリリークが発生します。

于 2011-06-20T12:51:55.880 に答える