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