fix: 修复任务栏应用需要点击两次才能active的问题
修复任务栏应用需要点击两次才能active的问题 Log: Task: https://pms.uniontech.com/task-view-142531.html Influence: 任务栏应用一次点击就可以打开 Change-Id: I792202025a155a21ad7133887c17289b9a653c6f
This commit is contained in:
parent
3a4135a1b7
commit
06ada3be52
@ -170,7 +170,9 @@ void XCBUtils::setActiveWindow(XWindow xid)
|
|||||||
|
|
||||||
void XCBUtils::changeActiveWindow(XWindow newActiveXid)
|
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)
|
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);
|
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 XCBUtils::getCurrentWMDesktop()
|
||||||
{
|
{
|
||||||
uint32_t ret;
|
uint32_t ret;
|
||||||
|
@ -135,7 +135,7 @@ public:
|
|||||||
// 获取活动窗口 _NET_ACTIVE_WINDOW
|
// 获取活动窗口 _NET_ACTIVE_WINDOW
|
||||||
XWindow getActiveWindow();
|
XWindow getActiveWindow();
|
||||||
|
|
||||||
// 设置活动窗口 _NET_ACTIVE_WINDOW
|
// 设置活动窗口 _NET_ACTIVE_WINDOW 属性
|
||||||
void setActiveWindow(XWindow xid);
|
void setActiveWindow(XWindow xid);
|
||||||
|
|
||||||
// 改变活动窗口
|
// 改变活动窗口
|
||||||
@ -221,9 +221,12 @@ public:
|
|||||||
// 设置窗口当前桌面
|
// 设置窗口当前桌面
|
||||||
void setWMDesktop(XWindow xid, uint32_t desktop);
|
void setWMDesktop(XWindow xid, uint32_t desktop);
|
||||||
|
|
||||||
// 设置桌面
|
// 设置当前桌面属性
|
||||||
void setCurrentWMDesktop(uint32_t desktop);
|
void setCurrentWMDesktop(uint32_t desktop);
|
||||||
|
|
||||||
|
// 请求改变当前桌面
|
||||||
|
void changeCurrentDesktop(uint32_t newDesktop, uint32_t timestamp);
|
||||||
|
|
||||||
// 获取当前桌面 _NET_CURRENT_DESKTOP
|
// 获取当前桌面 _NET_CURRENT_DESKTOP
|
||||||
uint32_t getCurrentWMDesktop();
|
uint32_t getCurrentWMDesktop();
|
||||||
|
|
||||||
|
@ -86,6 +86,7 @@ Dock::Dock(QObject *parent)
|
|||||||
connect(x11Manager, &X11Manager::requestUpdateHideState, this, &Dock::updateHideState);
|
connect(x11Manager, &X11Manager::requestUpdateHideState, this, &Dock::updateHideState);
|
||||||
connect(x11Manager, &X11Manager::requestAttachOrDetachWindow, this, &Dock::attachOrDetachWindow);
|
connect(x11Manager, &X11Manager::requestAttachOrDetachWindow, this, &Dock::attachOrDetachWindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_EMIT serviceRestarted();
|
Q_EMIT serviceRestarted();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,6 +396,18 @@ WindowInfoBase *Dock::getActiveWindow()
|
|||||||
|
|
||||||
void Dock::doActiveWindow(XWindow xid)
|
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);
|
XCB->changeActiveWindow(xid);
|
||||||
QTimer::singleShot(50, [&] {
|
QTimer::singleShot(50, [&] {
|
||||||
XCB->restackWindow(xid);
|
XCB->restackWindow(xid);
|
||||||
|
@ -272,12 +272,16 @@ void X11Manager::listenWindowXEvent(WindowInfoX *winInfo)
|
|||||||
|
|
||||||
void X11Manager::handleRootWindowPropertyNotifyEvent(XCBAtom atom)
|
void X11Manager::handleRootWindowPropertyNotifyEvent(XCBAtom atom)
|
||||||
{
|
{
|
||||||
if (atom == XCB->getAtom("_NET_CLIENT_LIST"))
|
if (atom == XCB->getAtom("_NET_CLIENT_LIST")) {
|
||||||
|
// 窗口列表改变
|
||||||
handleClientListChanged();
|
handleClientListChanged();
|
||||||
else if (atom == XCB->getAtom("_NET_ACTIVE_WINDOW"))
|
} else if (atom == XCB->getAtom("_NET_ACTIVE_WINDOW")) {
|
||||||
|
// 活动窗口改变
|
||||||
handleActiveWindowChangedX();
|
handleActiveWindowChangedX();
|
||||||
else if (atom == XCB->getAtom("_NET_SHOWING_DESKTOP"))
|
} else if (atom == XCB->getAtom("_NET_SHOWING_DESKTOP")) {
|
||||||
|
// 更新任务栏隐藏状态
|
||||||
Q_EMIT requestUpdateHideState(false);
|
Q_EMIT requestUpdateHideState(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// destory event
|
// destory event
|
||||||
|
Loading…
Reference in New Issue
Block a user