From 078f2c00d6e751066c6881b8abf52d709fa42dd3 Mon Sep 17 00:00:00 2001 From: zhaofangxun Date: Wed, 21 Oct 2026 14:37:18 +0800 Subject: [PATCH] fix: add showingDesktop signal monitoring in WaylandDockHelper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Root cause: WaylandDockHelper lacked KWin DBus showingDesktopChanged signal monitoring, unlike X11DockHelper which already had it. When Win+D triggered show-desktop, the dock panel popup was not proactively closed, causing a flash before disappearing and missed toggles 2. Fix: mirror X11DockHelper by adding setupKWinDBusConnection() to connect org.kde.KWin showingDesktopChanged signal, and onShowingDesktopChanged() to call requestClosePopup() when showing is true, plus m_showingDesktop state tracking in isWindowOverlap() 3. Impact: only affects Wayland session dock panel popup behavior on show-desktop, no change to X11 path or normal popup display logic Log: Fix dock panel popup flash on show-desktop in Wayland session Influence: 1. Test Win+D show-desktop with a tray plugin panel open in Wayland 2. Verify no flash appears and panel closes immediately 3. Test consecutive Win+D toggles for consistent response 4. Verify normal popup open/close behavior is unaffected fix: WaylandDockHelper 添加显示桌面信号监听 1. 根因:WaylandDockHelper 缺少 KWin DBus showingDesktopChanged 信号 监听,而 X11DockHelper 已有完整实现。Win+D 触发显示桌面时无法 主动关闭托盘面板 popup,导致面板闪现后消失且连续操作时漏触发 2. 方案:镜像 X11DockHelper 添加 setupKWinDBusConnection() 连接 org.kde.KWin 的 showingDesktopChanged 信号,onShowingDesktopChanged() 在 showing 为 true 时调用 requestClosePopup() 主动关闭面板,并在 isWindowOverlap() 中参考 m_showingDesktop 状态 3. 影响:仅影响 Wayland 会话下显示桌面时的 dock 面板 popup 行为, 不影响 X11 路径及正常 popup 显示逻辑 Log: 修复 Wayland 会话下显示桌面时 dock 面板 popup 闪现问题 Influence: 1. 测试 Wayland 会话下打开托盘插件面板后按 Win+D 显示桌面 2. 验证面板无闪现且立即消失 3. 测试连续 Win+D 切换显示桌面的响应一致性 4. 验证正常 popup 打开关闭行为不受影响 PMS: BUG-380373 --- panels/dock/waylanddockhelper.cpp | 27 +++++++++++++++++++++++++++ panels/dock/waylanddockhelper.h | 3 +++ 2 files changed, 30 insertions(+) diff --git a/panels/dock/waylanddockhelper.cpp b/panels/dock/waylanddockhelper.cpp index 6e72cb112..4b625aeca 100644 --- a/panels/dock/waylanddockhelper.cpp +++ b/panels/dock/waylanddockhelper.cpp @@ -17,15 +17,20 @@ #include #include +#include +#include + namespace dock { WaylandDockHelper::WaylandDockHelper(DockPanel *panel) : DockHelper(panel) , m_isWindowOverlap(false) , m_isCurrentActiveWindowFullscreened(false) + , m_showingDesktop(false) , m_panel(panel) { m_xwindowControl.reset(new TreeLandXWindowControl()); m_regionWatchManager.reset(new TreeLandRegionWatchManager()); + setupKWinDBusConnection(); DS_NAMESPACE::DAppletBridge bridge("org.deepin.ds.dock.taskmanager"); if (auto applet = bridge.applet()) { connect(applet, SIGNAL(windowFullscreenChanged(bool)), this, SLOT(setCurrentActiveWindowFullscreened(bool))); @@ -123,6 +128,9 @@ void WaylandDockHelper::setCurrentActiveWindowFullscreened(bool isFullscreen) bool WaylandDockHelper::isWindowOverlap() { + if (m_showingDesktop) { + return false; + } return m_isWindowOverlap; } @@ -204,6 +212,25 @@ bool WaylandDockHelper::moveXEmbedWindow(uint32_t wid, double dx, double dy, QQu return true; } +void WaylandDockHelper::setupKWinDBusConnection() +{ + QDBusInterface kwin("org.kde.KWin", "/KWin", "org.kde.KWin", QDBusConnection::sessionBus()); + if (kwin.isValid()) { + m_showingDesktop = kwin.property("showingDesktop").toBool(); + kwin.connection().connect("org.kde.KWin", "/KWin", "org.kde.KWin", + "showingDesktopChanged", this, SLOT(onShowingDesktopChanged(bool))); + } +} + +void WaylandDockHelper::onShowingDesktopChanged(bool showing) +{ + m_showingDesktop = showing; + if (showing) { + m_panel->requestClosePopup(); + } + Q_EMIT isWindowOverlapChanged(isWindowOverlap()); +} + WallpaperColorManager::WallpaperColorManager(WaylandDockHelper *helper) : QWaylandClientExtensionTemplate(treeland_wallpaper_color_manager_v1_interface.version) , m_helper(helper) diff --git a/panels/dock/waylanddockhelper.h b/panels/dock/waylanddockhelper.h index d135ea389..c69d80334 100644 --- a/panels/dock/waylanddockhelper.h +++ b/panels/dock/waylanddockhelper.h @@ -50,15 +50,18 @@ class WaylandDockHelper : public DockHelper protected Q_SLOTS: void setCurrentActiveWindowFullscreened(bool); + void onShowingDesktopChanged(bool showing); private: void updateRegionWatchPos(); void initWallpaperColorManager(); + void setupKWinDBusConnection(); private: friend class TreeLandRegionWatch; bool m_isWindowOverlap; bool m_isCurrentActiveWindowFullscreened; + bool m_showingDesktop; DockPanel *m_panel; QScopedPointer m_wallpaperColorManager; QScopedPointer m_regionWatch;