如何防止窗口在从X11接收到抓取的键时失去焦点

时间:2014-10-21 14:28:06

标签: qt5 x11 xlib

收到hide()时,我的窗口会调用QEvent::FocusOut。同时,如果按下热键,我希望切换其可见性。现在我遇到以下问题:按下XGrabKex(...)注册的热键似乎是我的应用程序的焦点。导致不必要的行为。如果我的应用程序是可见的,那么hotkeyevent钢会聚焦,这会导致QEvent::FocusOut隐藏我的应用程序,然后收到热键,切换可见性(显示)我的应用程序。即按热键时我的应用程序不会隐藏。

有没有办法告诉x窗口系统在按下抓取的按键时不加焦?或者还有其他可能解决这个问题的方法吗?

2 个答案:

答案 0 :(得分:0)

有两种不同的方法。

  1. 使用XQueryKeymap查看按下了哪些键。例如,当您收到FocusOut事件时,请致电XQueryKeymap并查看是否按下了热键。如果不是,请隐藏窗口;如果是的话,不要隐藏它并等待热键事件。
  2. 延迟隐藏在FocusOut上100个左右。如果您在此时间间隔内获得热键或重新获得焦点,请取消隐藏。
  3. 另请参阅here了解有用信息。

答案 1 :(得分:0)

最后让它以“正确”的方式工作:

bool MainWidget::nativeEvent(const QByteArray &eventType, void *message, long *)
{
#ifdef Q_OS_LINUX
    if (eventType == "xcb_generic_event_t")
    {
        xcb_generic_event_t* event = static_cast<xcb_generic_event_t *>(message);
        switch (event->response_type & 127)
        {
        case XCB_FOCUS_OUT: {
            xcb_focus_out_event_t *fe = (xcb_focus_out_event_t *)event;
            if ((fe->mode==XCB_NOTIFY_MODE_GRAB && fe->detail==XCB_NOTIFY_DETAIL_NONLINEAR)
                    || (fe->mode==XCB_NOTIFY_MODE_NORMAL && fe->detail==XCB_NOTIFY_DETAIL_NONLINEAR ))
                hide();
            break;
        }
        }
    }
#endif
return false;
}