X11, отправка события с помощью XSendEvent (3) - PullRequest
2 голосов
/ 20 июня 2011

Я встроил приложение 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 Ответ

1 голос
/ 20 июня 2011

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

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

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

...