x11 - XGrabKeyboard后无法移动窗口

6
在调用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;
}

将“grab”语句从事件处理程序中拿出并不能解决问题。以下是一个样例项目,说明了这个问题:TestGrab.zip

1
我尝试了一个简单的示例,只是创建一个X11窗口,然后抓取键盘,似乎可以很好地移动窗口。我查看了“XGrabKeyboard”的文档,它说它会生成一个“FocusIn”事件,但是看起来你正在“FocusIn”事件中调用“XGrabKeyboard”。你可能陷入了“FocusIn”事件的无限循环中,因此“窗口抓取”未被处理,或许?尝试在“FocusIn”事件上打印一些东西。 - Jengerer
1
键盘状态是您的主要应用程序类吗? - parkydr
1
我已经设置了相同的东西,但在Debian测试版上可以移动窗口。 - parkydr
1
Qwidget有处理焦点、按键和抓取键盘的方法。也许那些方法会更好用。 - parkydr
1
你使用哪个窗口管理器?我将x11Event更改为始终返回true,以便所有事件都被丢弃。虽然窗口中没有任何工作,但我可以移动它,因为这是由窗口管理器而不是应用程序完成的。 - parkydr
显示剩余13条评论
2个回答

2
我已经在KDE、FVWM和GNOME(只使用Xlib)上尝试过这个问题,只有GNOME窗口管理器会出现这个问题。
我认为通过捕获ConfigureNotify事件可能可以修复它,但当你尝试移动窗口时,该事件不会被生成。

2

我在Cygwin上使用XFCE时遇到了类似的问题。问题在于向XSelectInput传递的输入掩码不足。将FocusChangeMask添加到KeyPressMask | KeyReleaseMask中即可解决问题。

再次感谢这个方法,它帮助我解决了xfce/cygwin上的类似问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接