From 3004c34f61289159f26ebc190b1079eef1e67c20 Mon Sep 17 00:00:00 2001 From: Marco Allegretti Date: Mon, 25 May 2026 09:00:34 +0200 Subject: [PATCH] Restore topbar drawer input plumbing Keep Folio responsible for the visible convergence chrome, but let the panel containment keep its transparent ActionDrawerOpenSurface for the topbar hit target. This restores the old click and drag behavior while keeping the legacy statusbar visual hidden in convergence. Add a passive hover-only MouseArea to show the pointing-hand cursor without stealing input from the drawer swipe surface. --- .../actiondrawer/ActionDrawerOpenSurface.qml | 7 +++++ containments/homescreens/folio/qml/main.qml | 10 +++---- containments/panel/qml/StatusPanel.qml | 6 ++++- containments/panel/qml/main.qml | 15 +++++++---- tests/check-convergence-dock-invariant.sh | 27 ++++++++++++++----- 5 files changed, 45 insertions(+), 20 deletions(-) diff --git a/components/mobileshell/qml/actiondrawer/ActionDrawerOpenSurface.qml b/components/mobileshell/qml/actiondrawer/ActionDrawerOpenSurface.qml index 3da939dc..990a5751 100644 --- a/components/mobileshell/qml/actiondrawer/ActionDrawerOpenSurface.qml +++ b/components/mobileshell/qml/actiondrawer/ActionDrawerOpenSurface.qml @@ -56,6 +56,13 @@ MobileShell.SwipeArea { anchors.fill: parent + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.NoButton + hoverEnabled: true + cursorShape: ShellSettings.Settings.convergenceModeEnabled ? Qt.PointingHandCursor : Qt.ArrowCursor + } + onSwipeStarted: (point) => startSwipeWithPoint(point) onSwipeEnded: endSwipe() onSwipeMove: (totalDeltaX, totalDeltaY, deltaX, deltaY) => updateOffset(deltaY); diff --git a/containments/homescreens/folio/qml/main.qml b/containments/homescreens/folio/qml/main.qml index 198cb9ee..e1134aaa 100644 --- a/containments/homescreens/folio/qml/main.qml +++ b/containments/homescreens/folio/qml/main.qml @@ -299,9 +299,10 @@ ContainmentItem { readonly property real topBarHeight: MobileShell.Constants.topPanelHeight readonly property real dockHeight: MobileShell.Constants.convergenceDockHeight readonly property real frameThickness: MobileShell.Constants.convergenceWorkspaceFrameThickness + readonly property real topBarHitHeight: topBarHeight + frameThickness readonly property real frameRadius: Math.min(MobileShell.Constants.convergenceWorkspaceFrameRadius, Math.max(0, Math.min(workAreaWidth, workAreaHeight) / 2)) readonly property real workAreaX: frameThickness - readonly property real workAreaY: topBarHeight + frameThickness + readonly property real workAreaY: topBarHitHeight readonly property real workAreaWidth: Math.max(0, width - frameThickness * 2) readonly property real workAreaHeight: Math.max(0, height - topBarHeight - dockHeight - frameThickness * 2) readonly property color chromeColor: Kirigami.Theme.backgroundColor @@ -322,7 +323,7 @@ ContainmentItem { Kirigami.Theme.colorSet: Kirigami.Theme.Window function updateInputRegion() { - const topBarRegion = Qt.rect(0, 0, width, topBarHeight) + const topBarRegion = Qt.rect(0, 0, width, topBarHitHeight) if (shouldHide && dockOffset >= dockHeight) { MobileShell.ShellUtil.setInputRegions(convergenceChrome, [ topBarRegion, @@ -405,11 +406,6 @@ ContainmentItem { showTime: true backgroundColor: "transparent" } - - TapHandler { - acceptedButtons: Qt.LeftButton - onTapped: MobileShellState.ShellDBusClient.openActionDrawer() - } } Shape { diff --git a/containments/panel/qml/StatusPanel.qml b/containments/panel/qml/StatusPanel.qml index f9fe91f8..f15346cc 100644 --- a/containments/panel/qml/StatusPanel.qml +++ b/containments/panel/qml/StatusPanel.qml @@ -64,7 +64,9 @@ Item { screen: Plasmoid.screen maximizedTracker: containmentItem.windowMaximizedTracker - visible: !MobileShellState.LockscreenDBusClient.lockscreenActive && !containmentItem.fullscreen + visible: !MobileShellState.LockscreenDBusClient.lockscreenActive + && !containmentItem.fullscreen + && !ShellSettings.Settings.convergenceModeEnabled } // Status bar component @@ -74,6 +76,8 @@ Item { StatusBarWrapper { id: statusBarWrapper z: 1 + visible: !ShellSettings.Settings.convergenceModeEnabled + enabled: visible anchors.fill: parent statusPanelHeight: MobileShell.Constants.topPanelHeight diff --git a/containments/panel/qml/main.qml b/containments/panel/qml/main.qml index 96bc99b4..8af38158 100644 --- a/containments/panel/qml/main.qml +++ b/containments/panel/qml/main.qml @@ -76,10 +76,13 @@ ContainmentItem { } readonly property real topBarHeight: gamingMode ? 0 : MobileShell.Constants.topPanelHeight - readonly property real panelHeight: (ShellSettings.Settings.convergenceModeEnabled || gamingMode) ? 0 : MobileShell.Constants.topPanelHeight readonly property real convergenceWorkspaceFrameThickness: ShellSettings.Settings.convergenceModeEnabled && !gamingMode ? MobileShell.Constants.convergenceWorkspaceFrameThickness : 0 + readonly property real topBarInputHeight: topBarHeight + convergenceWorkspaceFrameThickness + readonly property real panelHeight: gamingMode + ? 0 + : (ShellSettings.Settings.convergenceModeEnabled ? topBarInputHeight : MobileShell.Constants.topPanelHeight) onPanelHeightChanged: setWindowProperties() function setWindowProperties() { @@ -103,7 +106,9 @@ ContainmentItem { function updateTouchArea() { const hiddenTouchAreaThickness = Kirigami.Units.gridUnit; - if (MobileShellState.ShellDBusClient.panelState == "hidden") { + if (ShellSettings.Settings.convergenceModeEnabled) { + MobileShell.ShellUtil.setInputRegion(root.panel, Qt.rect(0, 0, root.panel.width, root.panel.height)); + } else if (MobileShellState.ShellDBusClient.panelState == "hidden") { MobileShell.ShellUtil.setInputRegion(root.panel, Qt.rect(0, 0, root.panel.width, hiddenTouchAreaThickness)); } else { MobileShell.ShellUtil.setInputRegion(root.panel, Qt.rect(0, 0, 0, 0)); @@ -155,20 +160,20 @@ ContainmentItem { visible: ShellSettings.Settings.convergenceModeEnabled && !ShellSettings.Settings.gamingModeEnabled color: "transparent" flags: Qt.FramelessWindowHint | Qt.WindowTransparentForInput - height: Math.max(1, root.topBarHeight + root.convergenceWorkspaceFrameThickness) + height: Math.max(1, root.topBarInputHeight) width: 1 LayerShell.Window.scope: "topbar-space" LayerShell.Window.layer: LayerShell.Window.LayerBottom LayerShell.Window.anchors: LayerShell.Window.AnchorTop | LayerShell.Window.AnchorLeft | LayerShell.Window.AnchorRight - LayerShell.Window.exclusionZone: Math.max(1, root.topBarHeight + root.convergenceWorkspaceFrameThickness) + LayerShell.Window.exclusionZone: Math.max(1, root.topBarInputHeight) LayerShell.Window.keyboardInteractivity: LayerShell.Window.KeyboardInteractivityNone } // Visual panel component StatusPanel { id: statusPanel - visible: !ShellSettings.Settings.gamingModeEnabled && !ShellSettings.Settings.convergenceModeEnabled + visible: !ShellSettings.Settings.gamingModeEnabled anchors.fill: parent containmentItem: root } diff --git a/tests/check-convergence-dock-invariant.sh b/tests/check-convergence-dock-invariant.sh index d9273366..fa2da8d6 100644 --- a/tests/check-convergence-dock-invariant.sh +++ b/tests/check-convergence-dock-invariant.sh @@ -8,6 +8,7 @@ repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" constants="$repo_root/components/mobileshell/qml/components/Constants.qml" panel="$repo_root/containments/panel/qml/main.qml" +status_panel="$repo_root/containments/panel/qml/StatusPanel.qml" status_bar_template="$repo_root/layout-templates/org.kde.plasma.mobile.defaultStatusBar/contents/layout.js" taskpanel="$repo_root/containments/taskpanel/qml/main.qml" folio_main="$repo_root/containments/homescreens/folio/qml/main.qml" @@ -17,6 +18,7 @@ folio_home="$repo_root/containments/homescreens/folio/qml/FolioHomeScreen.qml" folio_backend="$repo_root/containments/homescreens/folio/homescreen.h" folio_backend_cpp="$repo_root/containments/homescreens/folio/homescreen.cpp" action_content="$repo_root/components/mobileshell/qml/actiondrawer/private/ContentContainer.qml" +action_open_surface="$repo_root/components/mobileshell/qml/actiondrawer/ActionDrawerOpenSurface.qml" action_landscape="$repo_root/components/mobileshell/qml/actiondrawer/private/LandscapeContentContainer.qml" quick_settings="$repo_root/components/mobileshell/qml/actiondrawer/private/QuickSettings.qml" quick_settings_panel="$repo_root/components/mobileshell/qml/actiondrawer/private/QuickSettingsPanel.qml" @@ -48,10 +50,21 @@ require_line "$panel" "root.panel.location = PlasmaCore.Types.TopEdge" require_line "$panel" "root.panel.offset = 0" require_line "$panel" "root.panel.visibilityMode = (!ShellSettings.Settings.convergenceModeEnabled && ShellSettings.Settings.autoHidePanelsEnabled) ? 3 : 0" require_line "$panel" "readonly property real topBarHeight: gamingMode ? 0 : MobileShell.Constants.topPanelHeight" -require_line "$panel" "readonly property real panelHeight: (ShellSettings.Settings.convergenceModeEnabled || gamingMode) ? 0 : MobileShell.Constants.topPanelHeight" -require_line "$panel" "height: Math.max(1, root.topBarHeight + root.convergenceWorkspaceFrameThickness)" -require_line "$panel" "LayerShell.Window.exclusionZone: Math.max(1, root.topBarHeight + root.convergenceWorkspaceFrameThickness)" -require_line "$panel" "visible: !ShellSettings.Settings.gamingModeEnabled && !ShellSettings.Settings.convergenceModeEnabled" +require_line "$panel" "readonly property real topBarInputHeight: topBarHeight + convergenceWorkspaceFrameThickness" +require_line "$panel" "? 0" +require_line "$panel" ": (ShellSettings.Settings.convergenceModeEnabled ? topBarInputHeight : MobileShell.Constants.topPanelHeight)" +require_line "$panel" "MobileShell.ShellUtil.setInputRegion(root.panel, Qt.rect(0, 0, root.panel.width, root.panel.height));" +require_line "$panel" "height: Math.max(1, root.topBarInputHeight)" +require_line "$panel" "LayerShell.Window.exclusionZone: Math.max(1, root.topBarInputHeight)" +require_line "$panel" "visible: !ShellSettings.Settings.gamingModeEnabled" + +require_line "$status_panel" "&& !ShellSettings.Settings.convergenceModeEnabled" +require_line "$status_panel" "visible: !ShellSettings.Settings.convergenceModeEnabled" +require_line "$status_panel" "MobileShell.ActionDrawerOpenSurface {" +require_line "$action_open_surface" "MouseArea {" +require_line "$action_open_surface" "acceptedButtons: Qt.NoButton" +require_line "$action_open_surface" "hoverEnabled: true" +require_line "$action_open_surface" "cursorShape: ShellSettings.Settings.convergenceModeEnabled ? Qt.PointingHandCursor : Qt.ArrowCursor" require_line "$status_bar_template" "panel.location = \"top\";" @@ -66,9 +79,9 @@ require_line "$folio_main" "id: convergenceChrome" require_line "$folio_main" "LayerShell.Window.scope: \"convergence-chrome\"" require_line "$folio_main" "height: Screen.height" require_line "$folio_main" "MobileShell.StatusBar {" -require_line "$folio_main" "onTapped: MobileShellState.ShellDBusClient.openActionDrawer()" require_line "$folio_main" "MobileShell.ShellUtil.setInputRegions(convergenceChrome, [" -require_line "$folio_main" "const topBarRegion = Qt.rect(0, 0, width, topBarHeight)" +require_line "$folio_main" "readonly property real topBarHitHeight: topBarHeight + frameThickness" +require_line "$folio_main" "const topBarRegion = Qt.rect(0, 0, width, topBarHitHeight)" require_line "$folio_main" "readonly property real dockHeight: MobileShell.Constants.convergenceDockHeight" require_line "$folio_main" "readonly property real revealStripHeight: MobileShell.Constants.convergenceDockRevealHeight" require_line "$folio_main" "import QtQuick.Shapes 1.8" @@ -76,7 +89,7 @@ require_line "$folio_main" "id: workspaceFrame" require_line "$folio_main" "readonly property real frameThickness: MobileShell.Constants.convergenceWorkspaceFrameThickness" require_line "$folio_main" "readonly property real frameRadius:" require_line "$folio_main" "readonly property real workAreaX: frameThickness" -require_line "$folio_main" "readonly property real workAreaY: topBarHeight + frameThickness" +require_line "$folio_main" "readonly property real workAreaY: topBarHitHeight" require_line "$folio_main" "readonly property real workAreaWidth: Math.max(0, width - frameThickness * 2)" require_line "$folio_main" "readonly property real workAreaHeight: Math.max(0, height - topBarHeight - dockHeight - frameThickness * 2)" require_line "$folio_main" "fillRule: ShapePath.OddEvenFill"