From 06ada3be52ddbd44ae18dbb733a33eb178b11f3a Mon Sep 17 00:00:00 2001 From: weizhixiang Date: Thu, 2 Jun 2022 14:20:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=20=E4=BF=AE=E5=A4=8D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=8F=E5=BA=94=E7=94=A8=E9=9C=80=E8=A6=81=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E4=B8=A4=E6=AC=A1=E6=89=8D=E8=83=BDactive=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复任务栏应用需要点击两次才能active的问题 Log: Task: https://pms.uniontech.com/task-view-142531.html Influence: 任务栏应用一次点击就可以打开 Change-Id: I792202025a155a21ad7133887c17289b9a653c6f --- src/lib/xcbutils.cpp | 9 ++++++++- src/lib/xcbutils.h | 7 +++++-- src/modules/dock/dock.cpp | 13 +++++++++++++ src/modules/dock/x11manager.cpp | 10 +++++++--- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/lib/xcbutils.cpp b/src/lib/xcbutils.cpp index 0dfbe64..9122f51 100644 --- a/src/lib/xcbutils.cpp +++ b/src/lib/xcbutils.cpp @@ -170,7 +170,9 @@ void XCBUtils::setActiveWindow(XWindow xid) void XCBUtils::changeActiveWindow(XWindow newActiveXid) { - xcb_ewmh_request_change_active_window(&m_ewmh, m_screenNum, newActiveXid, XCB_EWMH_CLIENT_SOURCE_TYPE_OTHER, 0, 0); + xcb_ewmh_request_change_active_window(&m_ewmh, m_screenNum, newActiveXid, XCB_EWMH_CLIENT_SOURCE_TYPE_OTHER, XCB_CURRENT_TIME, XCB_WINDOW_NONE); + // 此处getActiveWindow作用是触发缓冲机制,执行设置活动窗口动作 + getActiveWindow(); } void XCBUtils::restackWindow(XWindow xid) @@ -370,6 +372,11 @@ void XCBUtils::setCurrentWMDesktop(uint32_t desktop) xcb_ewmh_set_current_desktop(&m_ewmh, m_screenNum, desktop); } +void XCBUtils::changeCurrentDesktop(uint32_t newDesktop, uint32_t timestamp) +{ + xcb_ewmh_request_change_current_desktop(&m_ewmh, m_screenNum, newDesktop, timestamp); +} + uint32_t XCBUtils::getCurrentWMDesktop() { uint32_t ret; diff --git a/src/lib/xcbutils.h b/src/lib/xcbutils.h index e120471..be0adbc 100644 --- a/src/lib/xcbutils.h +++ b/src/lib/xcbutils.h @@ -135,7 +135,7 @@ public: // 获取活动窗口 _NET_ACTIVE_WINDOW XWindow getActiveWindow(); - // 设置活动窗口 _NET_ACTIVE_WINDOW + // 设置活动窗口 _NET_ACTIVE_WINDOW 属性 void setActiveWindow(XWindow xid); // 改变活动窗口 @@ -221,9 +221,12 @@ public: // 设置窗口当前桌面 void setWMDesktop(XWindow xid, uint32_t desktop); - // 设置桌面 + // 设置当前桌面属性 void setCurrentWMDesktop(uint32_t desktop); + // 请求改变当前桌面 + void changeCurrentDesktop(uint32_t newDesktop, uint32_t timestamp); + // 获取当前桌面 _NET_CURRENT_DESKTOP uint32_t getCurrentWMDesktop(); diff --git a/src/modules/dock/dock.cpp b/src/modules/dock/dock.cpp index 43fe96c..21ee13f 100644 --- a/src/modules/dock/dock.cpp +++ b/src/modules/dock/dock.cpp @@ -86,6 +86,7 @@ Dock::Dock(QObject *parent) connect(x11Manager, &X11Manager::requestUpdateHideState, this, &Dock::updateHideState); connect(x11Manager, &X11Manager::requestAttachOrDetachWindow, this, &Dock::attachOrDetachWindow); } + Q_EMIT serviceRestarted(); } @@ -395,6 +396,18 @@ WindowInfoBase *Dock::getActiveWindow() void Dock::doActiveWindow(XWindow xid) { + // 修改当前工作区为指定窗口的工作区 + XWindow winWorkspace = XCB->getWMDesktop(xid); + XWindow currentWorkspace = XCB->getCurrentWMDesktop(); + if (winWorkspace != currentWorkspace) { + qInfo() << "doActiveWindow: change currentWorkspace " << currentWorkspace << " to winWorkspace " << winWorkspace; + + // 获取窗口时间 + uint32_t timestamp = XCB->getWMUserTime(xid); + // 修改当前桌面工作区 + XCB->changeCurrentDesktop(winWorkspace, timestamp); + } + XCB->changeActiveWindow(xid); QTimer::singleShot(50, [&] { XCB->restackWindow(xid); diff --git a/src/modules/dock/x11manager.cpp b/src/modules/dock/x11manager.cpp index 6e62364..6b05714 100644 --- a/src/modules/dock/x11manager.cpp +++ b/src/modules/dock/x11manager.cpp @@ -272,12 +272,16 @@ void X11Manager::listenWindowXEvent(WindowInfoX *winInfo) void X11Manager::handleRootWindowPropertyNotifyEvent(XCBAtom atom) { - if (atom == XCB->getAtom("_NET_CLIENT_LIST")) + if (atom == XCB->getAtom("_NET_CLIENT_LIST")) { + // 窗口列表改变 handleClientListChanged(); - else if (atom == XCB->getAtom("_NET_ACTIVE_WINDOW")) + } else if (atom == XCB->getAtom("_NET_ACTIVE_WINDOW")) { + // 活动窗口改变 handleActiveWindowChangedX(); - else if (atom == XCB->getAtom("_NET_SHOWING_DESKTOP")) + } else if (atom == XCB->getAtom("_NET_SHOWING_DESKTOP")) { + // 更新任务栏隐藏状态 Q_EMIT requestUpdateHideState(false); + } } // destory event