From faf1a277d21176bb7b2e734b1d69d384ff0c7bee Mon Sep 17 00:00:00 2001 From: bbedward Date: Mon, 30 Mar 2026 15:16:17 -0400 Subject: [PATCH] workspace: fix mouse area to edges fixes #2108 --- .../DankBar/Widgets/WorkspaceSwitcher.qml | 115 +++++++++++++++++- 1 file changed, 112 insertions(+), 3 deletions(-) diff --git a/quickshell/Modules/DankBar/Widgets/WorkspaceSwitcher.qml b/quickshell/Modules/DankBar/Widgets/WorkspaceSwitcher.qml index 7f2375ec..0dce72a9 100644 --- a/quickshell/Modules/DankBar/Widgets/WorkspaceSwitcher.qml +++ b/quickshell/Modules/DankBar/Widgets/WorkspaceSwitcher.qml @@ -20,6 +20,46 @@ Item { property var blurBarWindow: null property var hyprlandOverviewLoader: null property var parentScreen: null + + readonly property real _leftMargin: { + if (isVertical) + return 0; + root.x; + if (!root.parent) + return 0; + const gap = root.mapToItem(null, 0, 0).x; + return (gap > 0 && gap < 30) ? gap + 5 : 0; + } + readonly property real _rightMargin: { + if (isVertical) + return 0; + root.x; + root.width; + if (!root.parent || !blurBarWindow) + return 0; + const gap = blurBarWindow.width - root.mapToItem(null, root.width, 0).x; + return (gap > 0 && gap < 30) ? gap + 5 : 0; + } + readonly property real _topMargin: { + if (!isVertical) + return 0; + root.y; + if (!root.parent) + return 0; + const gap = root.mapToItem(null, 0, 0).y; + return (gap > 0 && gap < 30) ? gap + 5 : 0; + } + readonly property real _bottomMargin: { + if (!isVertical) + return 0; + root.y; + root.height; + if (!root.parent || !blurBarWindow) + return 0; + const gap = blurBarWindow.height - root.mapToItem(null, 0, root.height).y; + return (gap > 0 && gap < 30) ? gap + 5 : 0; + } + property int _desktopEntriesUpdateTrigger: 0 readonly property var sortedToplevels: { return CompositorService.filterCurrentWorkspace(CompositorService.sortedToplevels, screenName); @@ -539,6 +579,60 @@ Item { }); } + function switchToWorkspaceByModelData(data) { + if (!data) + return; + + if (root.useExtWorkspace && (data.id || data.name)) { + ExtWorkspaceService.activateWorkspace(data.id || data.name, data.groupID || ""); + return; + } + + switch (CompositorService.compositor) { + case "niri": + if (data.idx !== undefined) + NiriService.switchToWorkspace(data.idx); + break; + case "hyprland": + if (data.id) + Hyprland.dispatch(`workspace ${data.id}`); + break; + case "dwl": + if (data.tag !== undefined) + DwlService.switchToTag(root.screenName, data.tag); + break; + case "sway": + case "scroll": + case "miracle": + if (data.num) + try { + I3.dispatch(`workspace number ${data.num}`); + } catch (_) {} + break; + } + } + + function findClosestWorkspaceIndex(localX, localY) { + if (workspaceRepeater.count === 0) + return -1; + + let closestIdx = -1; + let closestDist = Infinity; + + for (let i = 0; i < workspaceRepeater.count; i++) { + const item = workspaceRepeater.itemAt(i); + if (!item) + continue; + const center = item.mapToItem(root, item.width / 2, item.height / 2); + const dist = isVertical ? Math.abs(localY - center.y) : Math.abs(localX - center.x); + if (dist < closestDist) { + closestDist = dist; + closestIdx = i; + } + } + return closestIdx; + } + function switchWorkspace(direction) { if (useExtWorkspace) { const realWorkspaces = getRealWorkspaces(); @@ -752,8 +846,15 @@ Item { } MouseArea { - anchors.fill: parent - acceptedButtons: Qt.RightButton + id: edgeMouseArea + z: -1 + x: -root._leftMargin + y: -root._topMargin + width: root.width + root._leftMargin + root._rightMargin + height: root.height + root._topMargin + root._bottomMargin + acceptedButtons: Qt.LeftButton | Qt.RightButton + hoverEnabled: true + cursorShape: Qt.PointingHandCursor property real touchpadAccumulator: 0 property real mouseAccumulator: 0 @@ -766,12 +867,20 @@ Item { } onClicked: mouse => { - if (mouse.button === Qt.RightButton) { + const rootPos = edgeMouseArea.mapToItem(root, mouse.x, mouse.y); + switch (mouse.button) { + case Qt.RightButton: if (CompositorService.isNiri) { NiriService.toggleOverview(); } else if (CompositorService.isHyprland && root.hyprlandOverviewLoader?.item) { root.hyprlandOverviewLoader.item.overviewOpen = !root.hyprlandOverviewLoader.item.overviewOpen; } + break; + case Qt.LeftButton: + const idx = root.findClosestWorkspaceIndex(rootPos.x, rootPos.y); + if (idx >= 0) + root.switchToWorkspaceByModelData(root.workspaceList[idx]); + break; } }