После звонка 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
Я пробовал это на KDE, FVWM и GNOME (только с использованием Xlib), и только оконный менеджер GNOME имеет эту проблему.
Я подумал, что это можно исправить, подняв событие ConfigureNotify, но оно не генерируется при попытке переместить окно.
У меня была похожая проблема с XFCE на Cygwin. Здесь проблема заключалась в недостаточной маске ввода, переданной в XSelectInput. Добавление FocusChangeMask в KeyPressMask | KeyReleaseMask решил проблему.
Еще раз, это помогло мне исправить подобную проблему на xfce / cygwin.