From d39af28eca39743f651584bbc66dcb8057e74284 Mon Sep 17 00:00:00 2001 From: wjyrich Date: Thu, 24 Sep 2026 11:17:35 +0800 Subject: [PATCH] fix: isolate smart-hide state per workspace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Filter window overlap by current workspace in isWindowOverlap() 2. Always re-evaluate overlap on workspace switch without reentry guard 3. Emit isWindowOverlapChanged when window workspace changes Log: Smart-hide now respects per-workspace window overlap state Influence: 1. Test smart-hide with window overlap in workspace 1, switch to workspace 2 2. Test smart-hide with windows spanning all workspaces 3. Test window moved between workspaces updates dock hide state fix: 隔离智能隐藏状态按工作区独立 1. isWindowOverlap() 中按当前工作区过滤窗口重叠 2. 切换工作区后始终重新评估重叠,移除重入守卫 3. 窗口跨工作区移动时补充 emit isWindowOverlapChanged Log: 智能隐藏现在按工作区独立维护窗口重叠状态 Influence: 1. 测试工作区一窗口重叠隐藏后切换到工作区二的显示状态 2. 测试跨所有工作区的窗口对智能隐藏的影响 3. 测试窗口在工作区间移动后任务栏隐藏状态更新 PMS: BUG-378341 --- panels/dock/x11dockhelper.cpp | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/panels/dock/x11dockhelper.cpp b/panels/dock/x11dockhelper.cpp index 3ae6ce0aa..e7cbe4bf6 100644 --- a/panels/dock/x11dockhelper.cpp +++ b/panels/dock/x11dockhelper.cpp @@ -374,20 +374,7 @@ void X11DockHelper::onHideModeChanged(HideMode mode) connect(m_xcbHelper, &XcbEventFilter::windowPropertyChanged, this, &X11DockHelper::onWindowPropertyChanged); connect(m_xcbHelper, &XcbEventFilter::windowGeometryChanged, this, &X11DockHelper::onWindowGeometryChanged); connect(m_xcbHelper, &XcbEventFilter::currentWorkspaceChanged, this, [this]() { - static bool updating = false; - if (updating) - return; - - updating = true; - int currentWorkspace = m_xcbHelper->getCurrentWorkspace(); - for (auto &&data : m_windows) { - if (data->overlap && (static_cast(data->workspace) == currentWorkspace || data->workspace == static_cast(allWorkspace))) { - Q_EMIT isWindowOverlapChanged(isWindowOverlap()); - updating = false; - return; - } - } - updating = false; + Q_EMIT isWindowOverlapChanged(isWindowOverlap()); }); } break; case KeepShowing: @@ -455,6 +442,7 @@ void X11DockHelper::onWindowWorkspaceChanged(xcb_window_t window) { if (m_windows.contains(window)) { m_windows[window]->workspace = m_xcbHelper->getWindowWorkspace(window); + Q_EMIT isWindowOverlapChanged(isWindowOverlap()); } } @@ -535,10 +523,13 @@ bool X11DockHelper::isWindowOverlap() return false; } - // any widnow overlap + // any window overlap in current workspace + uint32_t currentWorkspace = m_xcbHelper->getCurrentWorkspace(); bool overlap = false; - std::for_each(m_windows.begin(), m_windows.end(), [&overlap](const auto &window) { - return overlap |= window->overlap; + std::for_each(m_windows.begin(), m_windows.end(), [&overlap, currentWorkspace](const auto &window) { + if (window->overlap && (window->workspace == currentWorkspace || window->workspace == allWorkspace)) { + overlap = true; + } }); return overlap; }