X11, отправка события с помощью XSendEvent(3)

Я встроил приложение X11 (xterm) в окно Motif. Кажется, что все работает нормально, но если я нажимаю клавишу, когда указатель не находится над встроенным приложением, он не получает его. Пытаясь это исправить, я изменил основной цикл основного приложения. Теперь это так:

  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 ответ

Ну, для начала вы предполагаете XQueryTree вернет только одно дочернее окно - может быть, оно возвращает более одного, и вы передаете событие не тому?

Я не уверен, что это в то время как цикл вокруг XQueryTree вызов для любого.

Вы также должны звонить XFree освободить список дочерних окон, как только вы закончите с ним, или у вас будет утечка памяти.

Другие вопросы по тегам