From 92fe17185f8e469b1fb9e38c9151cd6b03e48355 Mon Sep 17 00:00:00 2001 From: wjyrich Date: Fri, 17 Apr 2026 17:48:00 +0800 Subject: [PATCH] fix: filter unsupported dock applets in DBus proxy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Added isSupported property to DAppletDock class to mark applet compatibility 2. Modified dock DBus proxy to skip unsupported applets when updating plugin visibility and listing plugins 3. Enhanced MultiTaskView to dynamically update supported status based on window compositor availability 4. Fixed visible property calculation to consider both m_visible and m_isSupported flags 5. Added proper signal emission when supported status changes affect effective visibility Log: Fixed dock applet visibility issues when compositor is unavailable Influence: 1. Test dock applet visibility when switching between composited and non-composited modes 2. Verify DBus plugin list excludes unsupported applets 3. Check that MultiTaskView correctly appears/disappears based on compositor support 4. Test that visibleChanged signal fires appropriately when supported status changes 5. Verify dock settings UI correctly reflects available applets fix: 在DBus代理中过滤不支持的停靠小程序 1. 在DAppletDock类中添加isSupported属性以标记小程序兼容性 2. 修改停靠DBus代理,在更新插件可见性和列出插件时跳过不支持的小程序 3. 增强MultiTaskView以根据窗口合成器可用性动态更新支持状态 4. 修复visible属性计算,同时考虑m_visible和m_isSupported标志 5. 当支持状态变化影响有效可见性时添加适当的信号发射 Log: 修复合成器不可用时停靠小程序可见性问题 Influence: 1. 测试在合成和非合成模式间切换时停靠小程序的可见性 2. 验证DBus插件列表排除不支持的小程序 3. 检查MultiTaskView是否根据合成器支持正确显示/隐藏 4. 测试当支持状态变化时visibleChanged信号是否适当触发 5. 验证停靠设置UI正确反映可用的小程序 --- panels/dock/dockdbusproxy.cpp | 6 +++++ panels/dock/frame/dappletdock.cpp | 27 ++++++++++++++++++++- panels/dock/frame/dappletdock.h | 5 ++++ panels/dock/multitaskview/multitaskview.cpp | 10 ++++++-- 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/panels/dock/dockdbusproxy.cpp b/panels/dock/dockdbusproxy.cpp index 19b1ee391..2e32efdc0 100644 --- a/panels/dock/dockdbusproxy.cpp +++ b/panels/dock/dockdbusproxy.cpp @@ -92,6 +92,9 @@ QRect DockDBusProxy::geometry() void DockDBusProxy::updateDockPluginsVisible(const QVariantMap &pluginsVisible) { for (auto *dockApplet : dockApplets(parent())) { + if (!dockApplet->isSupported()) { + continue; + } DockItemInfo itemInfo = dockApplet->dockItemInfo(); QString itemKey = itemInfo.itemKey; if (pluginsVisible.contains(itemKey)) { @@ -235,6 +238,9 @@ DockItemInfos DockDBusProxy::plugins() } for (auto *dockApplet : dockApplets(parent())) { + if (!dockApplet->isSupported()) { + continue; + } iteminfos.append(dockApplet->dockItemInfo()); } diff --git a/panels/dock/frame/dappletdock.cpp b/panels/dock/frame/dappletdock.cpp index 548cee350..f975e2f13 100644 --- a/panels/dock/frame/dappletdock.cpp +++ b/panels/dock/frame/dappletdock.cpp @@ -17,6 +17,7 @@ class DAppletDockPrivate : public DAppletPrivate ~DAppletDockPrivate() override = default; bool m_visible = true; + bool m_isSupported = true; D_DECLARE_PUBLIC(DAppletDock) }; @@ -34,7 +35,7 @@ DAppletDock::DAppletDock(DAppletDockPrivate &dd, QObject *parent) bool DAppletDock::visible() const { D_DC(DAppletDock); - return d->m_visible; + return d->m_visible && d->m_isSupported; } void DAppletDock::setVisible(bool visible) @@ -43,9 +44,33 @@ void DAppletDock::setVisible(bool visible) if (d->m_visible == visible) return; + bool oldEffectiveVisible = this->visible(); d->m_visible = visible; + if (oldEffectiveVisible != this->visible()) { Q_EMIT visibleChanged(); } +} + +bool DAppletDock::isSupported() const +{ + D_DC(DAppletDock); + return d->m_isSupported; +} + +void DAppletDock::setSupported(bool supported) +{ + D_D(DAppletDock); + if (d->m_isSupported == supported) + return; + + bool oldEffectiveVisible = this->visible(); + d->m_isSupported = supported; + Q_EMIT supportedChanged(); + + if (oldEffectiveVisible != this->visible()) { + Q_EMIT visibleChanged(); + } +} DockItemInfo DAppletDock::dockItemInfo() { diff --git a/panels/dock/frame/dappletdock.h b/panels/dock/frame/dappletdock.h index 93f5adfeb..73d7c76d6 100644 --- a/panels/dock/frame/dappletdock.h +++ b/panels/dock/frame/dappletdock.h @@ -16,6 +16,7 @@ class DS_SHARE DAppletDock : public DApplet { Q_OBJECT Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged) + Q_PROPERTY(bool supported READ isSupported WRITE setSupported NOTIFY supportedChanged) D_DECLARE_PRIVATE(DAppletDock) public: @@ -27,8 +28,12 @@ class DS_SHARE DAppletDock : public DApplet bool visible() const; void setVisible(bool visible); + bool isSupported() const; + void setSupported(bool supported); + Q_SIGNALS: void visibleChanged(); + void supportedChanged(); protected: explicit DAppletDock(DAppletDockPrivate &dd, QObject *parent = nullptr); diff --git a/panels/dock/multitaskview/multitaskview.cpp b/panels/dock/multitaskview/multitaskview.cpp index fb660c1da..de3716855 100644 --- a/panels/dock/multitaskview/multitaskview.cpp +++ b/panels/dock/multitaskview/multitaskview.cpp @@ -25,7 +25,10 @@ MultiTaskView::MultiTaskView(QObject *parent) : DAppletDock(parent) , m_iconName("deepin-multitasking-view") { - connect(DWindowManagerHelper::instance(), &DWindowManagerHelper::hasCompositeChanged, this, &MultiTaskView::visibleChanged); + connect(DWindowManagerHelper::instance(), &DWindowManagerHelper::hasCompositeChanged, this, [this]() { + Q_EMIT visibleChanged(); + setSupported(m_kWinEffect && DWindowManagerHelper::instance()->hasComposite()); + }); auto platformName = QGuiApplication::platformName(); if (QStringLiteral("wayland") == platformName) { m_multitaskview.reset(new TreeLandMultitaskview); @@ -39,6 +42,7 @@ MultiTaskView::MultiTaskView(QObject *parent) if (kWinEffect != m_kWinEffect) { m_kWinEffect = kWinEffect; Q_EMIT visibleChanged(); + setSupported(m_kWinEffect && DWindowManagerHelper::instance()->hasComposite()); } } }); @@ -47,6 +51,8 @@ MultiTaskView::MultiTaskView(QObject *parent) bool MultiTaskView::init() { + setSupported(m_kWinEffect && DWindowManagerHelper::instance()->hasComposite()); + setVisible(m_kWinEffect && DWindowManagerHelper::instance()->hasComposite()); DAppletDock::init(); return true; } @@ -86,7 +92,7 @@ DockItemInfo MultiTaskView::dockItemInfo() info.displayName = tr("Multitasking View"); info.itemKey = "multitasking-view"; info.settingKey = "multitasking-view"; - info.visible = m_kWinEffect && DWindowManagerHelper::instance()->hasComposite(); + info.visible = visible(); info.dccIcon = DCCIconPath + "multitasking-view.svg"; return info; }