From 79dd2d6def4ef402bd188c7c12b0bea666b717a0 Mon Sep 17 00:00:00 2001 From: tibssy Date: Sun, 1 Mar 2026 23:57:32 +0000 Subject: [PATCH 01/11] feat(settings): add configuration for bar right-click actions --- Assets/Translations/en.json | 2 ++ Assets/settings-default.json | 1 + Assets/settings-search-index.json | 9 +++++++ Commons/Settings.qml | 1 + .../Settings/Tabs/Bar/BehaviorSubTab.qml | 24 +++++++++++++++++++ 5 files changed, 37 insertions(+) diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index e69d6215b..b4cdd1113 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -842,6 +842,8 @@ "behavior-wheel-wrap-label": "Wrap around", "behavior-workspace-scroll-description": "Choose what the mouse wheel does on empty areas of the bar.", "behavior-workspace-scroll-label": "Bar mouse wheel action", + "behavior-right-click-description": "Choose what right click does on empty areas of the bar.", + "behavior-right-click-label": "Bar right click action", "monitor-configure-widgets": "Configure widgets", "monitor-override-settings": "Override global settings", "monitor-override-settings-description": "Use custom settings for this monitor.", diff --git a/Assets/settings-default.json b/Assets/settings-default.json index 7a5658aac..4c0b842a1 100644 --- a/Assets/settings-default.json +++ b/Assets/settings-default.json @@ -70,6 +70,7 @@ ] }, "mouseWheelAction": "none", + "rightClickAction": "controlCenter", "reverseScroll": false, "mouseWheelWrap": true, "screenOverrides": [] diff --git a/Assets/settings-search-index.json b/Assets/settings-search-index.json index 0880c2fc9..854cfd959 100644 --- a/Assets/settings-search-index.json +++ b/Assets/settings-search-index.json @@ -377,6 +377,15 @@ "subTab": 2, "subTabLabel": "common.behavior" }, + { + "labelKey": "panels.bar.behavior-right-click-label", + "descriptionKey": "panels.bar.behavior-right-click-description", + "widget": "NComboBox", + "tab": 4, + "tabLabel": "panels.bar.title", + "subTab": 2, + "subTabLabel": "common.behavior" + }, { "labelKey": "panels.bar.monitor-override-settings", "descriptionKey": "panels.bar.monitor-override-settings-description", diff --git a/Commons/Settings.qml b/Commons/Settings.qml index bc1554b36..439f6045c 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -257,6 +257,7 @@ Singleton { ] } property string mouseWheelAction: "none" + property string rightClickAction: "controlCenter" property bool reverseScroll: false property bool mouseWheelWrap: true // Per-screen overrides for position and widgets diff --git a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml index f24b61463..7be411821 100644 --- a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml +++ b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml @@ -11,6 +11,7 @@ ColumnLayout { Layout.fillWidth: true readonly property string effectiveWheelAction: Settings.data.bar.mouseWheelAction || "none" + readonly property string effectiveRightClickAction: Settings.data.bar.rightClickAction || "controlCenter" NComboBox { Layout.fillWidth: true @@ -59,4 +60,27 @@ ColumnLayout { onToggled: checked => Settings.data.bar.mouseWheelWrap = checked visible: Settings.data.bar.mouseWheelAction === "workspace" } + + NComboBox { + Layout.fillWidth: true + label: I18n.tr("panels.bar.behavior-right-click-label") + description: I18n.tr("panels.bar.behavior-right-click-description") + model: [ + { + "key": "none", + "name": I18n.tr("common.none") + }, + { + "key": "controlCenter", + "name": I18n.tr("tooltips.open-control-center") + }, + { + "key": "settings", + "name": I18n.tr("tooltips.open-settings") + } + ] + currentKey: root.effectiveRightClickAction + defaultValue: Settings.getDefaultValue("bar.rightClickAction") + onSelected: key => Settings.data.bar.rightClickAction = key + } } From a228b6ade5039c55b3802d405ff546ddabec53ef Mon Sep 17 00:00:00 2001 From: tibssy Date: Mon, 2 Mar 2026 01:27:24 +0000 Subject: [PATCH 02/11] feat(bar): implement right-click action logic --- Modules/Bar/Bar.qml | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/Modules/Bar/Bar.qml b/Modules/Bar/Bar.qml index 935f3f48f..65ec108c0 100644 --- a/Modules/Bar/Bar.qml +++ b/Modules/Bar/Bar.qml @@ -7,6 +7,7 @@ import Quickshell.Wayland import qs.Commons import qs.Modules.Bar.Extras import qs.Modules.Notification +import qs.Modules.Panels.Settings import qs.Services.Compositor import qs.Services.UI import qs.Widgets @@ -187,6 +188,7 @@ Item { readonly property string barWheelAction: { return Settings.data.bar.mouseWheelAction || "none"; } + readonly property string barRightClickAction: Settings.data.bar.rightClickAction || "controlCenter" // Position and size the bar content based on orientation x: (root.barPosition === "right") ? (parent.width - root.barHeight) : 0 @@ -337,22 +339,30 @@ Item { MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton + enabled: bar.barRightClickAction !== "none" hoverEnabled: false preventStealing: true onClicked: mouse => { - if (mouse.button === Qt.RightButton) { - if (bar.isPointOverWidget(mouse.x, mouse.y)) - return; - var controlCenterPanel = PanelService.getPanel("controlCenterPanel", screen); - if (Settings.data.controlCenter.openAtMouseOnBarRightClick) { - var screenRelativePos = mapToItem(null, mouse.x, mouse.y); - controlCenterPanel?.toggle(null, screenRelativePos); - } else { - controlCenterPanel?.toggle(); - } - mouse.accepted = true; - } - } + if (mouse.button === Qt.RightButton) { + if (bar.isPointOverWidget(mouse.x, mouse.y)) + return; + if (bar.barRightClickAction === "controlCenter") { + // Click is on empty bar background - open control center + var controlCenterPanel = PanelService.getPanel("controlCenterPanel", screen); + + // Map click position to screen-relative coordinates + // We need to map from bar coordinates to screen coordinates + var screenRelativePos = mapToItem(null, mouse.x, mouse.y); + + // Pass click position directly + controlCenterPanel?.toggle(null, screenRelativePos); + mouse.accepted = true; + } else if (bar.barRightClickAction === "settings") { + SettingsPanelService.toggle(SettingsPanel.Tab.General, -1, screen); + mouse.accepted = true; + } + } + } } // Debounce timer for wheel interactions From 7fb0e8533be8a12da1857c0c2b7c938b01ea366e Mon Sep 17 00:00:00 2001 From: tibssy Date: Mon, 2 Mar 2026 02:16:23 +0000 Subject: [PATCH 03/11] feat(settings): add launcherPanel option for bar right-click actions --- Modules/Bar/Bar.qml | 5 +++++ Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/Modules/Bar/Bar.qml b/Modules/Bar/Bar.qml index 65ec108c0..023f3b454 100644 --- a/Modules/Bar/Bar.qml +++ b/Modules/Bar/Bar.qml @@ -360,6 +360,11 @@ Item { } else if (bar.barRightClickAction === "settings") { SettingsPanelService.toggle(SettingsPanel.Tab.General, -1, screen); mouse.accepted = true; + } else if (bar.barRightClickAction === "launcherPanel") { + var launcherPanel = PanelService.getPanel("launcherPanel", screen); + var screenRelativePos = mapToItem(null, mouse.x, mouse.y); + launcherPanel?.toggle(null, screenRelativePos); + mouse.accepted = true; } } } diff --git a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml index 7be411821..2c54a1d5e 100644 --- a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml +++ b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml @@ -77,6 +77,10 @@ ColumnLayout { { "key": "settings", "name": I18n.tr("tooltips.open-settings") + }, + { + "key": "launcherPanel", + "name": I18n.tr("actions.open-launcher") } ] currentKey: root.effectiveRightClickAction From 0d1a6d2e2562a2fef5245bcfb613d1cac283b40e Mon Sep 17 00:00:00 2001 From: tibssy Date: Mon, 2 Mar 2026 02:30:04 +0000 Subject: [PATCH 04/11] fix(launcher): adjust opening animation to follow bar position --- Modules/Panels/Launcher/Launcher.qml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Modules/Panels/Launcher/Launcher.qml b/Modules/Panels/Launcher/Launcher.qml index b055fdf1b..d0e235b4c 100644 --- a/Modules/Panels/Launcher/Launcher.qml +++ b/Modules/Panels/Launcher/Launcher.qml @@ -66,12 +66,12 @@ SmartPanel { return Settings.data.appLauncher.position; } } - panelAnchorHorizontalCenter: panelPosition === "center" || panelPosition.endsWith("_center") - panelAnchorVerticalCenter: panelPosition === "center" - panelAnchorLeft: panelPosition !== "center" && panelPosition.endsWith("_left") - panelAnchorRight: panelPosition !== "center" && panelPosition.endsWith("_right") - panelAnchorBottom: panelPosition.startsWith("bottom_") - panelAnchorTop: panelPosition.startsWith("top_") + panelAnchorHorizontalCenter: !root.useButtonPosition && (panelPosition === "center" || panelPosition.endsWith("_center")) + panelAnchorVerticalCenter: !root.useButtonPosition && panelPosition === "center" + panelAnchorLeft: !root.useButtonPosition && panelPosition !== "center" && panelPosition.endsWith("_left") + panelAnchorRight: !root.useButtonPosition && panelPosition !== "center" && panelPosition.endsWith("_right") + panelAnchorBottom: !root.useButtonPosition && panelPosition.startsWith("bottom_") + panelAnchorTop: !root.useButtonPosition && panelPosition.startsWith("top_") panelContent: Rectangle { id: ui From bd91405449caebe78edcec57facd81c7e8b9b695 Mon Sep 17 00:00:00 2001 From: tibssy Date: Mon, 2 Mar 2026 15:06:11 +0000 Subject: [PATCH 05/11] feat(bar): implement optional mouse-following for right-click panel placement --- Assets/Translations/en.json | 2 ++ Assets/settings-default.json | 1 + Assets/settings-search-index.json | 9 +++++++++ Commons/Settings.qml | 3 ++- Modules/Bar/Bar.qml | 4 ++-- Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml | 10 ++++++++++ 6 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index b4cdd1113..483a612b6 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -844,6 +844,8 @@ "behavior-workspace-scroll-label": "Bar mouse wheel action", "behavior-right-click-description": "Choose what right click does on empty areas of the bar.", "behavior-right-click-label": "Bar right click action", + "behavior-right-click-follow-mouse-description": "Open the selected panel at the cursor position.", + "behavior-right-click-follow-mouse-label": "Follow mouse position", "monitor-configure-widgets": "Configure widgets", "monitor-override-settings": "Override global settings", "monitor-override-settings-description": "Use custom settings for this monitor.", diff --git a/Assets/settings-default.json b/Assets/settings-default.json index 4c0b842a1..81f2e7239 100644 --- a/Assets/settings-default.json +++ b/Assets/settings-default.json @@ -71,6 +71,7 @@ }, "mouseWheelAction": "none", "rightClickAction": "controlCenter", + "rightClickFollowMouse": true, "reverseScroll": false, "mouseWheelWrap": true, "screenOverrides": [] diff --git a/Assets/settings-search-index.json b/Assets/settings-search-index.json index 854cfd959..a7bcd6b96 100644 --- a/Assets/settings-search-index.json +++ b/Assets/settings-search-index.json @@ -386,6 +386,15 @@ "subTab": 2, "subTabLabel": "common.behavior" }, + { + "labelKey": "panels.bar.behavior-right-click-follow-mouse-label", + "descriptionKey": "panels.bar.behavior-right-click-follow-mouse-description", + "widget": "NToggle", + "tab": 4, + "tabLabel": "panels.bar.title", + "subTab": 2, + "subTabLabel": "common.behavior" + }, { "labelKey": "panels.bar.monitor-override-settings", "descriptionKey": "panels.bar.monitor-override-settings-description", diff --git a/Commons/Settings.qml b/Commons/Settings.qml index 439f6045c..1d5b9377c 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -257,9 +257,10 @@ Singleton { ] } property string mouseWheelAction: "none" - property string rightClickAction: "controlCenter" property bool reverseScroll: false property bool mouseWheelWrap: true + property string rightClickAction: "controlCenter" + property bool rightClickFollowMouse: true // Per-screen overrides for position and widgets // Format: [{ "name": "HDMI-1", "position": "left" }, { "name": "DP-1", "position": "bottom", "widgets": {...} }] property list screenOverrides: [] diff --git a/Modules/Bar/Bar.qml b/Modules/Bar/Bar.qml index 023f3b454..1d1601b91 100644 --- a/Modules/Bar/Bar.qml +++ b/Modules/Bar/Bar.qml @@ -355,7 +355,7 @@ Item { var screenRelativePos = mapToItem(null, mouse.x, mouse.y); // Pass click position directly - controlCenterPanel?.toggle(null, screenRelativePos); + controlCenterPanel?.toggle(null, Settings.data.bar.rightClickFollowMouse ? screenRelativePos : "ControlCenter"); mouse.accepted = true; } else if (bar.barRightClickAction === "settings") { SettingsPanelService.toggle(SettingsPanel.Tab.General, -1, screen); @@ -363,7 +363,7 @@ Item { } else if (bar.barRightClickAction === "launcherPanel") { var launcherPanel = PanelService.getPanel("launcherPanel", screen); var screenRelativePos = mapToItem(null, mouse.x, mouse.y); - launcherPanel?.toggle(null, screenRelativePos); + launcherPanel?.toggle(null, Settings.data.bar.rightClickFollowMouse ? screenRelativePos : null); mouse.accepted = true; } } diff --git a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml index 2c54a1d5e..a6cc2b496 100644 --- a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml +++ b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml @@ -87,4 +87,14 @@ ColumnLayout { defaultValue: Settings.getDefaultValue("bar.rightClickAction") onSelected: key => Settings.data.bar.rightClickAction = key } + + NToggle { + Layout.fillWidth: true + label: I18n.tr("panels.bar.behavior-right-click-follow-mouse-label") + description: I18n.tr("panels.bar.behavior-right-click-follow-mouse-description") + checked: Settings.data.bar.rightClickFollowMouse + defaultValue: Settings.getDefaultValue("bar.rightClickFollowMouse") + onToggled: checked => Settings.data.bar.rightClickFollowMouse = checked + visible: Settings.data.bar.rightClickAction !== "none" && Settings.data.bar.rightClickAction !== "settings" + } } From 829babad2ae134a876a6a41c3969cc414c2b9f30 Mon Sep 17 00:00:00 2001 From: tibssy Date: Mon, 2 Mar 2026 23:52:34 +0000 Subject: [PATCH 06/11] feat(bar): extend rightClickFollowMouse support to the Settings panel --- Modules/Bar/Bar.qml | 15 ++++-------- Modules/Panels/Settings/SettingsPanel.qml | 24 ++++++++++++------- .../Settings/Tabs/Bar/BehaviorSubTab.qml | 2 +- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Modules/Bar/Bar.qml b/Modules/Bar/Bar.qml index 1d1601b91..7128e1708 100644 --- a/Modules/Bar/Bar.qml +++ b/Modules/Bar/Bar.qml @@ -347,23 +347,16 @@ Item { if (bar.isPointOverWidget(mouse.x, mouse.y)) return; if (bar.barRightClickAction === "controlCenter") { - // Click is on empty bar background - open control center var controlCenterPanel = PanelService.getPanel("controlCenterPanel", screen); - - // Map click position to screen-relative coordinates - // We need to map from bar coordinates to screen coordinates - var screenRelativePos = mapToItem(null, mouse.x, mouse.y); - - // Pass click position directly - controlCenterPanel?.toggle(null, Settings.data.bar.rightClickFollowMouse ? screenRelativePos : "ControlCenter"); + controlCenterPanel?.toggle(null, Settings.data.bar.rightClickFollowMouse ? mapToItem(null, mouse.x, mouse.y) : "ControlCenter"); mouse.accepted = true; } else if (bar.barRightClickAction === "settings") { - SettingsPanelService.toggle(SettingsPanel.Tab.General, -1, screen); + var settingsPanel = PanelService.getPanel("settingsPanel", screen); + settingsPanel?.toggle(null, Settings.data.bar.rightClickFollowMouse ? mapToItem(null, mouse.x, mouse.y) : null); mouse.accepted = true; } else if (bar.barRightClickAction === "launcherPanel") { var launcherPanel = PanelService.getPanel("launcherPanel", screen); - var screenRelativePos = mapToItem(null, mouse.x, mouse.y); - launcherPanel?.toggle(null, Settings.data.bar.rightClickFollowMouse ? screenRelativePos : null); + launcherPanel?.toggle(null, Settings.data.bar.rightClickFollowMouse ? mapToItem(null, mouse.x, mouse.y) : null); mouse.accepted = true; } } diff --git a/Modules/Panels/Settings/SettingsPanel.qml b/Modules/Panels/Settings/SettingsPanel.qml index af3ef58e2..98092d27c 100644 --- a/Modules/Panels/Settings/SettingsPanel.qml +++ b/Modules/Panels/Settings/SettingsPanel.qml @@ -25,12 +25,12 @@ SmartPanel { readonly property real barMarginV: barFloating ? Math.ceil(Settings.data.bar.marginVertical) : 0 forceAttachToBar: attachToBar - panelAnchorHorizontalCenter: attachToBar ? (barPosition === "top" || barPosition === "bottom") : true - panelAnchorVerticalCenter: attachToBar ? (barPosition === "left" || barPosition === "right") : true - panelAnchorTop: attachToBar && barPosition === "top" - panelAnchorBottom: attachToBar && barPosition === "bottom" - panelAnchorLeft: attachToBar && barPosition === "left" - panelAnchorRight: attachToBar && barPosition === "right" + panelAnchorHorizontalCenter: !root.useButtonPosition && (attachToBar ? (barPosition === "top" || barPosition === "bottom") : true) + panelAnchorVerticalCenter: !root.useButtonPosition && (attachToBar ? (barPosition === "left" || barPosition === "right") : true) + panelAnchorTop: !root.useButtonPosition && attachToBar && barPosition === "top" + panelAnchorBottom: !root.useButtonPosition && attachToBar && barPosition === "bottom" + panelAnchorLeft: !root.useButtonPosition && attachToBar && barPosition === "left" + panelAnchorRight: !root.useButtonPosition && attachToBar && barPosition === "right" onAttachToBarChanged: { if (isPanelOpen) { @@ -129,7 +129,15 @@ SmartPanel { // Panel mode: replicate SmartPanel.open() logic if (!buttonItem && buttonName) { - buttonItem = BarService.lookupWidget(buttonName, screen.name); + if (typeof buttonName === "object" && buttonName.x !== undefined && buttonName.y !== undefined) { + root.buttonItem = null; + root.buttonPosition = buttonName; + root.buttonWidth = 0; + root.buttonHeight = 0; + root.useButtonPosition = true; + } else { + buttonItem = BarService.lookupWidget(buttonName, screen.name); + } } if (buttonItem) { @@ -139,7 +147,7 @@ SmartPanel { root.buttonWidth = buttonItem.width; root.buttonHeight = buttonItem.height; root.useButtonPosition = true; - } else { + } else if (!(buttonName && typeof buttonName === "object" && buttonName.x !== undefined && buttonName.y !== undefined)) { root.buttonItem = null; root.useButtonPosition = false; } diff --git a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml index a6cc2b496..1032b8a20 100644 --- a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml +++ b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml @@ -95,6 +95,6 @@ ColumnLayout { checked: Settings.data.bar.rightClickFollowMouse defaultValue: Settings.getDefaultValue("bar.rightClickFollowMouse") onToggled: checked => Settings.data.bar.rightClickFollowMouse = checked - visible: Settings.data.bar.rightClickAction !== "none" && Settings.data.bar.rightClickAction !== "settings" + visible: Settings.data.bar.rightClickAction !== "none" && !(Settings.data.bar.rightClickAction === "settings" && Settings.data.ui.settingsPanelMode === "window") } } From f1b5e41d3a99c516f4e6b3271021b7056fbf36c5 Mon Sep 17 00:00:00 2001 From: tibssy Date: Tue, 3 Mar 2026 00:53:53 +0000 Subject: [PATCH 07/11] feat(bar): implement middle-click action support for Bar Behavior --- Assets/Translations/en.json | 8 +++- Assets/settings-default.json | 2 + Assets/settings-search-index.json | 18 ++++++++ Commons/Settings.qml | 2 + Modules/Bar/Bar.qml | 43 ++++++++++++------- .../Settings/Tabs/Bar/BehaviorSubTab.qml | 38 ++++++++++++++++ 6 files changed, 94 insertions(+), 17 deletions(-) diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index 483a612b6..fb16ad949 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -842,10 +842,14 @@ "behavior-wheel-wrap-label": "Wrap around", "behavior-workspace-scroll-description": "Choose what the mouse wheel does on empty areas of the bar.", "behavior-workspace-scroll-label": "Bar mouse wheel action", + "behavior-middle-click-description": "Choose what middle click does on empty areas of the bar.", + "behavior-middle-click-label": "Bar middle click action", + "behavior-middle-click-follow-mouse-description": "Open the selected middle-click panel at the cursor position.", + "behavior-middle-click-follow-mouse-label": "Middle click follow mouse", "behavior-right-click-description": "Choose what right click does on empty areas of the bar.", "behavior-right-click-label": "Bar right click action", - "behavior-right-click-follow-mouse-description": "Open the selected panel at the cursor position.", - "behavior-right-click-follow-mouse-label": "Follow mouse position", + "behavior-right-click-follow-mouse-description": "Open the selected right-click panel at the cursor position.", + "behavior-right-click-follow-mouse-label": "Right click follow mouse", "monitor-configure-widgets": "Configure widgets", "monitor-override-settings": "Override global settings", "monitor-override-settings-description": "Use custom settings for this monitor.", diff --git a/Assets/settings-default.json b/Assets/settings-default.json index 81f2e7239..c9133fe7c 100644 --- a/Assets/settings-default.json +++ b/Assets/settings-default.json @@ -70,6 +70,8 @@ ] }, "mouseWheelAction": "none", + "middleClickAction": "none", + "middleClickFollowMouse": false, "rightClickAction": "controlCenter", "rightClickFollowMouse": true, "reverseScroll": false, diff --git a/Assets/settings-search-index.json b/Assets/settings-search-index.json index a7bcd6b96..154398835 100644 --- a/Assets/settings-search-index.json +++ b/Assets/settings-search-index.json @@ -377,6 +377,24 @@ "subTab": 2, "subTabLabel": "common.behavior" }, + { + "labelKey": "panels.bar.behavior-middle-click-label", + "descriptionKey": "panels.bar.behavior-middle-click-description", + "widget": "NComboBox", + "tab": 4, + "tabLabel": "panels.bar.title", + "subTab": 2, + "subTabLabel": "common.behavior" + }, + { + "labelKey": "panels.bar.behavior-middle-click-follow-mouse-label", + "descriptionKey": "panels.bar.behavior-middle-click-follow-mouse-description", + "widget": "NToggle", + "tab": 4, + "tabLabel": "panels.bar.title", + "subTab": 2, + "subTabLabel": "common.behavior" + }, { "labelKey": "panels.bar.behavior-right-click-label", "descriptionKey": "panels.bar.behavior-right-click-description", diff --git a/Commons/Settings.qml b/Commons/Settings.qml index 1d5b9377c..336ed3659 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -259,6 +259,8 @@ Singleton { property string mouseWheelAction: "none" property bool reverseScroll: false property bool mouseWheelWrap: true + property string middleClickAction: "none" + property bool middleClickFollowMouse: false property string rightClickAction: "controlCenter" property bool rightClickFollowMouse: true // Per-screen overrides for position and widgets diff --git a/Modules/Bar/Bar.qml b/Modules/Bar/Bar.qml index 7128e1708..c98f7d8b9 100644 --- a/Modules/Bar/Bar.qml +++ b/Modules/Bar/Bar.qml @@ -336,29 +336,42 @@ Item { CompositorService.switchToWorkspace(candidates[next]); } + function handleEmptyBarClick(action, followMouse, mouse) { + if (action === "none") + return; + if (action === "controlCenter") { + var controlCenterPanel = PanelService.getPanel("controlCenterPanel", screen); + controlCenterPanel?.toggle(null, followMouse ? mapToItem(null, mouse.x, mouse.y) : "ControlCenter"); + mouse.accepted = true; + } else if (action === "settings") { + var settingsPanel = PanelService.getPanel("settingsPanel", screen); + settingsPanel?.toggle(null, followMouse ? mapToItem(null, mouse.x, mouse.y) : null); + mouse.accepted = true; + } else if (action === "launcherPanel") { + var launcherPanel = PanelService.getPanel("launcherPanel", screen); + launcherPanel?.toggle(null, followMouse ? mapToItem(null, mouse.x, mouse.y) : null); + mouse.accepted = true; + } + } + MouseArea { anchors.fill: parent - acceptedButtons: Qt.RightButton - enabled: bar.barRightClickAction !== "none" + acceptedButtons: Qt.RightButton | Qt.MiddleButton + enabled: bar.barRightClickAction !== "none" || Settings.data.bar.middleClickAction !== "none" hoverEnabled: false preventStealing: true onClicked: mouse => { if (mouse.button === Qt.RightButton) { if (bar.isPointOverWidget(mouse.x, mouse.y)) return; - if (bar.barRightClickAction === "controlCenter") { - var controlCenterPanel = PanelService.getPanel("controlCenterPanel", screen); - controlCenterPanel?.toggle(null, Settings.data.bar.rightClickFollowMouse ? mapToItem(null, mouse.x, mouse.y) : "ControlCenter"); - mouse.accepted = true; - } else if (bar.barRightClickAction === "settings") { - var settingsPanel = PanelService.getPanel("settingsPanel", screen); - settingsPanel?.toggle(null, Settings.data.bar.rightClickFollowMouse ? mapToItem(null, mouse.x, mouse.y) : null); - mouse.accepted = true; - } else if (bar.barRightClickAction === "launcherPanel") { - var launcherPanel = PanelService.getPanel("launcherPanel", screen); - launcherPanel?.toggle(null, Settings.data.bar.rightClickFollowMouse ? mapToItem(null, mouse.x, mouse.y) : null); - mouse.accepted = true; - } + bar.handleEmptyBarClick(bar.barRightClickAction, Settings.data.bar.rightClickFollowMouse, mouse); + return; + } + if (mouse.button === Qt.MiddleButton) { + if (bar.isPointOverWidget(mouse.x, mouse.y)) + return; + bar.handleEmptyBarClick(Settings.data.bar.middleClickAction || "none", Settings.data.bar.middleClickFollowMouse, mouse); + return; } } } diff --git a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml index 1032b8a20..275f6c879 100644 --- a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml +++ b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml @@ -11,6 +11,7 @@ ColumnLayout { Layout.fillWidth: true readonly property string effectiveWheelAction: Settings.data.bar.mouseWheelAction || "none" + readonly property string effectiveMiddleClickAction: Settings.data.bar.middleClickAction || "none" readonly property string effectiveRightClickAction: Settings.data.bar.rightClickAction || "controlCenter" NComboBox { @@ -61,6 +62,43 @@ ColumnLayout { visible: Settings.data.bar.mouseWheelAction === "workspace" } + NComboBox { + Layout.fillWidth: true + label: I18n.tr("panels.bar.behavior-middle-click-label") + description: I18n.tr("panels.bar.behavior-middle-click-description") + model: [ + { + "key": "none", + "name": I18n.tr("common.none") + }, + { + "key": "controlCenter", + "name": I18n.tr("tooltips.open-control-center") + }, + { + "key": "settings", + "name": I18n.tr("tooltips.open-settings") + }, + { + "key": "launcherPanel", + "name": I18n.tr("actions.open-launcher") + } + ] + currentKey: root.effectiveMiddleClickAction + defaultValue: Settings.getDefaultValue("bar.middleClickAction") + onSelected: key => Settings.data.bar.middleClickAction = key + } + + NToggle { + Layout.fillWidth: true + label: I18n.tr("panels.bar.behavior-middle-click-follow-mouse-label") + description: I18n.tr("panels.bar.behavior-middle-click-follow-mouse-description") + checked: Settings.data.bar.middleClickFollowMouse + defaultValue: Settings.getDefaultValue("bar.middleClickFollowMouse") + onToggled: checked => Settings.data.bar.middleClickFollowMouse = checked + visible: Settings.data.bar.middleClickAction !== "none" && !(Settings.data.bar.middleClickAction === "settings" && Settings.data.ui.settingsPanelMode === "window") + } + NComboBox { Layout.fillWidth: true label: I18n.tr("panels.bar.behavior-right-click-label") From 646d4e63382968ee027b71cb60dfd25aef4ca484 Mon Sep 17 00:00:00 2001 From: tibssy Date: Tue, 3 Mar 2026 01:14:51 +0000 Subject: [PATCH 08/11] fix(i18n): add missing scroll behavior translations --- Assets/Translations/en.json | 2 ++ Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index fb16ad949..b8c89a9b6 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -842,6 +842,8 @@ "behavior-wheel-wrap-label": "Wrap around", "behavior-workspace-scroll-description": "Choose what the mouse wheel does on empty areas of the bar.", "behavior-workspace-scroll-label": "Bar mouse wheel action", + "behavior-workspace-scroll-option-content": "Content", + "behavior-workspace-scroll-option-workspace": "Workspace", "behavior-middle-click-description": "Choose what middle click does on empty areas of the bar.", "behavior-middle-click-label": "Bar middle click action", "behavior-middle-click-follow-mouse-description": "Open the selected middle-click panel at the cursor position.", diff --git a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml index 275f6c879..182a6a8e4 100644 --- a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml +++ b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml @@ -22,17 +22,17 @@ ColumnLayout { var items = [ { "key": "none", - "name": "Nothing" + "name": I18n.tr("common.none") }, { "key": "workspace", - "name": "Workspace" + "name": I18n.tr("panels.bar.behavior-workspace-scroll-option-workspace") } ]; if (CompositorService.isNiri) { items.push({ "key": "content", - "name": "Content" + "name": I18n.tr("panels.bar.behavior-workspace-scroll-option-content") }); } return items; From ef166d8ea7a6592017913f1c6cf958bb96f81dfd Mon Sep 17 00:00:00 2001 From: tibssy Date: Tue, 3 Mar 2026 02:43:10 +0000 Subject: [PATCH 09/11] refactor(settings): remove redundant right-click option from control center --- Assets/settings-default.json | 1 - Assets/settings-search-index.json | 9 -------- Commons/Migrations/Migration55.qml | 22 +++++++++++++++++++ Commons/Migrations/MigrationRegistry.qml | 4 +++- Commons/Settings.qml | 3 +-- .../Tabs/ControlCenter/AppearanceSubTab.qml | 8 ------- 6 files changed, 26 insertions(+), 21 deletions(-) create mode 100644 Commons/Migrations/Migration55.qml diff --git a/Assets/settings-default.json b/Assets/settings-default.json index c9133fe7c..ca2a5f32f 100644 --- a/Assets/settings-default.json +++ b/Assets/settings-default.json @@ -248,7 +248,6 @@ }, "controlCenter": { "position": "close_to_bar_button", - "openAtMouseOnBarRightClick": true, "diskPath": "/", "shortcuts": { "left": [ diff --git a/Assets/settings-search-index.json b/Assets/settings-search-index.json index 154398835..23ce77bda 100644 --- a/Assets/settings-search-index.json +++ b/Assets/settings-search-index.json @@ -584,15 +584,6 @@ "subTab": 0, "subTabLabel": "common.appearance" }, - { - "labelKey": "panels.control-center.open-at-mouse-label", - "descriptionKey": "panels.control-center.open-at-mouse-description", - "widget": "NToggle", - "tab": 7, - "tabLabel": "panels.control-center.title", - "subTab": 0, - "subTabLabel": "common.appearance" - }, { "labelKey": "panels.control-center.system-monitor-disk-path-label", "descriptionKey": "panels.control-center.system-monitor-disk-path-description", diff --git a/Commons/Migrations/Migration55.qml b/Commons/Migrations/Migration55.qml new file mode 100644 index 000000000..dcb249df3 --- /dev/null +++ b/Commons/Migrations/Migration55.qml @@ -0,0 +1,22 @@ +import QtQuick + +QtObject { + id: root + + function migrate(adapter, logger, rawJson) { + logger.i("Settings", "Migrating settings to v55"); + + // Check if the old setting exists + if (rawJson.controlCenter && rawJson.controlCenter.openAtMouseOnBarRightClick !== undefined) { + + if (!rawJson.bar) rawJson.bar = {}; + + rawJson.bar.rightClickFollowMouse = rawJson.controlCenter.openAtMouseOnBarRightClick; + delete rawJson.controlCenter.openAtMouseOnBarRightClick; + + logger.i("Settings", "Successfully moved openAtMouseOnBarRightClick to bar.rightClickFollowMouse"); + } + + return true; + } +} diff --git a/Commons/Migrations/MigrationRegistry.qml b/Commons/Migrations/MigrationRegistry.qml index 0ff2a5681..72f8943e6 100644 --- a/Commons/Migrations/MigrationRegistry.qml +++ b/Commons/Migrations/MigrationRegistry.qml @@ -26,7 +26,8 @@ QtObject { 49: migration49Component, 50: migration50Component, 53: migration53Component, - 54: migration54Component + 54: migration54Component, + 55: migration55Component }) // Migration components @@ -50,4 +51,5 @@ QtObject { property Component migration50Component: Migration50 {} property Component migration53Component: Migration53 {} property Component migration54Component: Migration54 {} + property Component migration55Component: Migration55 {} } diff --git a/Commons/Settings.qml b/Commons/Settings.qml index 336ed3659..92a3ce318 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -25,7 +25,7 @@ Singleton { - Default cache directory: ~/.cache/noctalia */ readonly property alias data: adapter // Used to access via Settings.data.xxx.yyy - readonly property int settingsVersion: 54 + readonly property int settingsVersion: 55 property bool isDebug: Quickshell.env("NOCTALIA_DEBUG") === "1" readonly property string shellName: "noctalia" readonly property string configDir: Quickshell.env("NOCTALIA_CONFIG_DIR") || (Quickshell.env("XDG_CONFIG_HOME") || Quickshell.env("HOME") + "/.config") + "/" + shellName + "/" @@ -442,7 +442,6 @@ Singleton { property JsonObject controlCenter: JsonObject { // Position: close_to_bar_button, center, top_left, top_right, bottom_left, bottom_right, bottom_center, top_center property string position: "close_to_bar_button" - property bool openAtMouseOnBarRightClick: true property string diskPath: "/" property JsonObject shortcuts shortcuts: JsonObject { diff --git a/Modules/Panels/Settings/Tabs/ControlCenter/AppearanceSubTab.qml b/Modules/Panels/Settings/Tabs/ControlCenter/AppearanceSubTab.qml index dc7055f69..279d0d160 100644 --- a/Modules/Panels/Settings/Tabs/ControlCenter/AppearanceSubTab.qml +++ b/Modules/Panels/Settings/Tabs/ControlCenter/AppearanceSubTab.qml @@ -63,14 +63,6 @@ ColumnLayout { defaultValue: Settings.getDefaultValue("controlCenter.position") } - NToggle { - label: I18n.tr("panels.control-center.open-at-mouse-label") - description: I18n.tr("panels.control-center.open-at-mouse-description") - checked: Settings.data.controlCenter.openAtMouseOnBarRightClick - onToggled: checked => Settings.data.controlCenter.openAtMouseOnBarRightClick = checked - defaultValue: Settings.getDefaultValue("controlCenter.openAtMouseOnBarRightClick") - } - NComboBox { id: diskPathComboBox Layout.fillWidth: true From fa3f4a9b88802a368d20af03d733330363df6391 Mon Sep 17 00:00:00 2001 From: tibssy Date: Tue, 3 Mar 2026 19:31:33 +0000 Subject: [PATCH 10/11] feat(bar): add custom command support for bar mouse actions --- Assets/Translations/en.json | 6 +++ Assets/settings-default.json | 2 + Assets/settings-search-index.json | 18 ++++++++ Commons/Settings.qml | 2 + Modules/Bar/Bar.qml | 46 +++++++++++++++++-- .../Settings/Tabs/Bar/BehaviorSubTab.qml | 34 +++++++++++++- 6 files changed, 103 insertions(+), 5 deletions(-) diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index b8c89a9b6..d56577272 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -848,10 +848,16 @@ "behavior-middle-click-label": "Bar middle click action", "behavior-middle-click-follow-mouse-description": "Open the selected middle-click panel at the cursor position.", "behavior-middle-click-follow-mouse-label": "Middle click follow mouse", + "behavior-middle-click-command-description": "Command to execute on middle click.", + "behavior-middle-click-command-label": "Middle click command", + "behavior-middle-click-command-placeholder": "niri msg action toggle-overview", "behavior-right-click-description": "Choose what right click does on empty areas of the bar.", "behavior-right-click-label": "Bar right click action", "behavior-right-click-follow-mouse-description": "Open the selected right-click panel at the cursor position.", "behavior-right-click-follow-mouse-label": "Right click follow mouse", + "behavior-right-click-command-description": "Command to execute on right click.", + "behavior-right-click-command-label": "Right click command", + "behavior-right-click-command-placeholder": "notify-send \"Right click\"", "monitor-configure-widgets": "Configure widgets", "monitor-override-settings": "Override global settings", "monitor-override-settings-description": "Use custom settings for this monitor.", diff --git a/Assets/settings-default.json b/Assets/settings-default.json index ca2a5f32f..b0879664b 100644 --- a/Assets/settings-default.json +++ b/Assets/settings-default.json @@ -72,8 +72,10 @@ "mouseWheelAction": "none", "middleClickAction": "none", "middleClickFollowMouse": false, + "middleClickCommand": "", "rightClickAction": "controlCenter", "rightClickFollowMouse": true, + "rightClickCommand": "", "reverseScroll": false, "mouseWheelWrap": true, "screenOverrides": [] diff --git a/Assets/settings-search-index.json b/Assets/settings-search-index.json index 23ce77bda..04377ee5b 100644 --- a/Assets/settings-search-index.json +++ b/Assets/settings-search-index.json @@ -395,6 +395,15 @@ "subTab": 2, "subTabLabel": "common.behavior" }, + { + "labelKey": "panels.bar.behavior-middle-click-command-label", + "descriptionKey": "panels.bar.behavior-middle-click-command-description", + "widget": "NTextInput", + "tab": 4, + "tabLabel": "panels.bar.title", + "subTab": 2, + "subTabLabel": "common.behavior" + }, { "labelKey": "panels.bar.behavior-right-click-label", "descriptionKey": "panels.bar.behavior-right-click-description", @@ -413,6 +422,15 @@ "subTab": 2, "subTabLabel": "common.behavior" }, + { + "labelKey": "panels.bar.behavior-right-click-command-label", + "descriptionKey": "panels.bar.behavior-right-click-command-description", + "widget": "NTextInput", + "tab": 4, + "tabLabel": "panels.bar.title", + "subTab": 2, + "subTabLabel": "common.behavior" + }, { "labelKey": "panels.bar.monitor-override-settings", "descriptionKey": "panels.bar.monitor-override-settings-description", diff --git a/Commons/Settings.qml b/Commons/Settings.qml index 92a3ce318..d90b01684 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -261,8 +261,10 @@ Singleton { property bool mouseWheelWrap: true property string middleClickAction: "none" property bool middleClickFollowMouse: false + property string middleClickCommand: "" property string rightClickAction: "controlCenter" property bool rightClickFollowMouse: true + property string rightClickCommand: "" // Per-screen overrides for position and widgets // Format: [{ "name": "HDMI-1", "position": "left" }, { "name": "DP-1", "position": "bottom", "widgets": {...} }] property list screenOverrides: [] diff --git a/Modules/Bar/Bar.qml b/Modules/Bar/Bar.qml index c98f7d8b9..3f12b6146 100644 --- a/Modules/Bar/Bar.qml +++ b/Modules/Bar/Bar.qml @@ -336,7 +336,7 @@ Item { CompositorService.switchToWorkspace(candidates[next]); } - function handleEmptyBarClick(action, followMouse, mouse) { + function handleEmptyBarClick(action, followMouse, command, mouse) { if (action === "none") return; if (action === "controlCenter") { @@ -351,6 +351,46 @@ Item { var launcherPanel = PanelService.getPanel("launcherPanel", screen); launcherPanel?.toggle(null, followMouse ? mapToItem(null, mouse.x, mouse.y) : null); mouse.accepted = true; + } else if (action === "command") { + runCustomCommand(command); + mouse.accepted = true; + } + } + + function runCustomCommand(command) { + if (!command || command.trim() === "") + return; + + const processString = "import QtQuick; import Quickshell.Io; Process { command: [\"sh\", \"-lc\", \"\"] }"; + + try { + const processObj = Qt.createQmlObject(processString, root, "BarCommandProcess_" + Date.now()); + processObj.command = ["sh", "-lc", command]; + + processObj.exited.connect(function (exitCode) { + if (exitCode !== 0) { + ToastService.showError( + I18n.tr("toast.custom-command-failed.title"), + I18n.tr("toast.custom-command-failed.description", { + command: command, + code: exitCode + }) + ); + } + processObj.destroy(); + }); + + processObj.running = true; + Logger.i("Bar", `Executing command: ${command}`); + } catch (e) { + Logger.e("Bar", "Failed to start custom command:", e); + ToastService.showError( + I18n.tr("toast.custom-command-failed.title"), + I18n.tr("toast.custom-command-failed.description", { + command: command, + code: "start_error" + }) + ); } } @@ -364,13 +404,13 @@ Item { if (mouse.button === Qt.RightButton) { if (bar.isPointOverWidget(mouse.x, mouse.y)) return; - bar.handleEmptyBarClick(bar.barRightClickAction, Settings.data.bar.rightClickFollowMouse, mouse); + bar.handleEmptyBarClick(bar.barRightClickAction, Settings.data.bar.rightClickFollowMouse, Settings.data.bar.rightClickCommand, mouse); return; } if (mouse.button === Qt.MiddleButton) { if (bar.isPointOverWidget(mouse.x, mouse.y)) return; - bar.handleEmptyBarClick(Settings.data.bar.middleClickAction || "none", Settings.data.bar.middleClickFollowMouse, mouse); + bar.handleEmptyBarClick(Settings.data.bar.middleClickAction || "none", Settings.data.bar.middleClickFollowMouse, Settings.data.bar.middleClickCommand, mouse); return; } } diff --git a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml index 182a6a8e4..7ff6ee77f 100644 --- a/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml +++ b/Modules/Panels/Settings/Tabs/Bar/BehaviorSubTab.qml @@ -82,6 +82,10 @@ ColumnLayout { { "key": "launcherPanel", "name": I18n.tr("actions.open-launcher") + }, + { + "key": "command", + "name": I18n.tr("actions.run-custom-command") } ] currentKey: root.effectiveMiddleClickAction @@ -89,6 +93,17 @@ ColumnLayout { onSelected: key => Settings.data.bar.middleClickAction = key } + NTextInput { + Layout.fillWidth: true + label: I18n.tr("panels.bar.behavior-middle-click-command-label") + description: I18n.tr("panels.bar.behavior-middle-click-command-description") + placeholderText: I18n.tr("panels.bar.behavior-middle-click-command-placeholder") + text: Settings.data.bar.middleClickCommand + fontFamily: Settings.data.ui.fontFixed + onTextChanged: Settings.data.bar.middleClickCommand = text + visible: Settings.data.bar.middleClickAction === "command" + } + NToggle { Layout.fillWidth: true label: I18n.tr("panels.bar.behavior-middle-click-follow-mouse-label") @@ -96,7 +111,7 @@ ColumnLayout { checked: Settings.data.bar.middleClickFollowMouse defaultValue: Settings.getDefaultValue("bar.middleClickFollowMouse") onToggled: checked => Settings.data.bar.middleClickFollowMouse = checked - visible: Settings.data.bar.middleClickAction !== "none" && !(Settings.data.bar.middleClickAction === "settings" && Settings.data.ui.settingsPanelMode === "window") + visible: Settings.data.bar.middleClickAction !== "none" && Settings.data.bar.middleClickAction !== "command" && !(Settings.data.bar.middleClickAction === "settings" && Settings.data.ui.settingsPanelMode === "window") } NComboBox { @@ -119,6 +134,10 @@ ColumnLayout { { "key": "launcherPanel", "name": I18n.tr("actions.open-launcher") + }, + { + "key": "command", + "name": I18n.tr("actions.run-custom-command") } ] currentKey: root.effectiveRightClickAction @@ -126,6 +145,17 @@ ColumnLayout { onSelected: key => Settings.data.bar.rightClickAction = key } + NTextInput { + Layout.fillWidth: true + label: I18n.tr("panels.bar.behavior-right-click-command-label") + description: I18n.tr("panels.bar.behavior-right-click-command-description") + placeholderText: I18n.tr("panels.bar.behavior-right-click-command-placeholder") + text: Settings.data.bar.rightClickCommand + fontFamily: Settings.data.ui.fontFixed + onTextChanged: Settings.data.bar.rightClickCommand = text + visible: Settings.data.bar.rightClickAction === "command" + } + NToggle { Layout.fillWidth: true label: I18n.tr("panels.bar.behavior-right-click-follow-mouse-label") @@ -133,6 +163,6 @@ ColumnLayout { checked: Settings.data.bar.rightClickFollowMouse defaultValue: Settings.getDefaultValue("bar.rightClickFollowMouse") onToggled: checked => Settings.data.bar.rightClickFollowMouse = checked - visible: Settings.data.bar.rightClickAction !== "none" && !(Settings.data.bar.rightClickAction === "settings" && Settings.data.ui.settingsPanelMode === "window") + visible: Settings.data.bar.rightClickAction !== "none" && Settings.data.bar.rightClickAction !== "command" && !(Settings.data.bar.rightClickAction === "settings" && Settings.data.ui.settingsPanelMode === "window") } } From 6fbe7e6ccf6ec6f44d3395fadc34bb64b96f2301 Mon Sep 17 00:00:00 2001 From: tibssy Date: Tue, 3 Mar 2026 20:32:02 +0000 Subject: [PATCH 11/11] refactor(bar): remove verbose logging from custom command execution --- Modules/Bar/Bar.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/Bar/Bar.qml b/Modules/Bar/Bar.qml index 3f12b6146..5ba249bff 100644 --- a/Modules/Bar/Bar.qml +++ b/Modules/Bar/Bar.qml @@ -381,7 +381,6 @@ Item { }); processObj.running = true; - Logger.i("Bar", `Executing command: ${command}`); } catch (e) { Logger.e("Bar", "Failed to start custom command:", e); ToastService.showError(