From 073dc235cf92729f1f941c714aff2d3ec28285b1 Mon Sep 17 00:00:00 2001 From: Ivy233 Date: Wed, 14 Jan 2026 17:20:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=85=B3=E9=97=AD=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E6=97=B6=E5=90=8C=E6=97=B6=E5=85=B3=E9=97=AD=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 dock 空白区域右键时,启动器应该随其他弹窗一起关闭。 此修改为 dock 的 onRequestClosePopup 处理器添加了可选的启动器支持。 修改内容: - 添加 launcherControllerWrapper 属性以条件性支持启动器 - 在 Component.onCompleted 中使用 try-catch 初始化包装器以保证兼容性 - 在 onRequestClosePopup 中关闭启动器(如果包装器可用) - 移除延迟菜单定时器,关闭弹窗后直接打开菜单 - 修复 MenuHelper 正确断开 aboutToHide 处理器 PMS: BUG-323289 --- panels/dock/MenuHelper.qml | 20 +++++++++++++++++++- panels/dock/package/main.qml | 34 +++++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/panels/dock/MenuHelper.qml b/panels/dock/MenuHelper.qml index f59859322..3811e4f45 100644 --- a/panels/dock/MenuHelper.qml +++ b/panels/dock/MenuHelper.qml @@ -8,12 +8,30 @@ import Qt.labs.platform Item { property Menu activeMenu: null + property var aboutToHideConnections: ({}) // Store connections by menu object + function openMenu(menu: Menu) { if (activeMenu) { activeMenu.close() } + + // Disconnect previous connection for this menu if exists + if (aboutToHideConnections[menu]) { + try { + menu.aboutToHide.disconnect(aboutToHideConnections[menu]) + } catch (e) { + // Silently ignore disconnect errors + } + } menu.open() - menu.aboutToHide.connect(() => { activeMenu = null }) + + // Create and store the handler for this specific menu + let handler = function() { + activeMenu = null + } + aboutToHideConnections[menu] = handler + menu.aboutToHide.connect(handler) + activeMenu = menu } function closeMenu(menu: Menu) { diff --git a/panels/dock/package/main.qml b/panels/dock/package/main.qml index 49a935a6d..bc2c16014 100644 --- a/panels/dock/package/main.qml +++ b/panels/dock/package/main.qml @@ -24,7 +24,7 @@ Window { (Screen.width - dockLeftPart.implicitWidth - dockRightPart.implicitWidth) property int dockRemainingSpaceForCenter: useColumnLayout ? (Screen.height / 1.8 - dockRightPart.implicitHeight) : - (Screen.width / 1.8 - dockRightPart.implicitWidth) + (Screen.width / 1.8 - dockRightPart.implicitWidth) property int dockPartSpacing: gridLayout.columnSpacing // TODO signal dockCenterPartPosChanged() @@ -42,6 +42,9 @@ Window { property real dockItemIconSize: dockItemMaxSize * 9 / 14 + // LauncherController wrapper for optional launchpad support + property var launcherControllerWrapper: null + // NOTE: -1 means not set its size, follow the platform size width: Panel.position === Dock.Top || Panel.position === Dock.Bottom ? -1 : dockSize height: Panel.position === Dock.Left || Panel.position === Dock.Right ? -1 : dockSize @@ -65,7 +68,7 @@ Window { D.DWindow.windowRadius: 0 //TODO:由于windoweffect处理有BUG,导致动画结束后一致保持无阴影,无borderwidth状态。 无法恢复到最初的阴影和边框 //D.DWindow.windowEffect: hideShowAnimation.running ? D.PlatformHandle.EffectNoShadow | D.PlatformHandle.EffectNoBorder : 0 - + // 目前直接处理shadowColor(透明和默认值的切换)和borderWidth(0和1的切换),来控制阴影和边框 // 默认阴影透明度是 60%,见: https://github.com/linuxdeepin/qt5platform-plugins/blob/master/xcb/dframewindow.h#L122 D.DWindow.shadowColor: hideShowAnimation.running ? Qt.rgba(0, 0, 0, 0) : Qt.rgba(0, 0, 0, 0.6) @@ -119,13 +122,13 @@ Window { Connections { target: dockTransform enabled: Qt.platform.pluginName === "xcb" && hideShowAnimation.running - + function onXChanged() { if (dock.useColumnLayout) { Panel.notifyDockPositionChanged(dockTransform.x, 0) } } - + function onYChanged() { if (!dock.useColumnLayout) { Panel.notifyDockPositionChanged(0, dockTransform.y) @@ -136,13 +139,13 @@ Window { Connections { target: dock enabled: Qt.platform.pluginName !== "xcb" && hideShowAnimation.running - + function onWidthChanged() { if (dock.useColumnLayout) { Panel.notifyDockPositionChanged(dock.width, 0) } } - + function onHeightChanged() { if (!dock.useColumnLayout) { Panel.notifyDockPositionChanged(0, dock.height) @@ -458,18 +461,18 @@ Window { } } - Item { + Item { id: dockCenterPart property var taskmanagerRootObject: { let applet = DS.applet("org.deepin.ds.dock.taskmanager") return applet ? applet.rootObject : null } - + readonly property real taskmanagerImplicitWidth: taskmanagerRootObject ? taskmanagerRootObject.implicitWidth : 0 readonly property real taskmanagerImplicitHeight: taskmanagerRootObject ? taskmanagerRootObject.implicitHeight : 0 readonly property real taskmanagerAppContainerWidth: taskmanagerRootObject ? taskmanagerRootObject.appContainerWidth : 0 readonly property real taskmanagerAppContainerHeight: taskmanagerRootObject ? taskmanagerRootObject.appContainerHeight : 0 - + implicitWidth: centerLoader.implicitWidth - taskmanagerImplicitWidth + taskmanagerAppContainerWidth implicitHeight: centerLoader.implicitHeight - taskmanagerImplicitHeight + taskmanagerAppContainerHeight onXChanged: dockCenterPartPosChanged() @@ -685,6 +688,10 @@ Window { DS.closeChildrenWindows(popup) if (popup && popup.visible) popup.close() + // Close dde-launchpad if available + if (launcherControllerWrapper) { + launcherControllerWrapper.hide() + } } function onDockScreenChanged() { // Close all popups when dock moves to another screen @@ -744,5 +751,14 @@ Window { dock.itemIconSizeBase = dock.dockItemMaxSize dock.visible = Panel.hideState !== Dock.Hide changeDragAreaAnchor() + + // Try to create LauncherController wrapper for optional launchpad support + try { + launcherControllerWrapper = Qt.createQmlObject( + 'import QtQuick 2.15; import org.deepin.launchpad 1.0; QtObject { function hide() { LauncherController.visible = false } }', + dock, "LauncherControllerWrapper") + } catch (e) { + // Launchpad module not available, launcherControllerWrapper remains null + } } }