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
освободить список дочерних окон, как только вы закончите с ним, или у вас будет утечка памяти.