From 735fb7895bce19d301769e9901d5f4659a7bae46 Mon Sep 17 00:00:00 2001 From: LilFishyChan Date: Tue, 17 Mar 2026 16:22:47 +0800 Subject: [PATCH 1/6] fix(SysTrayItem): anchor popup menu to icon instead of fixed coordinates - Improved anchor positioning to make the expanded menu follow the icon dynamically rather than using fixed absolute coordinates. - Replaced manual `rect` calculations with direct `item: root` binding. - Updated `gravity` and `edges` logic to properly support both vertical and horizontal bar orientations. --- .../quickshell/ii/modules/ii/bar/SysTray.qml | 5 ++++ .../ii/modules/ii/bar/SysTrayItem.qml | 25 +++++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/ii/bar/SysTray.qml b/dots/.config/quickshell/ii/modules/ii/bar/SysTray.qml index 56d33e0d4..69d98105a 100644 --- a/dots/.config/quickshell/ii/modules/ii/bar/SysTray.qml +++ b/dots/.config/quickshell/ii/modules/ii/bar/SysTray.qml @@ -29,6 +29,11 @@ Item { } function setExtraWindowAndGrabFocus(window) { + if (root.activeMenu && root.activeMenu !== window) { + if (typeof root.activeMenu.close === "function") + root.activeMenu.close(); + root.activeMenu = null; + } root.activeMenu = window; root.grabFocus(); } diff --git a/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml index 6230de0f8..d85b5fe6b 100644 --- a/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml +++ b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml @@ -26,7 +26,11 @@ MouseArea { item.activate(); break; case Qt.RightButton: - if (item.hasMenu) menu.open(); + if (item.hasMenu) + if (menu.active && menu.item && typeof menu.item.close === "function") + menu.item.close(); + else + menu.open(); break; } event.accepted = true; @@ -44,15 +48,16 @@ MouseArea { sourceComponent: SysTrayMenu { Component.onCompleted: this.open(); trayItemMenuHandle: root.item.menu - anchor { - window: root.QsWindow.window - rect.x: root.x + (Config.options.bar.vertical ? 0 : QsWindow.window?.width) - rect.y: root.y + (Config.options.bar.vertical ? QsWindow.window?.height : 0) - rect.height: root.height - rect.width: root.width - edges: Config.options.bar.bottom ? (Edges.Top | Edges.Left) : (Edges.Bottom | Edges.Right) - gravity: Config.options.bar.bottom ? (Edges.Top | Edges.Left) : (Edges.Bottom | Edges.Right) - } + anchor { + window: root.QsWindow.window + item: root + gravity: Config.options.bar.vertical + ? (Config.options.bar.bottom ? Edges.Left : Edges.Right) + : (Config.options.bar.bottom ? Edges.Top : Edges.Bottom) + edges: Config.options.bar.vertical + ? (Config.options.bar.bottom ? Edges.Left : Edges.Right) + : (Config.options.bar.bottom ? Edges.Top : Edges.Bottom) + } onMenuOpened: (window) => root.menuOpened(window); onMenuClosed: { root.menuClosed(); From bd923a0f8876eb029ed16ff3e6f3d325d754aa12 Mon Sep 17 00:00:00 2001 From: LilFishyChan Date: Tue, 17 Mar 2026 17:07:59 +0800 Subject: [PATCH 2/6] feat(SysTray): add pinning functionality to system tray items --- .../ii/modules/ii/bar/SysTrayItem.qml | 1 + .../ii/modules/ii/bar/SysTrayMenu.qml | 47 +++++++++++++++++++ .../quickshell/ii/services/TrayService.qml | 21 +++++++-- 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml index d85b5fe6b..45ce89258 100644 --- a/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml +++ b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml @@ -48,6 +48,7 @@ MouseArea { sourceComponent: SysTrayMenu { Component.onCompleted: this.open(); trayItemMenuHandle: root.item.menu + trayItemId: root.item.id anchor { window: root.QsWindow.window item: root diff --git a/dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenu.qml b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenu.qml index 8dc6dc608..cba4cf615 100644 --- a/dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenu.qml +++ b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenu.qml @@ -9,6 +9,7 @@ import Quickshell PopupWindow { id: root required property QsMenuHandle trayItemMenuHandle + property string trayItemId: "" property real popupBackgroundMargin: 0 signal menuClosed @@ -173,6 +174,52 @@ PopupWindow { } } } + RippleButton { + id: pinEntry + buttonRadius: popupBackground.radius - popupBackground.padding + horizontalPadding: 12 + implicitWidth: contentItem.implicitWidth + horizontalPadding * 2 + implicitHeight: 36 + Layout.topMargin: 0 + Layout.bottomMargin: 0 + Layout.fillWidth: true + + visible: root.trayItemId !== undefined && root.trayItemId.length > 0 + + releaseAction: () => { + TrayService.togglePin(root.trayItemId); + root.close(); + } + + contentItem: RowLayout { + anchors { + verticalCenter: parent.verticalCenter + left: parent.left + right: parent.right + leftMargin: pinEntry.horizontalPadding + rightMargin: pinEntry.horizontalPadding + } + spacing: 8 + + MaterialSymbol { + iconSize: 18 + text: "push_pin" + } + + StyledText { + Layout.fillWidth: true + text: TrayService.isPinned(root.trayItemId) ? Translation.tr("Unpin") : Translation.tr("Pin") + } + } + } + + Rectangle { + Layout.fillWidth: true + implicitHeight: 1 + color: Appearance.colors.colSubtext + Layout.topMargin: 4 + Layout.bottomMargin: 4 + } Repeater { id: menuEntriesRepeater diff --git a/dots/.config/quickshell/ii/services/TrayService.qml b/dots/.config/quickshell/ii/services/TrayService.qml index a874c6c11..363b0fbde 100644 --- a/dots/.config/quickshell/ii/services/TrayService.qml +++ b/dots/.config/quickshell/ii/services/TrayService.qml @@ -33,12 +33,25 @@ Singleton { function unpin(itemId) { Config.options.tray.pinnedItems = Config.options.tray.pinnedItems.filter(id => id !== itemId); } + function isPinned(itemId) { + for (var i = 0; i < root.pinnedItems.length; i++) { + if (root.pinnedItems[i].id === itemId) + return true; + } + return false; + } + function togglePin(itemId) { - var pins = Config.options.tray.pinnedItems; - if (pins.includes(itemId)) { - unpin(itemId) + if (root.isPinned(itemId)) { + if (!root.invertPins) + unpin(itemId); + else + pin(itemId); } else { - pin(itemId) + if (!root.invertPins) + pin(itemId); + else + unpin(itemId); } } From a574baacc55c8ace544c25d4da9bbbadf389222d Mon Sep 17 00:00:00 2001 From: LilFishyChan Date: Tue, 17 Mar 2026 17:08:12 +0800 Subject: [PATCH 3/6] feat(translations): add "Pin" and "Unpin" labels to English and Chinese translations --- dots/.config/quickshell/ii/translations/en_US.json | 4 +++- dots/.config/quickshell/ii/translations/zh_CN.json | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dots/.config/quickshell/ii/translations/en_US.json b/dots/.config/quickshell/ii/translations/en_US.json index 2fbdc8e6d..82cae2c08 100644 --- a/dots/.config/quickshell/ii/translations/en_US.json +++ b/dots/.config/quickshell/ii/translations/en_US.json @@ -604,5 +604,7 @@ "Recognize music": "Recognize music", "Stroke width": "Stroke width", "Use varying shapes for password characters": "Use varying shapes for password characters", - "Battery full": "Battery full" + "Battery full": "Battery full", + "Pin": "Pin", + "Unpin": "Unpin" } \ No newline at end of file diff --git a/dots/.config/quickshell/ii/translations/zh_CN.json b/dots/.config/quickshell/ii/translations/zh_CN.json index 3b4c17d69..fd5d77266 100644 --- a/dots/.config/quickshell/ii/translations/zh_CN.json +++ b/dots/.config/quickshell/ii/translations/zh_CN.json @@ -718,5 +718,7 @@ "No applications": "没有应用", "Creativity": "创意", "Move left": "左移", - "Pin to Start": "固定到“开始”屏幕" + "Pin to Start": "固定到“开始”屏幕", + "Pin": "固定", + "Unpin": "取消固定" } \ No newline at end of file From 7a01602c5e8129595dab29d99de5d635591e4df7 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:19:10 +0100 Subject: [PATCH 4/6] fix weird indentation --- .../ii/modules/ii/bar/SysTrayItem.qml | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml index 45ce89258..859d04217 100644 --- a/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml +++ b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml @@ -1,3 +1,4 @@ +pragma ComponentBehavior: Bound import QtQuick import Quickshell import Quickshell.Services.SystemTray @@ -49,16 +50,16 @@ MouseArea { Component.onCompleted: this.open(); trayItemMenuHandle: root.item.menu trayItemId: root.item.id - anchor { - window: root.QsWindow.window - item: root - gravity: Config.options.bar.vertical - ? (Config.options.bar.bottom ? Edges.Left : Edges.Right) - : (Config.options.bar.bottom ? Edges.Top : Edges.Bottom) - edges: Config.options.bar.vertical - ? (Config.options.bar.bottom ? Edges.Left : Edges.Right) - : (Config.options.bar.bottom ? Edges.Top : Edges.Bottom) - } + anchor { + window: root.QsWindow.window + item: root + gravity: Config.options.bar.vertical + ? (Config.options.bar.bottom ? Edges.Left : Edges.Right) + : (Config.options.bar.bottom ? Edges.Top : Edges.Bottom) + edges: Config.options.bar.vertical + ? (Config.options.bar.bottom ? Edges.Left : Edges.Right) + : (Config.options.bar.bottom ? Edges.Top : Edges.Bottom) + } onMenuOpened: (window) => root.menuOpened(window); onMenuClosed: { root.menuClosed(); From fd2d69e4076d42abebed184a5a2173e698f56327 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:27:49 +0100 Subject: [PATCH 5/6] SysTrayMenu: hide pin button when in subpage, remove unnecessary close() --- .../quickshell/ii/modules/ii/bar/SysTrayMenu.qml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenu.qml b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenu.qml index cba4cf615..03c734b9d 100644 --- a/dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenu.qml +++ b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenu.qml @@ -1,3 +1,5 @@ +pragma ComponentBehavior: Bound + import qs.services import qs.modules.common import qs.modules.common.widgets @@ -184,12 +186,8 @@ PopupWindow { Layout.bottomMargin: 0 Layout.fillWidth: true - visible: root.trayItemId !== undefined && root.trayItemId.length > 0 - - releaseAction: () => { - TrayService.togglePin(root.trayItemId); - root.close(); - } + visible: root.trayItemId !== undefined && root.trayItemId.length > 0 && stackView.depth === 1 + releaseAction: () => TrayService.togglePin(root.trayItemId); contentItem: RowLayout { anchors { From 0362b21f5acc8c118309174c9ffb3694829e6da5 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:28:08 +0100 Subject: [PATCH 6/6] tray service: revert togglePin() for fewer if cases --- dots/.config/quickshell/ii/services/TrayService.qml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/dots/.config/quickshell/ii/services/TrayService.qml b/dots/.config/quickshell/ii/services/TrayService.qml index 363b0fbde..31966345c 100644 --- a/dots/.config/quickshell/ii/services/TrayService.qml +++ b/dots/.config/quickshell/ii/services/TrayService.qml @@ -42,16 +42,11 @@ Singleton { } function togglePin(itemId) { - if (root.isPinned(itemId)) { - if (!root.invertPins) - unpin(itemId); - else - pin(itemId); + var pins = Config.options.tray.pinnedItems; + if (pins.includes(itemId)) { + unpin(itemId) } else { - if (!root.invertPins) - pin(itemId); - else - unpin(itemId); + pin(itemId) } }