如何防止窗口在接收X11抓取的密钥时失去焦点



当收到QEvent::FocusOut时,我的窗口调用hide()。同时,如果按下热键,我希望它的可见性可以切换。现在我遇到了以下问题:按下XGrabKex(...)注册的热键似乎会强化我的应用程序的焦点。导致不想要的行为。如果我的应用程序是可见的,则热键事件会强化焦点,这会导致QEvent::FocusOut,它会隐藏我的应用,然后收到热键,它会切换我的应用的可见性(显示)。也就是说,我的应用程序在按下热键时不会隐藏。

有没有一种方法可以告诉x窗口系统,当按下抓取的键时,不要加固焦点?或者这个问题还有其他可能的解决方案吗?

几个不同的方法。

  1. 使用XQueryKeymap查看按下了哪些键。例如,当您得到一个FocusOut事件时,调用XQueryKeymap并查看热键是否被按下。如果不是,则隐藏窗口;如果是,请不要隐藏它并等待热键事件
  2. FocusOut上隐藏延迟100毫秒左右。如果你在这个时间间隔内拿到热键或恢复焦点,请取消隐藏

也可以在这里查看有用的信息。

终于让它以"正确"的方式工作:

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;
}

相关内容

  • 没有找到相关文章

最新更新