From be25a00b8ebb920b384508af3d9f016734d34b6b Mon Sep 17 00:00:00 2001 From: wjyrich Date: Thu, 23 Oct 2025 13:06:40 +0800 Subject: [PATCH] fix: improve window identity and tracking order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Add desktop file ID to window identity for better uniqueness 2. Include AppItem desktopfileID in identity generation 3. Change window tracking order to emit signal before tracking 4. This prevents potential race conditions in window management fix: 改进窗口标识和跟踪顺序 1. 添加桌面文件ID到窗口标识以提高唯一性 2. 在身份生成中包含AppItem的desktopfileID 3. 更改窗口跟踪顺序,在跟踪前发出信号 4. 这可以防止窗口管理中的潜在竞争条件 PMS: BUG-335801 --- panels/dock/taskmanager/x11window.cpp | 6 ++++++ panels/dock/taskmanager/x11windowmonitor.cpp | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/panels/dock/taskmanager/x11window.cpp b/panels/dock/taskmanager/x11window.cpp index fa4e9d1a1..adddaf363 100644 --- a/panels/dock/taskmanager/x11window.cpp +++ b/panels/dock/taskmanager/x11window.cpp @@ -5,6 +5,7 @@ #include "x11window.h" #include "abstractwindow.h" #include "x11utils.h" +#include "appitem.h" #include @@ -48,6 +49,11 @@ QStringList X11Window::identity() { if (m_identity.isEmpty()) { m_identity = X11->getWindowWMClass(m_windowID); + if (auto appItem = getAppItem()) { + m_identity.append(appItem->desktopfileID()); + } else { + qCWarning(x11windowLog) << "identify not found appitem." << id(); + } m_identity.append(QString::number(pid())); } diff --git a/panels/dock/taskmanager/x11windowmonitor.cpp b/panels/dock/taskmanager/x11windowmonitor.cpp index 4ecaa442d..f3451a610 100644 --- a/panels/dock/taskmanager/x11windowmonitor.cpp +++ b/panels/dock/taskmanager/x11windowmonitor.cpp @@ -175,8 +175,9 @@ void X11WindowMonitor::onWindowMapped(xcb_window_t xcb_window) uint32_t value_list[] = { XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_VISIBILITY_CHANGE}; xcb_change_window_attributes(X11->getXcbConnection(), xcb_window, XCB_CW_EVENT_MASK, value_list); - trackWindow(window.get()); Q_EMIT AbstractWindowMonitor::windowAdded(static_cast>(window.get())); + trackWindow(window.get()); + } void X11WindowMonitor::onWindowDestroyed(xcb_window_t xcb_window)