簡體   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