After calling XGrabKeyboard()
, my application captures and displays all key presses / releases, including those for the GUI and PrintScreen keys. However, the user is no longer able to move the application's window. So far, this occurs on Fedora 17 and Ubuntu 12.04.
How can I allow the user to move the application while being under the effect of XGrabKeyboard()
?
Below is sample code for my Qt application:
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;
}
Taking the grab statement out of the event handler does not solve the issue. Here is a sample project which illustrates the problem: TestGrab.zip
I have tried this on KDE, FVWM and GNOME (just using Xlib), and only the GNOME window manager has this problem.
I thought it might be possible to fix it by picking up the ConfigureNotify event, but it is not generated when you try to move the window.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With