c — x11 — Невозможно переместить окно после XGrabKeyboard

После звонка XGrabKeyboard(), мое приложение захватывает и отображает все нажатия / отпускание клавиш, в том числе для клавиш GUI и PrintScreen. Однако пользователь больше не может перемещать окно приложения. Пока что это происходит на Fedora 17 и Ubuntu 12.04.

Как я могу позволить пользователю перемещать приложение, находясь под XGrabKeyboard()?

Ниже приведен пример кода для моего приложения Qt:

bool KeyboardStatus::x11Event(XEvent *event) {
switch (event->type) {
case FocusIn:
XGrabKeyboard(x11Info().display(), winId(), false, GrabModeAsync, GrabModeAsync, CurrentTime);
break;

case FocusOut:
XUngrabKeyboard(x11Info().display(), CurrentTime);
break;

case KeyPress:
// Display which key was pressed to user
return true;

case KeyRelease:
// Display which key was released to user
return true;
}

return false;
}

Удаление оператора захвата из обработчика событий не решает проблему. Вот пример проекта, который иллюстрирует проблему: TestGrab.zip

5

Решение

Я пробовал это на KDE, FVWM и GNOME (только с использованием Xlib), и только оконный менеджер GNOME имеет эту проблему.

Я подумал, что это можно исправить, подняв событие ConfigureNotify, но оно не генерируется при попытке переместить окно.

1

Другие решения

У меня была похожая проблема с XFCE на Cygwin. Здесь проблема заключалась в недостаточной маске ввода, переданной в XSelectInput. Добавление FocusChangeMask в KeyPressMask | KeyReleaseMask решил проблему.

Еще раз, это помогло мне исправить подобную проблему на xfce / cygwin.

1

По вопросам рекламы [email protected]