diff --git a/plugins/dock/src/dock_manager/dock_manager.cc b/plugins/dock/src/dock_manager/dock_manager.cc index 323f5a417bef695dad34ae509f5d670a964263ca..40be54064f7cc60a1637368398021ed4f66d9ab1 100644 --- a/plugins/dock/src/dock_manager/dock_manager.cc +++ b/plugins/dock/src/dock_manager/dock_manager.cc @@ -433,8 +433,10 @@ bool DockManager::shouldHideOnSmartHideMode() const { // 收集激活窗口及其同组窗口 std::vector group; + // 修复在 wayland 下 dock 在自动隐藏状态下不会隐藏的问题 + 优化隐藏逻辑(x11 + wayland) + uint32_t leader = 0; if (backend_ != nullptr) { - const uint32_t leader = backend_->GetWindowGroupLeader(active_window_); + leader = backend_->GetWindowGroupLeader(active_window_); for (const BackendWindow& w : backend_->ListWindows()) { if (w.id == active_window_ || (leader != 0 && backend_->GetWindowGroupLeader(w.id) == leader)) { @@ -455,6 +457,22 @@ bool DockManager::shouldHideOnSmartHideMode() const { return true; } } + + // 几何不相交。X11 上说明窗口没有覆盖 dock,不应隐藏;Wayland 上则是合成器 + // 为 dock 预留空间导致窗口几何被裁切、与 dock 矩形仅相邻而不相交,无法用 + // 相交判定。两者统一退化为:仅当激活窗口(含同组窗口)处于“最大化”状态时才 + // 隐藏——这与 X11 “窗口覆盖 dock 才隐藏” 的语义一致,同时排除了桌面/壁纸、 + // 未最大化小窗等无需隐藏的场景,避免 dock 在桌面态被一直收起。 + if (backend_ != nullptr) { + for (const BackendWindow& w : backend_->ListWindows()) { + if (w.id == active_window_ || + (leader != 0 && backend_->GetWindowGroupLeader(w.id) == leader)) { + if (w.maximized) { + return true; + } + } + } + } return false; }