From 4b0dfa67a0351986a6fa9c071d43d717d53cccfe Mon Sep 17 00:00:00 2001 From: bbedward Date: Wed, 7 Oct 2026 15:16:37 -0400 Subject: [PATCH] desktop: add right click context menu for actions on compositors where it doesnt interfere, with a setting to turn it off Some compositors like kwin/labwc/sway cannot have this without breaking some built in layering they do. niri can have this, but for focus follow mouse it may need to be disabled. fixes #3717 --- quickshell/Common/SettingsData.qml | 1 + quickshell/Common/settings/SettingsSpec.js | 3 + quickshell/DMSShell.qml | 4 + .../Modals/Settings/SettingsSidebar.qml | 5 +- .../Components/CcWidgetSheet.qml | 20 ++- quickshell/Modules/DesktopContextMenu.qml | 48 ++++++ .../Modules/Plugins/WidgetEditorOverlay.qml | 5 +- .../Modules/Settings/ColorDropdownRow.qml | 3 +- .../Modules/Settings/DBarAppearanceTab.qml | 24 +-- quickshell/Modules/Settings/DBarTab.qml | 2 + .../Modules/Settings/DesktopWidgetsTab.qml | 18 ++ .../Modules/Settings/ThemeColorsTab.qml | 12 +- .../Widgets/SettingsToggleSliderRow.qml | 3 +- quickshell/Modules/WallpaperBackground.qml | 24 ++- quickshell/Services/CompositorService.qml | 14 ++ quickshell/Services/DesktopWidgetRegistry.qml | 11 ++ quickshell/Services/PopoutService.qml | 1 + quickshell/Services/SettingsSearchService.qml | 3 +- .../translations/extract_settings_index.py | 9 + .../translations/settings_search_index.json | 159 ++++++++++++++---- 20 files changed, 301 insertions(+), 68 deletions(-) create mode 100644 quickshell/Modules/DesktopContextMenu.qml diff --git a/quickshell/Common/SettingsData.qml b/quickshell/Common/SettingsData.qml index 255e23777..d2b40052e 100644 --- a/quickshell/Common/SettingsData.qml +++ b/quickshell/Common/SettingsData.qml @@ -1131,6 +1131,7 @@ Singleton { property var desktopWidgetInstances: Spec.SPEC.desktopWidgetInstances.def property var desktopWidgetGroups: Spec.SPEC.desktopWidgetGroups.def + property string desktopContextMenu: Spec.SPEC.desktopContextMenu.def property var lockScreenWidgetInstances: Spec.SPEC.lockScreenWidgetInstances.def property var greeterWidgetInstances: Spec.SPEC.greeterWidgetInstances.def property bool greeterFollowLockScreen: Spec.SPEC.greeterFollowLockScreen.def diff --git a/quickshell/Common/settings/SettingsSpec.js b/quickshell/Common/settings/SettingsSpec.js index 1f8c5e3f6..dcc1c8fb9 100644 --- a/quickshell/Common/settings/SettingsSpec.js +++ b/quickshell/Common/settings/SettingsSpec.js @@ -1493,6 +1493,9 @@ var LOCAL_SPEC = { desktopWidgetGroups: { def: [] }, + desktopContextMenu: { + def: "auto" + }, builtInPluginSettings: { def: {} }, diff --git a/quickshell/DMSShell.qml b/quickshell/DMSShell.qml index 573787502..73e07a840 100644 --- a/quickshell/DMSShell.qml +++ b/quickshell/DMSShell.qml @@ -61,6 +61,10 @@ Item { DesktopWidgetEditor {} + DesktopContextMenu { + Component.onCompleted: PopoutService.desktopContextMenu = this + } + Lock { id: lock } diff --git a/quickshell/Modals/Settings/SettingsSidebar.qml b/quickshell/Modals/Settings/SettingsSidebar.qml index 70a664cad..8a09fd0ac 100644 --- a/quickshell/Modals/Settings/SettingsSidebar.qml +++ b/quickshell/Modals/Settings/SettingsSidebar.qml @@ -393,7 +393,10 @@ Item { hint: modelData.category accent: SettingsTabs.accentFor(modelData.page || SettingsTabs.pageForTabIndex(modelData.tabIndex)) active: root.searchSelectedIndex === index - onClicked: keyboard => root.selectSearchResult(modelData, keyboard) + onClicked: keyboard => { + root.searchSelectedIndex = index; + root.selectSearchResult(modelData, keyboard); + } } } diff --git a/quickshell/Modules/ControlCenter/Components/CcWidgetSheet.qml b/quickshell/Modules/ControlCenter/Components/CcWidgetSheet.qml index 6bf50e02f..8795b1b11 100644 --- a/quickshell/Modules/ControlCenter/Components/CcWidgetSheet.qml +++ b/quickshell/Modules/ControlCenter/Components/CcWidgetSheet.qml @@ -152,10 +152,9 @@ DBottomSheet { signal chosen(string widgetId) signal toggleRequested - height: expanded ? items.y + items.implicitHeight + Theme.spacingL : collapsedHeight + height: expanded ? itemsClip.y + items.implicitHeight + Theme.spacingL : collapsedHeight radius: Theme.cornerRadiusXL color: CcMetrics.rowColor - clip: true Behavior on height { enabled: CcMetrics.animationsEnabled @@ -237,15 +236,22 @@ DBottomSheet { } } - PreviewGrid { - id: items + Item { + id: itemsClip x: Theme.spacingL y: header.height + Theme.spacingM width: parent.width - Theme.spacingL * 2 - entries: card.entries + height: Math.max(0, card.height - y) visible: card.height > card.collapsedHeight - enabled: card.expanded - onChosen: widgetId => card.chosen(widgetId) + clip: true + + PreviewGrid { + id: items + width: parent.width + entries: card.entries + enabled: card.expanded + onChosen: widgetId => card.chosen(widgetId) + } } } diff --git a/quickshell/Modules/DesktopContextMenu.qml b/quickshell/Modules/DesktopContextMenu.qml new file mode 100644 index 000000000..2842df64b --- /dev/null +++ b/quickshell/Modules/DesktopContextMenu.qml @@ -0,0 +1,48 @@ +import QtQuick +import qs.Common +import qs.Services +import qs.Widgets + +DContextMenu { + id: root + + layerNamespace: "dms:desktop-context-menu" + keyboardNavigable: true + menuItems: [ + { + type: "item", + icon: "add", + text: I18n.tr("Add widget"), + action: () => DesktopWidgetRegistry.startEditing(root.targetScreen, true) + }, + { + type: "item", + icon: "edit", + text: I18n.tr("Edit widgets"), + action: () => DesktopWidgetRegistry.startEditing(root.targetScreen, false) + }, + { + type: "separator" + }, + { + type: "item", + icon: "wallpaper", + text: I18n.tr("Wallpaper & colors"), + action: () => PopoutService.openSettingsWithTab("personalization") + }, + { + type: "item", + icon: "widgets", + text: I18n.tr("Desktop widgets"), + action: () => PopoutService.openSettingsWithTab("desktop_widgets") + }, + { + type: "item", + icon: "monitor", + text: I18n.tr("Displays"), + action: () => PopoutService.openSettingsWithTab("displays") + } + ] + + onBackdropRightClicked: (x, y) => open(targetScreen, x, y, false) +} diff --git a/quickshell/Modules/Plugins/WidgetEditorOverlay.qml b/quickshell/Modules/Plugins/WidgetEditorOverlay.qml index 10079203e..f7ad094e6 100644 --- a/quickshell/Modules/Plugins/WidgetEditorOverlay.qml +++ b/quickshell/Modules/Plugins/WidgetEditorOverlay.qml @@ -81,7 +81,10 @@ FocusScope { } focus: true - Component.onCompleted: forceActiveFocus() + Component.onCompleted: { + libraryOpen = DesktopWidgetRegistry.libraryScreen === editLayer.screenName; + forceActiveFocus(); + } Keys.onEscapePressed: dismiss() MouseArea { diff --git a/quickshell/Modules/Settings/ColorDropdownRow.qml b/quickshell/Modules/Settings/ColorDropdownRow.qml index 1e64ee257..a3d92fa6b 100644 --- a/quickshell/Modules/Settings/ColorDropdownRow.qml +++ b/quickshell/Modules/Settings/ColorDropdownRow.qml @@ -103,7 +103,7 @@ Column { Item { width: parent.width - height: root.currentMode === "custom" ? customChip.height + Theme.spacingM : 0 + height: root.currentMode === "custom" ? customChip.y + customChip.height + Theme.spacingM : 0 opacity: root.currentMode === "custom" ? 1 : 0 clip: true @@ -127,6 +127,7 @@ Column { id: customChip x: SettingsMetrics.rowPaddingH + y: Theme.focusRingOffset width: parent.width - SettingsMetrics.rowPaddingH * 2 height: Theme.listItemHeight radius: Theme.cornerRadiusM diff --git a/quickshell/Modules/Settings/DBarAppearanceTab.qml b/quickshell/Modules/Settings/DBarAppearanceTab.qml index 1e09fc686..cea5f2afc 100644 --- a/quickshell/Modules/Settings/DBarAppearanceTab.qml +++ b/quickshell/Modules/Settings/DBarAppearanceTab.qml @@ -613,6 +613,18 @@ Item { tags: ["widget", "style", "pills", "segments", "opacity", "padding", "maximize"] visible: bar.selectedBarConfig?.enabled ?? false + SettingsToggleRow { + settingKey: "barNoBackground" + tags: ["transparent", "background", "invisible"] + text: I18n.tr("Background") + resetStore: bar + resetKeys: ["noBackground"] + checked: !(bar.selectedBarConfig?.noBackground ?? false) + onToggled: checked => SettingsData.updateBarConfig(bar.selectedBarId, { + noBackground: !checked + }) + } + SettingsRow { settingKey: "barWidgetStyle" tags: ["widget", "style", "segments", "pills", "flat", "connected", "group"] @@ -689,18 +701,6 @@ Item { }) } - SettingsToggleRow { - settingKey: "barNoBackground" - tags: ["transparent", "background", "invisible"] - text: I18n.tr("Background") - resetStore: bar - resetKeys: ["noBackground"] - checked: !(bar.selectedBarConfig?.noBackground ?? false) - onToggled: checked => SettingsData.updateBarConfig(bar.selectedBarId, { - noBackground: !checked - }) - } - SettingsToggleRow { settingKey: "barMaximizeWidgetIcons" tags: ["maximize", "icons", "stretch"] diff --git a/quickshell/Modules/Settings/DBarTab.qml b/quickshell/Modules/Settings/DBarTab.qml index f55252f6e..e5d45f51c 100644 --- a/quickshell/Modules/Settings/DBarTab.qml +++ b/quickshell/Modules/Settings/DBarTab.qml @@ -17,6 +17,7 @@ Item { } readonly property bool selectedIslandEnabled: bar.selectedBarIsIsland && (bar.selectedBarConfig?.enabled ?? false) + readonly property string clickThroughHint: I18n.tr("Disabled by Click through", "bar hover popouts card, Click through is the Advanced toggle name") readonly property bool selectedIslandFree: bar.selectedBarIsIsland && SettingsData.islandFreePlacement(bar.selectedBarConfig) readonly property bool selectedIslandDocked: bar.selectedBarIsIsland && !selectedIslandFree readonly property int placementIndex: !bar.islandSetting("islandFloating") ? 0 : (bar.islandSetting("islandPlacement") === "free" ? 2 : 1) @@ -405,6 +406,7 @@ Item { tags: ["bar", "hover", "popout", "reveal", "widget", "delay"] iconName: "touch_app" title: I18n.tr("Hover popouts") + description: enabled ? "" : root.clickThroughHint visible: bar.selectedBarConfig?.enabled ?? false enabled: !(bar.selectedBarConfig?.clickThrough ?? false) opacity: (bar.selectedBarConfig?.clickThrough ?? false) ? 0.5 : 1.0 diff --git a/quickshell/Modules/Settings/DesktopWidgetsTab.qml b/quickshell/Modules/Settings/DesktopWidgetsTab.qml index 800638f13..16078473d 100644 --- a/quickshell/Modules/Settings/DesktopWidgetsTab.qml +++ b/quickshell/Modules/Settings/DesktopWidgetsTab.qml @@ -97,6 +97,24 @@ Item { SettingsPage { id: mainColumn + SettingsCard { + settingKey: "desktopGeneral" + tags: ["desktop", "context", "menu", "right click", "wallpaper"] + width: parent.width + iconName: "mouse" + title: I18n.tr("General") + + SettingsDropdownRow { + settingKey: "desktopContextMenu" + text: I18n.tr("Right-click menu") + description: I18n.tr("Auto turns it off on compositors that use clicks on the empty desktop themselves", "desktop context menu dropdown description") + options: [I18n.tr("Auto"), I18n.tr("On"), I18n.tr("Off")] + readonly property var values: ["auto", "on", "off"] + currentValue: options[Math.max(0, values.indexOf(SettingsData.desktopContextMenu))] + onValueChanged: value => SettingsData.set("desktopContextMenu", values[options.indexOf(value)]) + } + } + SettingsCard { settingKey: "desktopWidgetGroups" tags: ["groups", "profiles", "layouts"] diff --git a/quickshell/Modules/Settings/ThemeColorsTab.qml b/quickshell/Modules/Settings/ThemeColorsTab.qml index d2428573f..f736d1c6e 100644 --- a/quickshell/Modules/Settings/ThemeColorsTab.qml +++ b/quickshell/Modules/Settings/ThemeColorsTab.qml @@ -122,13 +122,13 @@ Item { Item { width: parent.width - height: themeCategoryGroup.implicitHeight + height: themeCategoryGroup.implicitHeight + Theme.focusRingOffset * 2 clip: true DButtonGroup { id: themeCategoryGroup arrowKeysSelect: false - anchors.horizontalCenter: parent.horizontalCenter + anchors.centerIn: parent buttonPadding: parent.width < 420 ? Theme.spacingS : Theme.spacingL minButtonWidth: parent.width < 420 ? 44 : 64 textSize: parent.width < 420 ? Theme.fontSizeSmall : Theme.fontSizeMedium @@ -660,14 +660,14 @@ Item { Item { width: parent.width - height: flavorButtonGroup.implicitHeight + height: flavorButtonGroup.implicitHeight + Theme.focusRingOffset * 2 clip: true visible: variantSelector.isMultiVariant && variantSelector.flavorOptions.length > 1 DButtonGroup { id: flavorButtonGroup arrowKeysSelect: false - anchors.horizontalCenter: parent.horizontalCenter + anchors.centerIn: parent property int _count: variantSelector.flavorNames.length property real _maxPerItem: _count > 1 ? (parent.width - (_count - 1) * spacing) / _count : parent.width buttonPadding: _maxPerItem < 55 ? Theme.spacingXS : (_maxPerItem < 75 ? Theme.spacingS : Theme.spacingL) @@ -737,14 +737,14 @@ Item { Item { width: parent.width - height: variantButtonGroup.implicitHeight + height: variantButtonGroup.implicitHeight + Theme.focusRingOffset * 2 clip: true visible: !variantSelector.isMultiVariant && variantSelector.variantNames.length > 0 DButtonGroup { id: variantButtonGroup arrowKeysSelect: false - anchors.horizontalCenter: parent.horizontalCenter + anchors.centerIn: parent property int _count: variantSelector.variantNames.length property real _maxPerItem: _count > 1 ? (parent.width - (_count - 1) * spacing) / _count : parent.width buttonPadding: _maxPerItem < 55 ? Theme.spacingXS : (_maxPerItem < 75 ? Theme.spacingS : Theme.spacingL) diff --git a/quickshell/Modules/Settings/Widgets/SettingsToggleSliderRow.qml b/quickshell/Modules/Settings/Widgets/SettingsToggleSliderRow.qml index f8065b39f..ce4f6677e 100644 --- a/quickshell/Modules/Settings/Widgets/SettingsToggleSliderRow.qml +++ b/quickshell/Modules/Settings/Widgets/SettingsToggleSliderRow.qml @@ -85,7 +85,7 @@ Item { Item { width: parent.width visible: root.checked || height > 0 - height: root.checked ? control.height + SettingsMetrics.rowPaddingV : 0 + height: root.checked ? control.y + control.height + SettingsMetrics.rowPaddingV : 0 clip: true Behavior on height { @@ -104,6 +104,7 @@ Item { SettingsSliderControl { id: control x: SettingsMetrics.rowPaddingH + y: Theme.focusRingOffset width: parent.width - SettingsMetrics.rowPaddingH * 2 enabled: root.checked value: root.value diff --git a/quickshell/Modules/WallpaperBackground.qml b/quickshell/Modules/WallpaperBackground.qml index 6851450a1..44a2c4a24 100644 --- a/quickshell/Modules/WallpaperBackground.qml +++ b/quickshell/Modules/WallpaperBackground.qml @@ -13,6 +13,16 @@ Variants { // An entry present in PanelWindow.onCompleted means we're recreating // after a wl_output rebind, not at initial startup. property var _seenScreens: ({}) + readonly property bool desktopMenuEnabled: { + switch (SettingsData.desktopContextMenu) { + case "on": + return true; + case "off": + return false; + default: + return !CompositorService.reservesDesktopInput; + } + } model: SettingsData.getFilteredScreens("wallpaper") PanelWindow { @@ -36,8 +46,18 @@ Variants { updatesEnabled: root.renderActive || root._settleFrames > 0 - mask: Region { - item: Item {} + Region { + id: emptyRegion + } + + mask: variants.desktopMenuEnabled ? null : emptyRegion + + MouseArea { + anchors.fill: parent + z: 1 + enabled: variants.desktopMenuEnabled + acceptedButtons: Qt.RightButton + onClicked: mouse => PopoutService.desktopContextMenu?.open(wallpaperWindow.screen, mouse.x, mouse.y, false) } Item { diff --git a/quickshell/Services/CompositorService.qml b/quickshell/Services/CompositorService.qml index a95d6a29b..7ad456581 100644 --- a/quickshell/Services/CompositorService.qml +++ b/quickshell/Services/CompositorService.qml @@ -25,6 +25,7 @@ Singleton { property bool isLabwc: false property bool isAqueous: false property bool isUmbriel: false + property bool isKwin: false property string compositor: "unknown" property bool compositorDetected: false property bool outputPowerAvailable: false @@ -145,6 +146,8 @@ Singleton { readonly property bool supportsPersistentWorkspaces: isHyprland || isMango || isSway || isScroll || isMiracle readonly property bool supportsWorkspaceUrgency: isKnownCompositor && !isLabwc readonly property bool supportsWorkspaceFollowFocus: isKnownCompositor && !isLabwc + // labwc root menu and desktop scroll, sway/scroll --whole-window binds, plasmashell desktop menu + readonly property bool reservesDesktopInput: isLabwc || isSway || isScroll || isKwin readonly property bool supportsSmartDock: isNiri || isHyprland || isMango || isAqueous readonly property bool supportsNativeOverview: isNiri || isAqueous readonly property bool supportsPointerConfig: isNiri || isMango @@ -170,6 +173,8 @@ Singleton { return "Aqueous"; case "umbriel": return "Umbriel"; + case "kwin": + return "KWin"; default: return ""; } @@ -1413,6 +1418,8 @@ Singleton { return "aqueous"; case "umbriel": return "umbriel"; + case "kwin_wayland": + return "kwin"; default: return ""; } @@ -1428,6 +1435,7 @@ Singleton { isLabwc = name === "labwc"; isAqueous = name === "aqueous"; isUmbriel = name === "umbriel"; + isKwin = name === "kwin"; compositor = name; compositorDetected = true; if (isNiri) @@ -1601,6 +1609,12 @@ Singleton { present: !!hyprlandSignature, test: ["test", "-S", runtimeDir + "/hypr/" + hyprlandSignature + "/.socket.sock"], detail: "HYPRLAND_INSTANCE_SIGNATURE " + hyprlandSignature + }, + { + name: "kwin", + present: !!Quickshell.env("KDE_FULL_SESSION"), + test: ["pgrep", "-x", "kwin_wayland"], + detail: "KDE_FULL_SESSION" } ]; } diff --git a/quickshell/Services/DesktopWidgetRegistry.qml b/quickshell/Services/DesktopWidgetRegistry.qml index 4db17022c..13278b556 100644 --- a/quickshell/Services/DesktopWidgetRegistry.qml +++ b/quickshell/Services/DesktopWidgetRegistry.qml @@ -12,9 +12,20 @@ Singleton { property var registeredWidgets: ({}) property var registeredWidgetsList: [] property bool editing: false + property string libraryScreen: "" signal registryChanged + onEditingChanged: { + if (!editing) + libraryScreen = ""; + } + + function startEditing(screen, openLibrary) { + libraryScreen = openLibrary ? (screen?.name ?? "") : ""; + editing = true; + } + Component.onCompleted: { registerBuiltins(); registerLockBuiltins(); diff --git a/quickshell/Services/PopoutService.qml b/quickshell/Services/PopoutService.qml index 63f207cb5..7cec8c9ba 100644 --- a/quickshell/Services/PopoutService.qml +++ b/quickshell/Services/PopoutService.qml @@ -32,6 +32,7 @@ Singleton { property var clipboardHistoryPopout: null property var clipboardHistoryPopoutLoader: null + property var desktopContextMenu: null property var settingsModal: null property var settingsModalLoader: null property var clipboardHistoryModal: null diff --git a/quickshell/Services/SettingsSearchService.qml b/quickshell/Services/SettingsSearchService.qml index 87ab3b852..b3a56898a 100644 --- a/quickshell/Services/SettingsSearchService.qml +++ b/quickshell/Services/SettingsSearchService.qml @@ -79,7 +79,8 @@ Singleton { "frameEnabled": () => SettingsData.frameEnabled, "islandEnabled": () => SettingsData.islandBarConfigs.length > 0, "dotEnabled": () => SettingsData.dotBarConfig?.enabled ?? false, - "cellularAvailable": () => NetworkService.cellularAvailable + "cellularAvailable": () => NetworkService.cellularAvailable, + "dockEnabled": () => (SettingsData.dockConfigs ?? []).some(dock => dock.enabled) }) property var pluginSettingLabels: ({}) diff --git a/quickshell/translations/extract_settings_index.py b/quickshell/translations/extract_settings_index.py index 42e594781..6f937bd26 100644 --- a/quickshell/translations/extract_settings_index.py +++ b/quickshell/translations/extract_settings_index.py @@ -406,6 +406,8 @@ def find_settings_components(content, filename, wrappers, tab_meta, hub_meta): if file_tab_index == -1 and not file_page: return results + card_conditions = [] + for component in SEARCHABLE_COMPONENTS + sorted(wrappers): defaults = wrappers.get(component, {}) pattern = rf"\b{component}\s*\{{" @@ -413,6 +415,7 @@ def find_settings_components(content, filename, wrappers, tab_meta, hub_meta): block = parse_component_block(content, match.start(), component) if not block: continue + block_end = content.index(block, match.start()) + len(block) setting_key = extract_property(block, "settingKey") or defaults.get("settingKey") if setting_key: @@ -502,6 +505,8 @@ def find_settings_components(content, filename, wrappers, tab_meta, hub_meta): condition_key = "dmsConnected" elif "Theme.matugenAvailable" in visible_raw: condition_key = "matugenAvailable" + elif "dock.config.enabled" in visible_raw: + condition_key = "dockEnabled" if filename in BAR_TAB_FILES and not condition_key: if setting_key.startswith("frame"): condition_key = "frameEnabled" @@ -509,6 +514,10 @@ def find_settings_components(content, filename, wrappers, tab_meta, hub_meta): condition_key = "islandEnabled" if filename == "DDotTab.qml" and not condition_key and setting_key != "dotEnabled": condition_key = "dotEnabled" + if component == "SettingsCard": + card_conditions.append((match.start(), block_end, condition_key if extract_property(own, "visible") else None)) + elif not condition_key: + condition_key = next((cond for start, end, cond in card_conditions if start < match.start() < end), None) category, parent_label, _ = page_meta if page_meta else tab_meta.get(tab_index, TAB_META_DEFAULT) enriched_keywords = enrich_keywords(label, description, category, tags, parent_label) diff --git a/quickshell/translations/settings_search_index.json b/quickshell/translations/settings_search_index.json index 541aa1b29..47118275d 100644 --- a/quickshell/translations/settings_search_index.json +++ b/quickshell/translations/settings_search_index.json @@ -4605,7 +4605,8 @@ "panel", "taskbar" ], - "parentLabel": "Dock" + "parentLabel": "Dock", + "conditionKey": "dockEnabled" }, { "section": "dockDisplays", @@ -4672,7 +4673,8 @@ "widgets" ], "parentLabel": "Dock", - "icon": "edit" + "icon": "edit", + "conditionKey": "dockEnabled" }, { "section": "dockLayout", @@ -4711,7 +4713,8 @@ "space", "taskbar" ], - "parentLabel": "Dock" + "parentLabel": "Dock", + "conditionKey": "dockEnabled" }, { "section": "dockSmartAutoHide", @@ -4767,7 +4770,8 @@ ], "parentLabel": "Dock", "icon": "visibility_off", - "description": "Hides only while a window overlaps the dock" + "description": "Hides only while a window overlaps the dock", + "conditionKey": "dockEnabled" }, { "section": "barNoBackground", @@ -6423,7 +6427,8 @@ "start", "start menu", "style" - ] + ], + "conditionKey": "isNiri" }, { "section": "niriOverviewOverlayEnabled", @@ -6446,7 +6451,8 @@ "start menu", "typing" ], - "description": "Typing in the overview opens the launcher" + "description": "Typing in the overview opens the launcher", + "conditionKey": "isNiri" }, { "section": "launcherNiriOverview", @@ -6902,7 +6908,8 @@ "wallpaper colors" ], "parentLabel": "Wallpaper & colors", - "description": "Regenerate matugen colors when DMS starts, even if nothing changed." + "description": "Regenerate matugen colors when DMS starts, even if nothing changed.", + "conditionKey": "matugenAvailable" }, { "section": "matugenSpec", @@ -11459,6 +11466,33 @@ "icon": "widgets", "description": "Clocks, monitors, plugins" }, + { + "section": "desktopGeneral", + "label": "General", + "tabIndex": 27, + "category": "Desktop widgets", + "keywords": [ + "auto", + "clicks", + "components", + "compositors", + "conky", + "context", + "desktop", + "desktop clock", + "empty", + "general", + "menu", + "modules", + "right click", + "themselves", + "turns", + "wallpaper", + "widgets" + ], + "icon": "mouse", + "description": "Auto turns it off on compositors that use clicks on the empty desktop themselves" + }, { "section": "desktopWidgetGroups", "label": "Groups", @@ -11477,6 +11511,30 @@ ], "icon": "folder" }, + { + "section": "desktopContextMenu", + "label": "Right-click menu", + "tabIndex": 27, + "category": "Desktop widgets", + "keywords": [ + "auto", + "click", + "clicks", + "components", + "compositors", + "conky", + "desktop", + "desktop clock", + "empty", + "menu", + "modules", + "right", + "themselves", + "turns", + "widgets" + ], + "description": "Auto turns it off on compositors that use clicks on the empty desktop themselves" + }, { "section": "pluginDirectory", "label": "Directory", @@ -14491,7 +14549,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "_tab_50", @@ -14554,7 +14613,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateEmacs", @@ -14580,7 +14640,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateFcitx5", @@ -14607,7 +14668,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateFirefox", @@ -14633,7 +14695,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateNeovimSetBackground", @@ -14663,7 +14726,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateGtk", @@ -14689,7 +14753,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "systemAppTheming", @@ -14744,7 +14809,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateHyprland", @@ -14770,7 +14836,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateKcolorscheme", @@ -14797,7 +14864,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplates", @@ -14898,7 +14966,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "runUserMatugenTemplates", @@ -14932,7 +15001,8 @@ "wallpaper colors" ], "parentLabel": "Wallpaper & colors", - "description": "Also runs the templates in your matugen config.toml" + "description": "Also runs the templates in your matugen config.toml", + "conditionKey": "matugenAvailable" }, { "section": "syncModeWithPortal", @@ -15036,7 +15106,8 @@ "wallpaper" ], "parentLabel": "Wallpaper & colors", - "description": "Requires the DMS Theme extension from the editor marketplace" + "description": "Requires the DMS Theme extension from the editor marketplace", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateWezterm", @@ -15063,7 +15134,8 @@ "wallpaper", "wezterm" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateZed", @@ -15089,7 +15161,8 @@ "wallpaper", "zed" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateDgop", @@ -15115,7 +15188,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateEquibop", @@ -15142,7 +15216,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateFoot", @@ -15169,7 +15244,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateKitty", @@ -15196,7 +15272,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateMangowc", @@ -15222,7 +15299,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateNeovim", @@ -15251,7 +15329,8 @@ "wallpaper" ], "parentLabel": "Wallpaper & colors", - "description": "Required plugin: " + "description": "Required plugin: ", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateNiri", @@ -15277,7 +15356,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplatePywalfox", @@ -15303,7 +15383,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateQt5ct", @@ -15329,7 +15410,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateQt6ct", @@ -15355,7 +15437,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateQtengine", @@ -15382,7 +15465,8 @@ "tint", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateVencord", @@ -15409,7 +15493,8 @@ "vencord", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateVesktop", @@ -15436,7 +15521,8 @@ "vesktop", "wallpaper" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "matugenTemplateZenBrowser", @@ -15462,7 +15548,8 @@ "wallpaper", "zenbrowser" ], - "parentLabel": "Wallpaper & colors" + "parentLabel": "Wallpaper & colors", + "conditionKey": "matugenAvailable" }, { "section": "themeModeAutoEnabled",