繁体   English   中英

从X11接收到抓取的钥匙时,如何防止窗口失去焦点

[英]How to prevent window from loosing focus when receiving a grabbed key from X11

当收到QEvent::FocusOut时,我的窗口调用hide() 同时,如果要按下热键,我希望切换其可见性。 现在,我XGrabKex(...)了以下问题:按下向XGrabKex(...)注册的热键似乎可以使我的应用程序更加专注。 导致不必要的行为。 如果可见我的应用程序,则hotkeyevent会突出显示焦点,这将导致QEvent::FocusOut ,隐藏我的应用程序,然后接收到热键,以切换(显示)我的应用程序的可见性。 即按快捷键时我的应用程序不会隐藏。

有没有一种方法可以告诉x窗口系统在按下抓取的键时不要强化焦点? 还是对此问题有其他可能的解决方案?

几种不同的方法。

  1. 使用XQueryKeymap查看按下了哪些键。 例如,当您收到一个FocusOut事件时,调用XQueryKeymap并查看是否按下了您的热键。 如果不是,请隐藏窗口;否则,请关闭窗口。 如果是这样,请不要将其隐藏并等待热键事件。
  2. 将隐藏在FocusOut上的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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM