From 9fc0d5efff2edc7172fc1aa5806003344fec0bd6 Mon Sep 17 00:00:00 2001 From: bbedward Date: Fri, 26 Dec 2025 22:21:20 -0500 Subject: [PATCH] settings: add index extractor script for search --- quickshell/Modules/Settings/DockTab.qml | 14 + quickshell/Modules/Settings/LauncherTab.qml | 16 + quickshell/Modules/Settings/LockScreenTab.qml | 20 + .../Modules/Settings/NotificationsTab.qml | 12 + quickshell/Modules/Settings/PowerSleepTab.qml | 26 + .../Widgets/SettingsButtonGroupRow.qml | 41 + .../Settings/Widgets/SettingsDropdownRow.qml | 41 + .../Settings/Widgets/SettingsSliderRow.qml | 40 + .../Settings/Widgets/SettingsToggleRow.qml | 41 + quickshell/Modules/Settings/WorkspacesTab.qml | 12 + quickshell/Services/SettingsSearchService.qml | 642 +-- .../translations/extract_settings_index.py | 370 ++ .../translations/settings_search_index.json | 3666 +++++++++++++++++ 13 files changed, 4361 insertions(+), 580 deletions(-) create mode 100755 quickshell/translations/extract_settings_index.py create mode 100644 quickshell/translations/settings_search_index.json diff --git a/quickshell/Modules/Settings/DockTab.qml b/quickshell/Modules/Settings/DockTab.qml index 967be63d..ed343560 100644 --- a/quickshell/Modules/Settings/DockTab.qml +++ b/quickshell/Modules/Settings/DockTab.qml @@ -71,6 +71,8 @@ Item { settingKey: "dockVisibility" SettingsToggleRow { + settingKey: "showDock" + tags: ["dock", "show", "display", "enable"] text: I18n.tr("Show Dock") description: I18n.tr("Display a dock with pinned and running applications") checked: SettingsData.showDock @@ -78,6 +80,8 @@ Item { } SettingsToggleRow { + settingKey: "dockAutoHide" + tags: ["dock", "autohide", "hide", "hover"] text: I18n.tr("Auto-hide Dock") description: I18n.tr("Hide the dock when not in use and reveal it when hovering near the dock area") checked: SettingsData.dockAutoHide @@ -86,6 +90,8 @@ Item { } SettingsToggleRow { + settingKey: "dockOpenOnOverview" + tags: ["dock", "overview", "niri"] text: I18n.tr("Show on Overview") description: I18n.tr("Always show the dock when niri's overview is open") checked: SettingsData.dockOpenOnOverview @@ -101,6 +107,8 @@ Item { settingKey: "dockBehavior" SettingsToggleRow { + settingKey: "dockIsolateDisplays" + tags: ["dock", "isolate", "monitor", "multi-monitor"] text: I18n.tr("Isolate Displays") description: I18n.tr("Only show windows from the current monitor on each dock") checked: SettingsData.dockIsolateDisplays @@ -108,6 +116,8 @@ Item { } SettingsToggleRow { + settingKey: "dockGroupByApp" + tags: ["dock", "group", "windows", "app"] text: I18n.tr("Group by App") description: I18n.tr("Group multiple windows of the same app together with a window count indicator") checked: SettingsData.dockGroupByApp @@ -115,6 +125,8 @@ Item { } SettingsButtonGroupRow { + settingKey: "dockIndicatorStyle" + tags: ["dock", "indicator", "style", "circle", "line"] text: I18n.tr("Indicator Style") model: ["Circle", "Line"] currentIndex: SettingsData.dockIndicatorStyle === "circle" ? 0 : 1 @@ -133,6 +145,8 @@ Item { settingKey: "dockSizing" SettingsSliderRow { + settingKey: "dockIconSize" + tags: ["dock", "icon", "size", "scale"] text: I18n.tr("Icon Size") value: SettingsData.dockIconSize minimum: 24 diff --git a/quickshell/Modules/Settings/LauncherTab.qml b/quickshell/Modules/Settings/LauncherTab.qml index 6b0ac116..26b01427 100644 --- a/quickshell/Modules/Settings/LauncherTab.qml +++ b/quickshell/Modules/Settings/LauncherTab.qml @@ -250,6 +250,8 @@ Item { } SettingsSliderRow { + settingKey: "launcherLogoSizeOffset" + tags: ["launcher", "logo", "size", "offset", "scale"] text: I18n.tr("Size Offset") minimum: -12 maximum: 12 @@ -267,6 +269,8 @@ Item { } SettingsSliderRow { + settingKey: "launcherLogoBrightness" + tags: ["launcher", "logo", "brightness", "color"] text: I18n.tr("Brightness") minimum: 0 maximum: 100 @@ -277,6 +281,8 @@ Item { } SettingsSliderRow { + settingKey: "launcherLogoContrast" + tags: ["launcher", "logo", "contrast", "color"] text: I18n.tr("Contrast") minimum: 0 maximum: 200 @@ -287,6 +293,8 @@ Item { } SettingsToggleRow { + settingKey: "launcherLogoColorInvertOnMode" + tags: ["launcher", "logo", "invert", "mode", "color"] text: I18n.tr("Invert on mode change") checked: SettingsData.launcherLogoColorInvertOnMode onToggled: checked => SettingsData.set("launcherLogoColorInvertOnMode", checked) @@ -324,6 +332,8 @@ Item { settingKey: "launcherSorting" SettingsToggleRow { + settingKey: "sortAppsAlphabetically" + tags: ["launcher", "sort", "alphabetically", "apps", "order"] text: I18n.tr("Sort Alphabetically") description: I18n.tr("When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.") checked: SettingsData.sortAppsAlphabetically @@ -331,6 +341,8 @@ Item { } SettingsSliderRow { + settingKey: "appLauncherGridColumns" + tags: ["launcher", "grid", "columns", "layout"] text: I18n.tr("Grid Columns") description: I18n.tr("Adjust the number of columns in grid view mode.") minimum: 2 @@ -348,6 +360,8 @@ Item { visible: CompositorService.isNiri SettingsToggleRow { + settingKey: "spotlightCloseNiriOverview" + tags: ["launcher", "niri", "overview", "close", "launch"] text: I18n.tr("Close Overview on Launch") description: I18n.tr("Auto-close Niri overview when launching apps.") checked: SettingsData.spotlightCloseNiriOverview @@ -355,6 +369,8 @@ Item { } SettingsToggleRow { + settingKey: "niriOverviewOverlayEnabled" + tags: ["launcher", "niri", "overview", "overlay", "enable"] text: I18n.tr("Enable Overview Overlay") description: I18n.tr("Show launcher overlay when typing in Niri overview. Disable to use another launcher.") checked: SettingsData.niriOverviewOverlayEnabled diff --git a/quickshell/Modules/Settings/LockScreenTab.qml b/quickshell/Modules/Settings/LockScreenTab.qml index 654e8fa7..07ed70d9 100644 --- a/quickshell/Modules/Settings/LockScreenTab.qml +++ b/quickshell/Modules/Settings/LockScreenTab.qml @@ -28,36 +28,48 @@ Item { settingKey: "lockLayout" SettingsToggleRow { + settingKey: "lockScreenShowPowerActions" + tags: ["lock", "screen", "power", "actions", "shutdown", "reboot"] text: I18n.tr("Show Power Actions", "Enable power action icon on the lock screen window") checked: SettingsData.lockScreenShowPowerActions onToggled: checked => SettingsData.set("lockScreenShowPowerActions", checked) } SettingsToggleRow { + settingKey: "lockScreenShowSystemIcons" + tags: ["lock", "screen", "system", "icons", "status"] text: I18n.tr("Show System Icons", "Enable system status icons on the lock screen window") checked: SettingsData.lockScreenShowSystemIcons onToggled: checked => SettingsData.set("lockScreenShowSystemIcons", checked) } SettingsToggleRow { + settingKey: "lockScreenShowTime" + tags: ["lock", "screen", "time", "clock", "display"] text: I18n.tr("Show System Time", "Enable system time display on the lock screen window") checked: SettingsData.lockScreenShowTime onToggled: checked => SettingsData.set("lockScreenShowTime", checked) } SettingsToggleRow { + settingKey: "lockScreenShowDate" + tags: ["lock", "screen", "date", "calendar", "display"] text: I18n.tr("Show System Date", "Enable system date display on the lock screen window") checked: SettingsData.lockScreenShowDate onToggled: checked => SettingsData.set("lockScreenShowDate", checked) } SettingsToggleRow { + settingKey: "lockScreenShowProfileImage" + tags: ["lock", "screen", "profile", "image", "avatar", "picture"] text: I18n.tr("Show Profile Image", "Enable profile image display on the lock screen window") checked: SettingsData.lockScreenShowProfileImage onToggled: checked => SettingsData.set("lockScreenShowProfileImage", checked) } SettingsToggleRow { + settingKey: "lockScreenShowPasswordField" + tags: ["lock", "screen", "password", "field", "input", "visible"] text: I18n.tr("Show Password Field", "Enable password field display on the lock screen window") description: I18n.tr("If the field is hidden, it will appear as soon as a key is pressed.") checked: SettingsData.lockScreenShowPasswordField @@ -81,6 +93,8 @@ Item { } SettingsToggleRow { + settingKey: "loginctlLockIntegration" + tags: ["lock", "screen", "loginctl", "dbus", "integration", "external"] text: I18n.tr("Enable loginctl lock integration") description: I18n.tr("Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen") checked: SessionService.loginctlAvailable && SettingsData.loginctlLockIntegration @@ -93,6 +107,8 @@ Item { } SettingsToggleRow { + settingKey: "lockBeforeSuspend" + tags: ["lock", "screen", "suspend", "sleep", "automatic"] text: I18n.tr("Lock before suspend") description: I18n.tr("Automatically lock the screen when the system prepares to suspend") checked: SettingsData.lockBeforeSuspend @@ -101,6 +117,8 @@ Item { } SettingsToggleRow { + settingKey: "enableFprint" + tags: ["lock", "screen", "fingerprint", "authentication", "biometric", "fprint"] text: I18n.tr("Enable fingerprint authentication") description: I18n.tr("Use fingerprint reader for lock screen authentication (requires enrolled fingerprints)") checked: SettingsData.enableFprint @@ -126,6 +144,8 @@ Item { SettingsDropdownRow { id: lockScreenMonitorDropdown + settingKey: "lockScreenActiveMonitor" + tags: ["lock", "screen", "monitor", "display", "active"] text: I18n.tr("Active Lock Screen Monitor") options: { var opts = [I18n.tr("All Monitors")]; diff --git a/quickshell/Modules/Settings/NotificationsTab.qml b/quickshell/Modules/Settings/NotificationsTab.qml index a5882530..26c1ae32 100644 --- a/quickshell/Modules/Settings/NotificationsTab.qml +++ b/quickshell/Modules/Settings/NotificationsTab.qml @@ -93,6 +93,8 @@ Item { settingKey: "notificationPopups" SettingsDropdownRow { + settingKey: "notificationPopupPosition" + tags: ["notification", "popup", "position", "screen", "location"] text: I18n.tr("Popup Position") description: I18n.tr("Choose where notification popups appear on screen") currentValue: { @@ -135,6 +137,8 @@ Item { } SettingsToggleRow { + settingKey: "notificationOverlayEnabled" + tags: ["notification", "overlay", "fullscreen", "priority"] text: I18n.tr("Notification Overlay") description: I18n.tr("Display all priorities over fullscreen apps") checked: SettingsData.notificationOverlayEnabled @@ -149,6 +153,8 @@ Item { settingKey: "doNotDisturb" SettingsToggleRow { + settingKey: "doNotDisturb" + tags: ["notification", "dnd", "mute", "silent", "suppress"] text: I18n.tr("Enable Do Not Disturb") description: I18n.tr("Suppress notification popups while enabled") checked: SessionData.doNotDisturb @@ -163,6 +169,8 @@ Item { settingKey: "notificationTimeouts" SettingsDropdownRow { + settingKey: "notificationTimeoutLow" + tags: ["notification", "timeout", "low", "priority", "duration"] text: I18n.tr("Low Priority") description: I18n.tr("Timeout for low priority notifications") currentValue: root.getTimeoutText(SettingsData.notificationTimeoutLow) @@ -178,6 +186,8 @@ Item { } SettingsDropdownRow { + settingKey: "notificationTimeoutNormal" + tags: ["notification", "timeout", "normal", "priority", "duration"] text: I18n.tr("Normal Priority") description: I18n.tr("Timeout for normal priority notifications") currentValue: root.getTimeoutText(SettingsData.notificationTimeoutNormal) @@ -193,6 +203,8 @@ Item { } SettingsDropdownRow { + settingKey: "notificationTimeoutCritical" + tags: ["notification", "timeout", "critical", "priority", "duration"] text: I18n.tr("Critical Priority") description: I18n.tr("Timeout for critical priority notifications") currentValue: root.getTimeoutText(SettingsData.notificationTimeoutCritical) diff --git a/quickshell/Modules/Settings/PowerSleepTab.qml b/quickshell/Modules/Settings/PowerSleepTab.qml index d63eb6b0..28d79efc 100644 --- a/quickshell/Modules/Settings/PowerSleepTab.qml +++ b/quickshell/Modules/Settings/PowerSleepTab.qml @@ -64,6 +64,8 @@ Item { } SettingsToggleRow { + settingKey: "fadeToLockEnabled" + tags: ["fade", "lock", "screen", "idle", "grace period"] text: I18n.tr("Fade to lock screen") description: I18n.tr("Gradually fade the screen before locking with a configurable grace period") checked: SettingsData.fadeToLockEnabled @@ -71,6 +73,8 @@ Item { } SettingsToggleRow { + settingKey: "lockBeforeSuspend" + tags: ["lock", "suspend", "sleep", "security"] text: I18n.tr("Lock before suspend") description: I18n.tr("Automatically lock the screen when the system prepares to suspend") checked: SettingsData.lockBeforeSuspend @@ -80,6 +84,8 @@ Item { SettingsDropdownRow { id: fadeGracePeriodDropdown + settingKey: "fadeToLockGracePeriod" + tags: ["fade", "grace", "period", "timeout", "lock"] property var periodOptions: ["1 second", "2 seconds", "3 seconds", "4 seconds", "5 seconds", "10 seconds", "15 seconds", "20 seconds", "30 seconds"] property var periodValues: [1, 2, 3, 4, 5, 10, 15, 20, 30] @@ -103,6 +109,8 @@ Item { } SettingsDropdownRow { id: powerProfileDropdown + settingKey: "powerProfile" + tags: ["power", "profile", "performance", "balanced", "saver", "battery"] property var profileOptions: [I18n.tr("Don't Change"), Theme.getPowerProfileLabel(0), Theme.getPowerProfileLabel(1), Theme.getPowerProfileLabel(2)] property var profileValues: ["", "0", "1", "2"] @@ -148,6 +156,8 @@ Item { SettingsDropdownRow { id: lockDropdown + settingKey: "lockTimeout" + tags: ["lock", "timeout", "idle", "automatic", "security"] text: I18n.tr("Automatically lock after") options: root.timeoutOptions @@ -179,6 +189,8 @@ Item { SettingsDropdownRow { id: monitorDropdown + settingKey: "monitorTimeout" + tags: ["monitor", "display", "screen", "timeout", "off", "idle"] text: I18n.tr("Turn off monitors after") options: root.timeoutOptions @@ -210,6 +222,8 @@ Item { SettingsDropdownRow { id: suspendDropdown + settingKey: "suspendTimeout" + tags: ["suspend", "sleep", "timeout", "idle", "system"] text: I18n.tr("Suspend system after") options: root.timeoutOptions @@ -307,6 +321,8 @@ Item { } SettingsToggleRow { + settingKey: "powerMenuGridLayout" + tags: ["power", "menu", "grid", "layout", "list"] text: I18n.tr("Use Grid Layout") description: I18n.tr("Display power menu actions in a grid instead of a list") checked: SettingsData.powerMenuGridLayout @@ -315,6 +331,8 @@ Item { SettingsDropdownRow { id: defaultActionDropdown + settingKey: "powerMenuDefaultAction" + tags: ["power", "menu", "default", "action", "reboot", "logout", "shutdown"] text: I18n.tr("Default selected action") options: ["Reboot", "Log Out", "Power Off", "Lock", "Suspend", "Restart DMS", "Hibernate"] property var actionValues: ["reboot", "logout", "poweroff", "lock", "suspend", "restart", "hibernate"] @@ -381,6 +399,8 @@ Item { SettingsToggleRow { required property var modelData + settingKey: "powerMenuAction_" + modelData.key + tags: ["power", "menu", "action", "show", modelData.key] text: modelData.label description: modelData.desc || "" visible: !modelData.hibernate || SessionService.hibernateSupported @@ -406,6 +426,8 @@ Item { settingKey: "powerConfirmation" SettingsToggleRow { + settingKey: "powerActionConfirm" + tags: ["power", "confirm", "hold", "button", "safety"] text: I18n.tr("Hold to Confirm Power Actions") description: I18n.tr("Require holding button/key to confirm power off, restart, suspend, hibernate and logout") checked: SettingsData.powerActionConfirm @@ -414,6 +436,8 @@ Item { SettingsDropdownRow { id: holdDurationDropdown + settingKey: "powerActionHoldDuration" + tags: ["power", "hold", "duration", "confirm", "time"] property var durationOptions: ["250 ms", "500 ms", "750 ms", "1 second", "2 seconds", "3 seconds", "5 seconds", "10 seconds"] property var durationValues: [0.25, 0.5, 0.75, 1, 2, 3, 5, 10] @@ -518,6 +542,8 @@ Item { expanded: false SettingsSliderRow { + settingKey: "batteryChargeLimit" + tags: ["battery", "charge", "limit", "percentage", "power"] text: I18n.tr("Battery Charge Limit") description: I18n.tr("Note: this only changes the percentage, it does not actually limit charging.") value: SettingsData.batteryChargeLimit diff --git a/quickshell/Modules/Settings/Widgets/SettingsButtonGroupRow.qml b/quickshell/Modules/Settings/Widgets/SettingsButtonGroupRow.qml index 01ef6453..2747db3c 100644 --- a/quickshell/Modules/Settings/Widgets/SettingsButtonGroupRow.qml +++ b/quickshell/Modules/Settings/Widgets/SettingsButtonGroupRow.qml @@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound import QtQuick import qs.Common +import qs.Services import qs.Widgets Item { @@ -16,6 +17,46 @@ Item { property string text: "" property string description: "" + + readonly property bool isHighlighted: settingKey !== "" && SettingsSearchService.highlightSection === settingKey + + function findParentFlickable() { + let p = root.parent; + while (p) { + if (p.hasOwnProperty("contentY") && p.hasOwnProperty("contentItem")) + return p; + p = p.parent; + } + return null; + } + + Component.onCompleted: { + if (!settingKey) + return; + let flickable = findParentFlickable(); + if (flickable) + SettingsSearchService.registerCard(settingKey, root, flickable); + } + + Component.onDestruction: { + if (settingKey) + SettingsSearchService.unregisterCard(settingKey); + } + + Rectangle { + anchors.fill: parent + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.primary, root.isHighlighted ? 0.2 : 0) + visible: root.isHighlighted + + Behavior on color { + ColorAnimation { + duration: Theme.shortDuration + easing.type: Theme.standardEasing + } + } + } + property alias model: buttonGroup.model property alias currentIndex: buttonGroup.currentIndex property alias selectionMode: buttonGroup.selectionMode diff --git a/quickshell/Modules/Settings/Widgets/SettingsDropdownRow.qml b/quickshell/Modules/Settings/Widgets/SettingsDropdownRow.qml index a5bbba16..f5fe8629 100644 --- a/quickshell/Modules/Settings/Widgets/SettingsDropdownRow.qml +++ b/quickshell/Modules/Settings/Widgets/SettingsDropdownRow.qml @@ -1,6 +1,8 @@ pragma ComponentBehavior: Bound import QtQuick +import qs.Common +import qs.Services import qs.Widgets DankDropdown { @@ -10,6 +12,45 @@ DankDropdown { property var tags: [] property string settingKey: "" + readonly property bool isHighlighted: settingKey !== "" && SettingsSearchService.highlightSection === settingKey + width: parent?.width ?? 0 addHorizontalPadding: true + + Rectangle { + anchors.fill: parent + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.primary, root.isHighlighted ? 0.2 : 0) + visible: root.isHighlighted + + Behavior on color { + ColorAnimation { + duration: Theme.shortDuration + easing.type: Theme.standardEasing + } + } + } + + function findParentFlickable() { + let p = root.parent; + while (p) { + if (p.hasOwnProperty("contentY") && p.hasOwnProperty("contentItem")) + return p; + p = p.parent; + } + return null; + } + + Component.onCompleted: { + if (!settingKey) + return; + let flickable = findParentFlickable(); + if (flickable) + SettingsSearchService.registerCard(settingKey, root, flickable); + } + + Component.onDestruction: { + if (settingKey) + SettingsSearchService.unregisterCard(settingKey); + } } diff --git a/quickshell/Modules/Settings/Widgets/SettingsSliderRow.qml b/quickshell/Modules/Settings/Widgets/SettingsSliderRow.qml index 8760f1e6..99089a46 100644 --- a/quickshell/Modules/Settings/Widgets/SettingsSliderRow.qml +++ b/quickshell/Modules/Settings/Widgets/SettingsSliderRow.qml @@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound import QtQuick import qs.Common +import qs.Services import qs.Widgets Item { @@ -16,6 +17,45 @@ Item { property string text: "" property string description: "" + + readonly property bool isHighlighted: settingKey !== "" && SettingsSearchService.highlightSection === settingKey + + function findParentFlickable() { + let p = root.parent; + while (p) { + if (p.hasOwnProperty("contentY") && p.hasOwnProperty("contentItem")) + return p; + p = p.parent; + } + return null; + } + + Component.onCompleted: { + if (!settingKey) + return; + let flickable = findParentFlickable(); + if (flickable) + SettingsSearchService.registerCard(settingKey, root, flickable); + } + + Component.onDestruction: { + if (settingKey) + SettingsSearchService.unregisterCard(settingKey); + } + + Rectangle { + anchors.fill: parent + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.primary, root.isHighlighted ? 0.2 : 0) + visible: root.isHighlighted + + Behavior on color { + ColorAnimation { + duration: Theme.shortDuration + easing.type: Theme.standardEasing + } + } + } property alias value: slider.value property alias minimum: slider.minimum property alias maximum: slider.maximum diff --git a/quickshell/Modules/Settings/Widgets/SettingsToggleRow.qml b/quickshell/Modules/Settings/Widgets/SettingsToggleRow.qml index baa10d87..8da1cc3b 100644 --- a/quickshell/Modules/Settings/Widgets/SettingsToggleRow.qml +++ b/quickshell/Modules/Settings/Widgets/SettingsToggleRow.qml @@ -1,6 +1,8 @@ pragma ComponentBehavior: Bound import QtQuick +import qs.Common +import qs.Services import qs.Widgets DankToggle { @@ -10,5 +12,44 @@ DankToggle { property var tags: [] property string settingKey: "" + readonly property bool isHighlighted: settingKey !== "" && SettingsSearchService.highlightSection === settingKey + width: parent?.width ?? 0 + + function findParentFlickable() { + let p = root.parent; + while (p) { + if (p.hasOwnProperty("contentY") && p.hasOwnProperty("contentItem")) + return p; + p = p.parent; + } + return null; + } + + Component.onCompleted: { + if (!settingKey) + return; + let flickable = findParentFlickable(); + if (flickable) + SettingsSearchService.registerCard(settingKey, root, flickable); + } + + Component.onDestruction: { + if (settingKey) + SettingsSearchService.unregisterCard(settingKey); + } + + Rectangle { + anchors.fill: parent + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.primary, root.isHighlighted ? 0.2 : 0) + visible: root.isHighlighted + + Behavior on color { + ColorAnimation { + duration: Theme.shortDuration + easing.type: Theme.standardEasing + } + } + } } diff --git a/quickshell/Modules/Settings/WorkspacesTab.qml b/quickshell/Modules/Settings/WorkspacesTab.qml index 41d39191..794c4590 100644 --- a/quickshell/Modules/Settings/WorkspacesTab.qml +++ b/quickshell/Modules/Settings/WorkspacesTab.qml @@ -27,6 +27,8 @@ Item { settingKey: "workspaceSettings" SettingsToggleRow { + settingKey: "showWorkspaceIndex" + tags: ["workspace", "index", "numbers", "labels"] text: I18n.tr("Workspace Index Numbers") description: I18n.tr("Show workspace index numbers in the top bar workspace switcher") checked: SettingsData.showWorkspaceIndex @@ -34,6 +36,8 @@ Item { } SettingsToggleRow { + settingKey: "showWorkspacePadding" + tags: ["workspace", "padding", "minimum"] text: I18n.tr("Workspace Padding") description: I18n.tr("Always show a minimum of 3 workspaces, even if fewer are available") checked: SettingsData.showWorkspacePadding @@ -41,6 +45,8 @@ Item { } SettingsToggleRow { + settingKey: "showWorkspaceApps" + tags: ["workspace", "apps", "icons", "applications"] text: I18n.tr("Show Workspace Apps") description: I18n.tr("Display application icons in workspace indicators") checked: SettingsData.showWorkspaceApps @@ -89,6 +95,8 @@ Item { } SettingsToggleRow { + settingKey: "workspacesPerMonitor" + tags: ["workspace", "per-monitor", "multi-monitor"] text: I18n.tr("Per-Monitor Workspaces") description: I18n.tr("Show only workspaces belonging to each specific monitor.") checked: SettingsData.workspacesPerMonitor @@ -96,6 +104,8 @@ Item { } SettingsToggleRow { + settingKey: "showOccupiedWorkspacesOnly" + tags: ["workspace", "occupied", "active", "windows"] text: I18n.tr("Show Occupied Workspaces Only") description: I18n.tr("Display only workspaces that contain windows") checked: SettingsData.showOccupiedWorkspacesOnly @@ -104,6 +114,8 @@ Item { } SettingsToggleRow { + settingKey: "dwlShowAllTags" + tags: ["dwl", "tags", "workspace"] text: I18n.tr("Show All Tags") description: I18n.tr("Show all 9 tags instead of only occupied tags (DWL only)") checked: SettingsData.dwlShowAllTags diff --git a/quickshell/Services/SettingsSearchService.qml b/quickshell/Services/SettingsSearchService.qml index edf55770..7c6d929c 100644 --- a/quickshell/Services/SettingsSearchService.qml +++ b/quickshell/Services/SettingsSearchService.qml @@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell +import Quickshell.Io import qs.Common Singleton { @@ -13,6 +14,37 @@ Singleton { property string targetSection: "" property string highlightSection: "" property var registeredCards: ({}) + property var settingsIndex: [] + property bool indexLoaded: false + + readonly property var conditionMap: ({ + "isNiri": () => CompositorService.isNiri, + "isHyprland": () => CompositorService.isHyprland, + "isDwl": () => CompositorService.isDwl, + "keybindsAvailable": () => KeybindsService.available, + "soundsAvailable": () => AudioService.soundsAvailable, + "cupsAvailable": () => CupsService.cupsAvailable, + "networkNotLegacy": () => !NetworkService.usingLegacy, + "dmsConnected": () => DMSService.isConnected && DMSService.apiVersion >= 23, + "matugenAvailable": () => Theme.matugenAvailable + }) + + Component.onCompleted: indexFile.reload() + + FileView { + id: indexFile + path: Qt.resolvedUrl("../translations/settings_search_index.json") + onLoaded: { + try { + root.settingsIndex = JSON.parse(text()); + root.indexLoaded = true; + } catch (e) { + console.warn("SettingsSearchService: Failed to parse index:", e); + root.settingsIndex = []; + } + } + onLoadFailed: error => console.warn("SettingsSearchService: Failed to load index:", error) + } function registerCard(settingKey, item, flickable) { if (!settingKey) @@ -21,9 +53,8 @@ Singleton { item: item, flickable: flickable }; - if (targetSection === settingKey) { + if (targetSection === settingKey) scrollTimer.restart(); - } } function unregisterCard(settingKey) { @@ -36,9 +67,8 @@ Singleton { function navigateToSection(section) { targetSection = section; - if (registeredCards[section]) { + if (registeredCards[section]) scrollTimer.restart(); - } } function scrollToTarget() { @@ -54,7 +84,8 @@ Singleton { if (!contentItem) return; const mapped = item.mapToItem(contentItem, 0, 0); - const targetY = Math.max(0, mapped.y - 16); + const maxY = Math.max(0, flickable.contentHeight - flickable.height); + const targetY = Math.min(maxY, Math.max(0, mapped.y - 16)); flickable.contentY = targetY; highlightSection = targetSection; @@ -78,577 +109,27 @@ Singleton { onTriggered: root.highlightSection = "" } - readonly property var settingsIndex: [ - { - label: I18n.tr("Wallpaper"), - keywords: ["background", "image", "picture", "desktop"], - tabIndex: 0, - icon: "wallpaper", - category: I18n.tr("Personalization"), - section: "wallpaper" - }, - { - label: I18n.tr("Per-Mode Wallpapers"), - keywords: ["light", "dark", "mode", "theme"], - tabIndex: 0, - icon: "contrast", - category: I18n.tr("Personalization"), - section: "wallpaper" - }, - { - label: I18n.tr("Blur on Overview"), - keywords: ["niri", "blur", "overview", "compositor"], - tabIndex: 0, - icon: "blur_on", - category: I18n.tr("Personalization"), - section: "blurWallpaper", - condition: () => CompositorService.isNiri - }, - { - label: I18n.tr("Per-Monitor Wallpapers"), - keywords: ["multi-monitor", "display", "screen"], - tabIndex: 0, - icon: "monitor", - category: I18n.tr("Personalization"), - section: "wallpaper" - }, - { - label: I18n.tr("Automatic Cycling"), - keywords: ["cycle", "rotate", "slideshow", "interval"], - tabIndex: 0, - icon: "slideshow", - category: I18n.tr("Personalization"), - section: "wallpaper" - }, - { - label: I18n.tr("Transition Effect"), - keywords: ["animation", "change", "effect"], - tabIndex: 0, - icon: "animation", - category: I18n.tr("Personalization"), - section: "wallpaper" - }, - { - label: I18n.tr("Disable Built-in Wallpapers"), - keywords: ["external", "swww", "hyprpaper", "swaybg"], - tabIndex: 0, - icon: "wallpaper", - category: I18n.tr("Personalization"), - section: "disableWallpaper" - }, - { - label: I18n.tr("Duplicate Wallpaper with Blur"), - keywords: ["blur", "layer", "niri", "compositor"], - tabIndex: 0, - icon: "blur_on", - category: I18n.tr("Personalization"), - section: "blurWallpaper", - condition: () => CompositorService.isNiri - }, - { - label: I18n.tr("Time Format"), - keywords: ["clock", "12h", "24h", "am", "pm"], - tabIndex: 1, - icon: "schedule", - category: I18n.tr("Time & Weather"), - section: "timeFormat" - }, - { - label: I18n.tr("Date Format"), - keywords: ["calendar", "day", "month", "year"], - tabIndex: 1, - icon: "calendar_today", - category: I18n.tr("Time & Weather"), - section: "dateFormat" - }, - { - label: I18n.tr("Weather"), - keywords: ["city", "temperature", "forecast", "location"], - tabIndex: 1, - icon: "thermostat", - category: I18n.tr("Time & Weather"), - section: "weather" - }, - { - label: I18n.tr("Temperature Unit"), - keywords: ["celsius", "fahrenheit", "weather"], - tabIndex: 1, - icon: "thermostat", - category: I18n.tr("Time & Weather"), - section: "weather" - }, - { - label: I18n.tr("Keyboard Shortcuts"), - keywords: ["keybinds", "hotkeys", "bindings"], - tabIndex: 2, - icon: "keyboard", - category: I18n.tr("Keyboard Shortcuts"), - section: "keybinds", - condition: () => KeybindsService.available - }, - { - label: I18n.tr("Bar Configurations"), - keywords: ["panel", "multiple", "dankbar", "manage"], - tabIndex: 3, - icon: "dashboard", - category: I18n.tr("Dank Bar"), - section: "barConfigurations" - }, - { - label: I18n.tr("Bar Position"), - keywords: ["top", "bottom", "left", "right", "panel"], - tabIndex: 3, - icon: "vertical_align_center", - category: I18n.tr("Dank Bar"), - section: "barPosition" - }, - { - label: I18n.tr("Display Assignment"), - keywords: ["monitor", "screen", "display"], - tabIndex: 3, - icon: "display_settings", - category: I18n.tr("Dank Bar"), - section: "barDisplay" - }, - { - label: I18n.tr("Bar Visibility"), - keywords: ["bar", "hide", "show", "auto-hide", "panel"], - tabIndex: 3, - icon: "visibility_off", - category: I18n.tr("Dank Bar"), - section: "barVisibility" - }, - { - label: I18n.tr("Bar Spacing"), - keywords: ["gap", "margin", "padding", "spacing"], - tabIndex: 3, - icon: "space_bar", - category: I18n.tr("Dank Bar"), - section: "barSpacing" - }, - { - label: I18n.tr("Corners & Background"), - keywords: ["rounded", "radius", "shape", "transparent"], - tabIndex: 3, - icon: "rounded_corner", - category: I18n.tr("Dank Bar"), - section: "barCorners" - }, - { - label: I18n.tr("Bar Transparency"), - keywords: ["opacity", "alpha", "translucent"], - tabIndex: 3, - icon: "opacity", - category: I18n.tr("Dank Bar"), - section: "barTransparency" - }, - { - label: I18n.tr("Workspaces"), - keywords: ["workspace", "label", "icon", "desktop"], - tabIndex: 4, - icon: "view_module", - category: I18n.tr("Workspaces"), - section: "workspaceSettings" - }, - { - label: I18n.tr("Workspace Icons"), - keywords: ["workspace", "named", "icon"], - tabIndex: 4, - icon: "label", - category: I18n.tr("Workspaces"), - section: "workspaceIcons" - }, - { - label: I18n.tr("Dock Position"), - keywords: ["taskbar", "bottom", "left", "right"], - tabIndex: 5, - icon: "dock_to_bottom", - category: I18n.tr("Dock"), - section: "dockPosition" - }, - { - label: I18n.tr("Dock Visibility"), - keywords: ["hide", "show", "auto-hide", "taskbar"], - tabIndex: 5, - icon: "visibility_off", - category: I18n.tr("Dock"), - section: "dockVisibility" - }, - { - label: I18n.tr("Dock Behavior"), - keywords: ["pinned", "apps", "click"], - tabIndex: 5, - icon: "apps", - category: I18n.tr("Dock"), - section: "dockBehavior" - }, - { - label: I18n.tr("Dock Sizing"), - keywords: ["icon", "size", "scale"], - tabIndex: 5, - icon: "photo_size_select_large", - category: I18n.tr("Dock"), - section: "dockSizing" - }, - { - label: I18n.tr("Dock Spacing"), - keywords: ["gap", "margin", "padding"], - tabIndex: 5, - icon: "space_bar", - category: I18n.tr("Dock"), - section: "dockSpacing" - }, - { - label: I18n.tr("Dock Transparency"), - keywords: ["opacity", "alpha"], - tabIndex: 5, - icon: "opacity", - category: I18n.tr("Dock"), - section: "dockTransparency" - }, - { - label: I18n.tr("Dock Border"), - keywords: ["outline", "stroke"], - tabIndex: 5, - icon: "border_style", - category: I18n.tr("Dock"), - section: "dockBorder" - }, - { - label: I18n.tr("Network"), - keywords: ["wifi", "ethernet", "internet", "connection"], - tabIndex: 7, - icon: "wifi", - category: I18n.tr("Network"), - section: "network", - condition: () => !NetworkService.usingLegacy - }, - { - label: I18n.tr("CUPS Print Server"), - keywords: ["cups", "print", "paper", "printer"], - tabIndex: 8, - icon: "print", - category: I18n.tr("System"), - section: "printers", - condition: () => CupsService.cupsAvailable - }, - { - label: I18n.tr("Launcher Logo"), - keywords: ["app", "button", "icon", "drawer"], - tabIndex: 9, - icon: "grid_view", - category: I18n.tr("Launcher"), - section: "launcherLogo" - }, - { - label: I18n.tr("Launch Prefix"), - keywords: ["terminal", "command", "prefix"], - tabIndex: 9, - icon: "terminal", - category: I18n.tr("Launcher"), - section: "launchPrefix" - }, - { - label: I18n.tr("Sorting & Layout"), - keywords: ["grid", "list", "sort", "order"], - tabIndex: 9, - icon: "sort_by_alpha", - category: I18n.tr("Launcher"), - section: "launcherSorting" - }, - { - label: I18n.tr("Recent Apps"), - keywords: ["history", "recent", "apps"], - tabIndex: 9, - icon: "history", - category: I18n.tr("Launcher"), - section: "recentApps" - }, - { - label: I18n.tr("Theme Color"), - keywords: ["palette", "accent", "primary", "appearance"], - tabIndex: 10, - icon: "palette", - category: I18n.tr("Theme & Colors"), - section: "themeColor" - }, - { - label: I18n.tr("Color Mode"), - keywords: ["light", "dark", "mode", "appearance"], - tabIndex: 10, - icon: "contrast", - category: I18n.tr("Theme & Colors"), - section: "colorMode" - }, - { - label: I18n.tr("Widget Styling"), - keywords: ["colorful", "default", "appearance", "transparency"], - tabIndex: 10, - icon: "widgets", - category: I18n.tr("Theme & Colors"), - section: "widgetStyling" - }, - { - label: I18n.tr("Niri Layout Overrides"), - keywords: ["gaps", "radius", "window", "niri"], - tabIndex: 10, - icon: "crop_square", - category: I18n.tr("Theme & Colors"), - section: "niriLayout", - condition: () => CompositorService.isNiri - }, - { - label: I18n.tr("Modal Background"), - keywords: ["overlay", "dim", "popup", "modal", "darken"], - tabIndex: 10, - icon: "brightness_low", - category: I18n.tr("Theme & Colors"), - section: "modalBackground" - }, - { - label: I18n.tr("Applications"), - keywords: ["dark", "system", "xdg", "portal", "terminal"], - tabIndex: 10, - icon: "apps", - category: I18n.tr("Theme & Colors"), - section: "applications" - }, - { - label: I18n.tr("Matugen Templates"), - keywords: ["gtk", "qt", "firefox", "theming"], - tabIndex: 10, - icon: "auto_awesome", - category: I18n.tr("Theme & Colors"), - section: "matugenTemplates" - }, - { - label: I18n.tr("Icon Theme"), - keywords: ["icons", "system", "adwaita"], - tabIndex: 10, - icon: "palette", - category: I18n.tr("Theme & Colors"), - section: "iconTheme" - }, - { - label: I18n.tr("System App Theming"), - keywords: ["gtk", "qt", "application", "theming"], - tabIndex: 10, - icon: "settings", - category: I18n.tr("Theme & Colors"), - section: "systemAppTheming" - }, - { - label: I18n.tr("Lock Screen Layout"), - keywords: ["lock", "power", "security", "layout"], - tabIndex: 11, - icon: "lock", - category: I18n.tr("Lock Screen"), - section: "lockLayout" - }, - { - label: I18n.tr("Lock Screen Behaviour"), - keywords: ["dbus", "systemd", "lock", "behavior", "fingerprint"], - tabIndex: 11, - icon: "lock", - category: I18n.tr("Lock Screen"), - section: "lockBehavior" - }, - { - label: I18n.tr("Lock Screen Display"), - keywords: ["display", "screen", "oled", "dpms", "monitor"], - tabIndex: 11, - icon: "monitor", - category: I18n.tr("Lock Screen"), - section: "lockDisplay" - }, - { - label: I18n.tr("Plugins"), - keywords: ["extension", "addon", "widget"], - tabIndex: 12, - icon: "extension", - category: I18n.tr("Plugins"), - section: "plugins" - }, - { - label: I18n.tr("About"), - keywords: ["version", "info", "credits"], - tabIndex: 13, - icon: "info", - category: I18n.tr("About"), - section: "about" - }, - { - label: I18n.tr("Typography"), - keywords: ["font", "family", "text", "typeface"], - tabIndex: 14, - icon: "text_fields", - category: I18n.tr("Typography & Motion"), - section: "typography" - }, - { - label: I18n.tr("Animation Speed"), - keywords: ["motion", "speed", "transition", "duration"], - tabIndex: 14, - icon: "animation", - category: I18n.tr("Typography & Motion"), - section: "animationSpeed" - }, - { - label: I18n.tr("System Sounds"), - keywords: ["audio", "effects", "notification", "theme", "volume"], - tabIndex: 15, - icon: "volume_up", - category: I18n.tr("Sounds"), - section: "systemSounds", - condition: () => AudioService.soundsAvailable - }, - { - label: I18n.tr("Media Player"), - keywords: ["mpris", "music", "controls", "style", "scroll"], - tabIndex: 16, - icon: "music_note", - category: I18n.tr("Media Player"), - section: "mediaPlayer" - }, - { - label: I18n.tr("Notification Popups"), - keywords: ["toast", "alert", "message", "position"], - tabIndex: 17, - icon: "notifications", - category: I18n.tr("Notifications"), - section: "notificationPopups" - }, - { - label: I18n.tr("Do Not Disturb"), - keywords: ["dnd", "quiet", "silent", "notification"], - tabIndex: 17, - icon: "notifications_off", - category: I18n.tr("Notifications"), - section: "doNotDisturb" - }, - { - label: I18n.tr("Notification Timeouts"), - keywords: ["duration", "dismiss", "popup", "low", "normal", "critical"], - tabIndex: 17, - icon: "timer", - category: I18n.tr("Notifications"), - section: "notificationTimeouts" - }, - { - label: I18n.tr("On-screen Displays"), - keywords: ["osd", "volume", "brightness", "indicator", "position"], - tabIndex: 18, - icon: "tune", - category: I18n.tr("On-screen Displays"), - section: "osd" - }, - { - label: I18n.tr("Running Apps"), - keywords: ["taskbar", "window", "active", "style"], - tabIndex: 19, - icon: "apps", - category: I18n.tr("Running Apps"), - section: "runningApps", - condition: () => CompositorService.isNiri || CompositorService.isHyprland - }, - { - label: I18n.tr("System Updater"), - keywords: ["package", "update", "upgrade", "widget"], - tabIndex: 20, - icon: "refresh", - category: I18n.tr("System Updater"), - section: "systemUpdater" - }, - { - label: I18n.tr("Idle Settings"), - keywords: ["suspend", "hibernate", "idle", "timeout", "lock", "dpms"], - tabIndex: 21, - icon: "schedule", - category: I18n.tr("Power & Sleep"), - section: "idleSettings" - }, - { - label: I18n.tr("Power Menu"), - keywords: ["shutdown", "reboot", "logout", "layout"], - tabIndex: 21, - icon: "power_settings_new", - category: I18n.tr("Power & Sleep"), - section: "powerMenu" - }, - { - label: I18n.tr("Power Confirmation"), - keywords: ["hold", "confirm", "safety"], - tabIndex: 21, - icon: "check_circle", - category: I18n.tr("Power & Sleep"), - section: "powerConfirmation" - }, - { - label: I18n.tr("Custom Power Actions"), - keywords: ["lock", "logout", "suspend", "script", "command"], - tabIndex: 21, - icon: "developer_mode", - category: I18n.tr("Power & Sleep"), - section: "customPowerActions" - }, - { - label: I18n.tr("Power Advanced"), - keywords: ["battery", "charge", "limit", "inhibit", "caffeine"], - tabIndex: 21, - icon: "tune", - category: I18n.tr("Power & Sleep"), - section: "powerAdvanced" - }, - { - label: I18n.tr("Bar Widgets"), - keywords: ["dankbar", "customize", "order", "left", "center", "right"], - tabIndex: 22, - icon: "widgets", - category: I18n.tr("Dank Bar"), - section: "widgets" - }, - { - label: I18n.tr("Clipboard"), - keywords: ["copy", "paste", "cliphist", "history"], - tabIndex: 23, - icon: "content_paste", - category: I18n.tr("System"), - section: "clipboard", - condition: () => DMSService.isConnected && DMSService.apiVersion >= 23 - }, - { - label: I18n.tr("Monitor Configuration"), - keywords: ["display", "resolution", "refresh"], - tabIndex: 24, - icon: "display_settings", - category: I18n.tr("Displays"), - section: "displayConfig" - }, - { - label: I18n.tr("Gamma Control"), - keywords: ["brightness", "color", "temperature", "night", "blue"], - tabIndex: 25, - icon: "brightness_6", - category: I18n.tr("Displays"), - section: "gammaControl" - }, - { - label: I18n.tr("Display Widgets"), - keywords: ["monitor", "position", "screen"], - tabIndex: 26, - icon: "widgets", - category: I18n.tr("Displays"), - section: "displayWidgets" - }, - { - label: I18n.tr("Desktop Widgets"), - keywords: ["clock", "monitor", "conky", "desktop"], - tabIndex: 27, - icon: "widgets", - category: I18n.tr("Desktop Widgets"), - section: "desktopWidgets" - } - ] + function checkCondition(item) { + if (!item.conditionKey) + return true; + const condFn = conditionMap[item.conditionKey]; + if (!condFn) + return true; + return condFn(); + } + + function translateItem(item) { + return { + section: item.section, + label: I18n.tr(item.label), + tabIndex: item.tabIndex, + category: I18n.tr(item.category), + keywords: item.keywords || [], + icon: item.icon || "settings", + description: item.description ? I18n.tr(item.description) : "", + conditionKey: item.conditionKey + }; + } function search(text) { query = text; @@ -662,11 +143,12 @@ Singleton { const scored = []; for (const item of settingsIndex) { - if (item.condition && !item.condition()) + if (!checkCondition(item)) continue; - const labelLower = item.label.toLowerCase(); - const categoryLower = item.category.toLowerCase(); + const translated = translateItem(item); + const labelLower = translated.label.toLowerCase(); + const categoryLower = translated.category.toLowerCase(); let score = 0; if (labelLower === queryLower) { @@ -708,7 +190,7 @@ Singleton { if (score > 0) { scored.push({ - item: item, + item: translated, score: score }); } diff --git a/quickshell/translations/extract_settings_index.py b/quickshell/translations/extract_settings_index.py new file mode 100755 index 00000000..8cec299a --- /dev/null +++ b/quickshell/translations/extract_settings_index.py @@ -0,0 +1,370 @@ +#!/usr/bin/env python3 +import os +import re +import json +from pathlib import Path + +ABBREVIATIONS = { + "on-screen displays": ["osd"], + "on-screen display": ["osd"], + "do not disturb": ["dnd"], + "keyboard shortcuts": ["keybinds", "hotkeys", "bindings", "keys"], + "notifications": ["notif", "notifs", "alerts"], + "notification": ["notif", "alert"], + "wallpaper": ["background", "bg", "image", "picture", "desktop"], + "transparency": ["opacity", "alpha", "translucent", "transparent"], + "visibility": ["visible", "hide", "show", "hidden", "autohide", "auto-hide"], + "temperature": ["temp", "celsius", "fahrenheit"], + "configuration": ["config", "configure", "setup"], + "applications": ["apps", "programs"], + "application": ["app", "program"], + "animation": ["motion", "transition", "animate", "animations"], + "typography": ["font", "fonts", "text", "typeface"], + "workspaces": ["workspace", "desktops", "virtual"], + "workspace": ["desktop", "virtual"], + "bluetooth": ["bt"], + "network": ["wifi", "wi-fi", "ethernet", "internet", "connection", "wireless"], + "display": ["monitor", "screen", "output"], + "displays": ["monitors", "screens", "outputs"], + "brightness": ["bright", "dim", "backlight"], + "volume": ["audio", "sound", "speaker", "loudness"], + "battery": ["power", "charge", "charging"], + "clock": ["time", "watch"], + "calendar": ["date", "day", "month", "year"], + "launcher": ["app drawer", "app menu", "start menu", "applications"], + "dock": ["taskbar", "panel"], + "bar": ["panel", "taskbar", "topbar", "statusbar"], + "theme": ["appearance", "look", "style", "colors", "colour"], + "color": ["colour", "hue", "tint"], + "colors": ["colours", "palette"], + "dark": ["night", "dark mode"], + "light": ["day", "light mode"], + "lock screen": ["lockscreen", "login", "security"], + "power": ["shutdown", "reboot", "restart", "suspend", "hibernate", "sleep"], + "idle": ["afk", "inactive", "timeout", "screensaver"], + "gamma": ["color temperature", "night light", "blue light", "redshift"], + "media player": ["mpris", "music", "audio", "playback"], + "clipboard": ["copy", "paste", "cliphist", "history"], + "updater": ["updates", "upgrade", "packages"], + "plugins": ["extensions", "addons", "widgets"], + "spacing": ["gap", "gaps", "margin", "margins", "padding"], + "corner": ["corners", "rounded", "radius", "round"], + "matugen": ["dynamic", "wallpaper colors", "material"], + "running apps": ["taskbar", "windows", "active", "open"], + "weather": ["forecast", "temperature", "climate"], + "sounds": ["audio", "effects", "sfx"], + "printers": ["print", "cups", "printing"], + "widgets": ["components", "modules"], +} + +CATEGORY_KEYWORDS = { + "Personalization": ["customize", "custom", "personal", "appearance"], + "Time & Weather": ["clock", "forecast", "date"], + "Keyboard Shortcuts": ["keys", "bindings", "hotkey"], + "Dank Bar": ["panel", "topbar", "statusbar"], + "Workspaces": ["virtual desktops", "spaces"], + "Dock": ["taskbar", "launcher bar"], + "Network": ["connectivity", "online"], + "System": ["os", "linux"], + "Launcher": ["start", "menu", "drawer"], + "Theme & Colors": ["appearance", "look", "style", "scheme"], + "Lock Screen": ["security", "login", "password"], + "Plugins": ["extend", "addon"], + "About": ["info", "version", "credits", "help"], + "Typography & Motion": ["fonts", "animation", "text"], + "Sounds": ["audio", "sfx", "effects"], + "Media Player": ["music", "spotify", "mpris"], + "Notifications": ["alerts", "messages", "toast"], + "On-screen Displays": ["osd", "indicator", "popup"], + "Running Apps": ["windows", "tasks", "active"], + "System Updater": ["packages", "upgrade"], + "Power & Sleep": ["shutdown", "suspend", "energy"], + "Displays": ["monitor", "screen", "resolution"], + "Desktop Widgets": ["conky", "desktop clock"], +} + +TAB_INDEX_MAP = { + "WallpaperTab.qml": 0, + "TimeWeatherTab.qml": 1, + "KeybindsTab.qml": 2, + "DankBarTab.qml": 3, + "WorkspacesTab.qml": 4, + "DockTab.qml": 5, + "NetworkTab.qml": 7, + "PrinterTab.qml": 8, + "LauncherTab.qml": 9, + "ThemeColorsTab.qml": 10, + "LockScreenTab.qml": 11, + "PluginsTab.qml": 12, + "AboutTab.qml": 13, + "TypographyMotionTab.qml": 14, + "SoundsTab.qml": 15, + "MediaPlayerTab.qml": 16, + "NotificationsTab.qml": 17, + "OSDTab.qml": 18, + "RunningAppsTab.qml": 19, + "SystemUpdaterTab.qml": 20, + "PowerSleepTab.qml": 21, + "WidgetsTab.qml": 22, + "ClipboardTab.qml": 23, + "DisplayConfigTab.qml": 24, + "GammaControlTab.qml": 25, + "DisplayWidgetsTab.qml": 26, + "DesktopWidgetsTab.qml": 27, +} + +TAB_CATEGORY_MAP = { + 0: "Personalization", + 1: "Time & Weather", + 2: "Keyboard Shortcuts", + 3: "Dank Bar", + 4: "Workspaces", + 5: "Dock", + 7: "Network", + 8: "System", + 9: "Launcher", + 10: "Theme & Colors", + 11: "Lock Screen", + 12: "Plugins", + 13: "About", + 14: "Typography & Motion", + 15: "Sounds", + 16: "Media Player", + 17: "Notifications", + 18: "On-screen Displays", + 19: "Running Apps", + 20: "System Updater", + 21: "Power & Sleep", + 22: "Dank Bar", + 23: "System", + 24: "Displays", + 25: "Displays", + 26: "Displays", + 27: "Desktop Widgets", +} + +SEARCHABLE_COMPONENTS = [ + "SettingsCard", + "SettingsToggleRow", + "SettingsSliderCard", + "SettingsDropdownRow", + "SettingsButtonGroupRow", + "SettingsSliderRow", + "SettingsToggleCard", +] + +def enrich_keywords(label, description, category, existing_tags): + keywords = set(existing_tags) + + label_lower = label.lower() + label_words = re.split(r'[\s\-_&/]+', label_lower) + keywords.update(w for w in label_words if len(w) > 2) + + for term, aliases in ABBREVIATIONS.items(): + if term in label_lower: + keywords.update(aliases) + + if description: + desc_lower = description.lower() + desc_words = re.split(r'[\s\-_&/,.]+', desc_lower) + keywords.update(w for w in desc_words if len(w) > 3 and w.isalpha()) + for term, aliases in ABBREVIATIONS.items(): + if term in desc_lower: + keywords.update(aliases) + + if category in CATEGORY_KEYWORDS: + keywords.update(CATEGORY_KEYWORDS[category]) + + cat_lower = category.lower() + cat_words = re.split(r'[\s\-_&/]+', cat_lower) + keywords.update(w for w in cat_words if len(w) > 2) + + stopwords = {'the', 'and', 'for', 'with', 'from', 'this', 'that', 'are', 'was', + 'will', 'can', 'has', 'have', 'been', 'when', 'your', 'use', 'used', + 'using', 'instead', 'like', 'such', 'also', 'only', 'which', 'each', + 'other', 'some', 'into', 'than', 'then', 'them', 'these', 'those'} + keywords = {k for k in keywords if k not in stopwords and len(k) > 1} + + return sorted(keywords) + +def extract_i18n_string(value): + match = re.search(r'I18n\.tr\(["\']([^"\']+)["\']', value) + if match: + return match.group(1) + match = re.search(r'^["\']([^"\']+)["\']$', value.strip()) + if match: + return match.group(1) + return None + +def extract_tags(value): + match = re.search(r'\[([^\]]+)\]', value) + if not match: + return [] + content = match.group(1) + tags = re.findall(r'["\']([^"\']+)["\']', content) + return tags + +def parse_component_block(content, start_pos, component_name): + brace_count = 0 + started = False + block_start = start_pos + + for i in range(start_pos, len(content)): + if content[i] == '{': + if not started: + block_start = i + started = True + brace_count += 1 + elif content[i] == '}': + brace_count -= 1 + if started and brace_count == 0: + return content[block_start:i+1] + return "" + +def extract_property(block, prop_name): + pattern = rf'{prop_name}\s*:\s*([^\n]+)' + match = re.search(pattern, block) + if match: + return match.group(1).strip() + return None + +def find_settings_components(content, filename): + results = [] + tab_index = TAB_INDEX_MAP.get(filename, -1) + + if tab_index == -1: + return results + + for component in SEARCHABLE_COMPONENTS: + pattern = rf'\b{component}\s*\{{' + for match in re.finditer(pattern, content): + block = parse_component_block(content, match.start(), component) + if not block: + continue + + setting_key = extract_property(block, "settingKey") + if setting_key: + setting_key = setting_key.strip('"\'') + + if not setting_key: + continue + + title_raw = extract_property(block, "title") + text_raw = extract_property(block, "text") + label = None + if title_raw: + label = extract_i18n_string(title_raw) + if not label and text_raw: + label = extract_i18n_string(text_raw) + + if not label: + continue + + icon_raw = extract_property(block, "iconName") + icon = None + if icon_raw: + icon = icon_raw.strip('"\'') + if icon.startswith("{") or "?" in icon: + icon = None + + tags_raw = extract_property(block, "tags") + tags = [] + if tags_raw: + tags = extract_tags(tags_raw) + + desc_raw = extract_property(block, "description") + description = None + if desc_raw: + description = extract_i18n_string(desc_raw) + + visible_raw = extract_property(block, "visible") + condition_key = None + if visible_raw: + if "CompositorService.isNiri" in visible_raw: + condition_key = "isNiri" + elif "CompositorService.isHyprland" in visible_raw: + condition_key = "isHyprland" + elif "KeybindsService.available" in visible_raw: + condition_key = "keybindsAvailable" + elif "AudioService.soundsAvailable" in visible_raw: + condition_key = "soundsAvailable" + elif "CupsService.cupsAvailable" in visible_raw: + condition_key = "cupsAvailable" + elif "NetworkService.usingLegacy" in visible_raw: + condition_key = "networkNotLegacy" + elif "DMSService.isConnected" in visible_raw: + condition_key = "dmsConnected" + elif "Theme.matugenAvailable" in visible_raw: + condition_key = "matugenAvailable" + elif "CompositorService.isDwl" in visible_raw: + condition_key = "isDwl" + + category = TAB_CATEGORY_MAP.get(tab_index, "Settings") + enriched_keywords = enrich_keywords(label, description, category, tags) + + entry = { + "section": setting_key, + "label": label, + "tabIndex": tab_index, + "category": category, + "keywords": enriched_keywords, + } + + if icon: + entry["icon"] = icon + if description: + entry["description"] = description + if condition_key: + entry["conditionKey"] = condition_key + + results.append(entry) + + return results + +def extract_settings_index(root_dir): + settings_dir = Path(root_dir) / "Modules" / "Settings" + all_entries = [] + seen_keys = set() + + for qml_file in settings_dir.glob("*.qml"): + if not qml_file.name.endswith("Tab.qml"): + continue + + with open(qml_file, 'r', encoding='utf-8') as f: + content = f.read() + + entries = find_settings_components(content, qml_file.name) + for entry in entries: + key = entry["section"] + if key not in seen_keys: + seen_keys.add(key) + all_entries.append(entry) + + return all_entries + +def main(): + script_dir = Path(__file__).parent + root_dir = script_dir.parent + + print("Extracting settings search index...") + entries = extract_settings_index(root_dir) + + entries.sort(key=lambda x: (x["tabIndex"], x["label"])) + + output_path = script_dir / "settings_search_index.json" + with open(output_path, 'w', encoding='utf-8') as f: + json.dump(entries, f, indent=2, ensure_ascii=False) + + print(f"Found {len(entries)} searchable settings") + print(f"Output: {output_path}") + + conditions = set() + for entry in entries: + if "conditionKey" in entry: + conditions.add(entry["conditionKey"]) + + if conditions: + print(f"Condition keys found: {', '.join(sorted(conditions))}") + +if __name__ == '__main__': + main() diff --git a/quickshell/translations/settings_search_index.json b/quickshell/translations/settings_search_index.json new file mode 100644 index 00000000..c7399663 --- /dev/null +++ b/quickshell/translations/settings_search_index.json @@ -0,0 +1,3666 @@ +[ + { + "section": "wallpaperCyclingEnabled", + "label": "Automatic Cycling", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "automatic", + "automatically", + "background", + "bg", + "custom", + "customize", + "cycle", + "cycling", + "desktop", + "folder", + "image", + "personal", + "personalization", + "picture", + "rotate", + "same", + "slideshow", + "through", + "wallpapers" + ], + "description": "Automatically cycle through wallpapers in the same folder" + }, + { + "section": "blurWallpaper", + "label": "Blur Wallpaper Layer", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "blur", + "compositor", + "config", + "configuration", + "configure", + "custom", + "customize", + "desktop", + "enable", + "image", + "layer", + "manual", + "niri", + "personal", + "personalization", + "picture", + "requires", + "setup", + "targetable", + "wallpaper" + ], + "description": "Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration.", + "conditionKey": "isNiri" + }, + { + "section": "blurWallpaperOnOverview", + "label": "Blur on Overview", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "blur", + "custom", + "customize", + "desktop", + "image", + "niri", + "open", + "overview", + "personal", + "personalization", + "picture", + "wallpaper" + ], + "description": "Blur wallpaper when niri overview is open", + "conditionKey": "isNiri" + }, + { + "section": "disableWallpapers", + "label": "Disable Built-in Wallpapers", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "built", + "custom", + "customize", + "desktop", + "disable", + "external", + "hyprpaper", + "image", + "management", + "manager", + "personal", + "personalization", + "picture", + "swaybg", + "swww", + "wallpaper", + "wallpapers" + ], + "description": "Use an external wallpaper manager like swww, hyprpaper, or swaybg." + }, + { + "section": "blurredWallpaperLayer", + "label": "Duplicate Wallpaper with Blur", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "blur", + "compositor", + "config", + "configuration", + "configure", + "custom", + "customize", + "desktop", + "duplicate", + "enable", + "image", + "layer", + "manual", + "niri", + "personal", + "personalization", + "picture", + "requires", + "setup", + "targetable", + "wallpaper" + ], + "description": "Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration." + }, + { + "section": "disableWallpaper", + "label": "External Wallpaper Management", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "custom", + "customize", + "desktop", + "disable", + "external", + "hyprpaper", + "image", + "management", + "manager", + "personal", + "personalization", + "picture", + "swaybg", + "swww", + "wallpaper" + ], + "icon": "wallpaper", + "description": "Use an external wallpaper manager like swww, hyprpaper, or swaybg." + }, + { + "section": "wallpaperCyclingInterval", + "label": "Interval", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "change", + "custom", + "customize", + "cycling", + "desktop", + "frequency", + "image", + "interval", + "often", + "personal", + "personalization", + "picture", + "time", + "wallpaper" + ], + "description": "How often to change wallpaper" + }, + { + "section": "matugenTargetMonitor", + "label": "Matugen Target Monitor", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "colors", + "colour", + "colours", + "custom", + "customize", + "desktop", + "drives", + "dynamic", + "hue", + "image", + "material", + "matugen", + "monitor", + "palette", + "personal", + "personalization", + "picture", + "target", + "theming", + "tint", + "wallpaper", + "wallpaper colors", + "whose" + ], + "description": "Monitor whose wallpaper drives dynamic theming colors" + }, + { + "section": "perModeWallpaper", + "label": "Per-Mode Wallpapers", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "custom", + "customize", + "dark", + "dark mode", + "day", + "desktop", + "different", + "image", + "light", + "light mode", + "mode", + "night", + "per", + "per-mode", + "personal", + "personalization", + "picture", + "theme", + "wallpapers" + ], + "description": "Set different wallpapers for light and dark mode" + }, + { + "section": "perMonitorWallpaper", + "label": "Per-Monitor Wallpapers", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "connected", + "custom", + "customize", + "desktop", + "different", + "display", + "image", + "monitor", + "multi-monitor", + "per", + "per-monitor", + "personal", + "personalization", + "picture", + "wallpapers" + ], + "description": "Set different wallpapers for each connected monitor" + }, + { + "section": "wallpaperTransition", + "label": "Transition Effect", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "animation", + "appearance", + "background", + "bg", + "change", + "changes", + "custom", + "customize", + "desktop", + "effect", + "image", + "personal", + "personalization", + "picture", + "transition", + "visual", + "wallpaper" + ], + "description": "Visual effect used when wallpaper changes" + }, + { + "section": "wallpaper", + "label": "Wallpaper", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "custom", + "customize", + "dark", + "dark mode", + "day", + "desktop", + "different", + "image", + "light", + "light mode", + "mode", + "night", + "personal", + "personalization", + "picture", + "wallpaper", + "wallpapers" + ], + "icon": "wallpaper", + "description": "Set different wallpapers for light and dark mode" + }, + { + "section": "selectedMonitor", + "label": "Wallpaper Monitor", + "tabIndex": 0, + "category": "Personalization", + "keywords": [ + "appearance", + "background", + "bg", + "configure", + "custom", + "customize", + "desktop", + "display", + "image", + "monitor", + "personal", + "personalization", + "picture", + "screen", + "select", + "wallpaper" + ], + "description": "Select monitor to configure wallpaper" + }, + { + "section": "use24HourClock", + "label": "24-Hour Format", + "tabIndex": 1, + "category": "Time & Weather", + "keywords": [ + "24hour", + "clock", + "date", + "forecast", + "format", + "hour", + "time", + "weather" + ], + "description": "Use 24-hour time format instead of 12-hour AM/PM" + }, + { + "section": "useAutoLocation", + "label": "Auto Location", + "tabIndex": 1, + "category": "Time & Weather", + "keywords": [ + "address", + "auto", + "automatically", + "clock", + "date", + "determine", + "forecast", + "gps", + "location", + "time", + "weather" + ], + "description": "Automatically determine your location using your IP address" + }, + { + "section": "dateFormat", + "label": "Date Format", + "tabIndex": 1, + "category": "Time & Weather", + "keywords": [ + "calendar", + "clock", + "date", + "forecast", + "format", + "time", + "weather" + ], + "icon": "calendar_today" + }, + { + "section": "weatherEnabled", + "label": "Enable Weather", + "tabIndex": 1, + "category": "Time & Weather", + "keywords": [ + "center", + "climate", + "clock", + "control", + "date", + "enable", + "forecast", + "information", + "panel", + "show", + "statusbar", + "taskbar", + "temperature", + "time", + "topbar", + "weather" + ], + "description": "Show weather information in top bar and control center" + }, + { + "section": "lockDateFormat", + "label": "Lock Screen Format", + "tabIndex": 1, + "category": "Time & Weather", + "keywords": [ + "clock", + "date", + "forecast", + "format", + "lock", + "lockscreen", + "login", + "screen", + "security", + "time", + "weather" + ] + }, + { + "section": "showSeconds", + "label": "Show Seconds", + "tabIndex": 1, + "category": "Time & Weather", + "keywords": [ + "clock", + "date", + "display", + "forecast", + "monitor", + "output", + "screen", + "seconds", + "show", + "time", + "watch", + "weather" + ], + "description": "Display seconds in the clock" + }, + { + "section": "timeFormat", + "label": "Time Format", + "tabIndex": 1, + "category": "Time & Weather", + "keywords": [ + "24hour", + "clock", + "date", + "forecast", + "format", + "hour", + "time", + "weather" + ], + "icon": "schedule", + "description": "Use 24-hour time format instead of 12-hour AM/PM" + }, + { + "section": "clockDateFormat", + "label": "Top Bar Format", + "tabIndex": 1, + "category": "Time & Weather", + "keywords": [ + "bar", + "clock", + "date", + "forecast", + "format", + "panel", + "statusbar", + "taskbar", + "time", + "top", + "topbar", + "weather" + ] + }, + { + "section": "useFahrenheit", + "label": "Use Imperial Units", + "tabIndex": 1, + "category": "Time & Weather", + "keywords": [ + "clock", + "date", + "fahrenheit", + "forecast", + "imperial", + "metric", + "time", + "units", + "weather" + ], + "description": "Use Imperial units (°F, mph, inHg) instead of Metric (°C, km/h, hPa)" + }, + { + "section": "weather", + "label": "Weather", + "tabIndex": 1, + "category": "Time & Weather", + "keywords": [ + "center", + "climate", + "clock", + "control", + "date", + "enable", + "forecast", + "information", + "panel", + "show", + "statusbar", + "taskbar", + "temperature", + "time", + "topbar", + "weather" + ], + "icon": "cloud", + "description": "Show weather information in top bar and control center" + }, + { + "section": "barConfigurations", + "label": "Bar Configurations", + "tabIndex": 3, + "category": "Dank Bar", + "keywords": [ + "bar", + "config", + "configurations", + "configure", + "dank", + "panel", + "setup", + "statusbar", + "taskbar", + "topbar" + ], + "icon": "dashboard" + }, + { + "section": "barCorners", + "label": "Corners & Background", + "tabIndex": 3, + "category": "Dank Bar", + "keywords": [ + "background", + "bar", + "corners", + "dank", + "panel", + "radius", + "round", + "rounded", + "statusbar", + "topbar" + ], + "icon": "rounded_corner" + }, + { + "section": "barDisplay", + "label": "Display Assignment", + "tabIndex": 3, + "category": "Dank Bar", + "keywords": [ + "assignment", + "bar", + "dank", + "display", + "monitor", + "output", + "panel", + "screen", + "statusbar", + "topbar" + ], + "icon": "display_settings" + }, + { + "section": "barPosition", + "label": "Position", + "tabIndex": 3, + "category": "Dank Bar", + "keywords": [ + "bar", + "dank", + "panel", + "position", + "statusbar", + "topbar" + ], + "icon": "vertical_align_center" + }, + { + "section": "barSpacing", + "label": "Spacing", + "tabIndex": 3, + "category": "Dank Bar", + "keywords": [ + "bar", + "dank", + "gap", + "gaps", + "margin", + "margins", + "padding", + "panel", + "spacing", + "statusbar", + "topbar" + ], + "icon": "space_bar" + }, + { + "section": "barTransparency", + "label": "Transparency", + "tabIndex": 3, + "category": "Dank Bar", + "keywords": [ + "alpha", + "bar", + "dank", + "opacity", + "panel", + "statusbar", + "topbar", + "translucent", + "transparency", + "transparent" + ], + "icon": "opacity" + }, + { + "section": "barVisibility", + "label": "Visibility", + "tabIndex": 3, + "category": "Dank Bar", + "keywords": [ + "auto-hide", + "autohide", + "bar", + "dank", + "hidden", + "hide", + "panel", + "show", + "statusbar", + "topbar", + "visibility", + "visible" + ], + "icon": "visibility_off" + }, + { + "section": "workspaceIcons", + "label": "Named Workspace Icons", + "tabIndex": 4, + "category": "Workspaces", + "keywords": [ + "desktop", + "icons", + "named", + "spaces", + "virtual", + "virtual desktops", + "workspace", + "workspaces" + ], + "icon": "label" + }, + { + "section": "workspacesPerMonitor", + "label": "Per-Monitor Workspaces", + "tabIndex": 4, + "category": "Workspaces", + "keywords": [ + "belonging", + "desktop", + "desktops", + "monitor", + "multi-monitor", + "per", + "per-monitor", + "show", + "spaces", + "specific", + "virtual", + "virtual desktops", + "workspace", + "workspaces" + ], + "description": "Show only workspaces belonging to each specific monitor." + }, + { + "section": "dwlShowAllTags", + "label": "Show All Tags", + "tabIndex": 4, + "category": "Workspaces", + "keywords": [ + "all", + "dwl", + "occupied", + "show", + "spaces", + "tags", + "virtual desktops", + "workspace", + "workspaces" + ], + "description": "Show all 9 tags instead of only occupied tags (DWL only)", + "conditionKey": "isDwl" + }, + { + "section": "showOccupiedWorkspacesOnly", + "label": "Show Occupied Workspaces Only", + "tabIndex": 4, + "category": "Workspaces", + "keywords": [ + "active", + "contain", + "desktop", + "desktops", + "display", + "monitor", + "occupied", + "output", + "screen", + "show", + "spaces", + "virtual", + "virtual desktops", + "windows", + "workspace", + "workspaces" + ], + "description": "Display only workspaces that contain windows", + "conditionKey": "isNiri" + }, + { + "section": "showWorkspaceApps", + "label": "Show Workspace Apps", + "tabIndex": 4, + "category": "Workspaces", + "keywords": [ + "app", + "application", + "applications", + "apps", + "desktop", + "display", + "icons", + "indicators", + "monitor", + "output", + "program", + "screen", + "show", + "spaces", + "virtual", + "virtual desktops", + "workspace", + "workspaces" + ], + "description": "Display application icons in workspace indicators", + "conditionKey": "isNiri" + }, + { + "section": "showWorkspaceIndex", + "label": "Workspace Index Numbers", + "tabIndex": 4, + "category": "Workspaces", + "keywords": [ + "desktop", + "index", + "labels", + "numbers", + "panel", + "show", + "spaces", + "statusbar", + "switcher", + "taskbar", + "topbar", + "virtual", + "virtual desktops", + "workspace", + "workspaces" + ], + "description": "Show workspace index numbers in the top bar workspace switcher" + }, + { + "section": "showWorkspacePadding", + "label": "Workspace Padding", + "tabIndex": 4, + "category": "Workspaces", + "keywords": [ + "always", + "available", + "desktop", + "desktops", + "even", + "fewer", + "minimum", + "padding", + "show", + "spaces", + "virtual", + "virtual desktops", + "workspace", + "workspaces" + ], + "description": "Always show a minimum of 3 workspaces, even if fewer are available" + }, + { + "section": "workspaceSettings", + "label": "Workspace Settings", + "tabIndex": 4, + "category": "Workspaces", + "keywords": [ + "desktop", + "index", + "labels", + "numbers", + "panel", + "settings", + "show", + "spaces", + "statusbar", + "switcher", + "taskbar", + "topbar", + "virtual", + "virtual desktops", + "workspace", + "workspaces" + ], + "icon": "view_module", + "description": "Show workspace index numbers in the top bar workspace switcher", + "conditionKey": "isNiri" + }, + { + "section": "dockAutoHide", + "label": "Auto-hide Dock", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "area", + "auto", + "autohide", + "dock", + "hide", + "hover", + "hovering", + "launcher bar", + "near", + "panel", + "reveal", + "taskbar" + ], + "description": "Hide the dock when not in use and reveal it when hovering near the dock area" + }, + { + "section": "dockBehavior", + "label": "Behavior", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "behavior", + "current", + "dock", + "isolate", + "launcher bar", + "monitor", + "multi-monitor", + "panel", + "show", + "taskbar", + "windows" + ], + "icon": "apps", + "description": "Only show windows from the current monitor on each dock" + }, + { + "section": "dockBorder", + "label": "Border", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "around", + "border", + "dock", + "launcher bar", + "panel", + "taskbar" + ], + "icon": "border_style", + "description": "Add a border around the dock" + }, + { + "section": "dockPosition", + "label": "Dock Position", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "dock", + "launcher bar", + "panel", + "position", + "taskbar" + ], + "icon": "swap_vert" + }, + { + "section": "dockVisibility", + "label": "Dock Visibility", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "app", + "applications", + "apps", + "auto-hide", + "autohide", + "display", + "dock", + "enable", + "hidden", + "hide", + "launcher bar", + "monitor", + "output", + "panel", + "pinned", + "program", + "programs", + "running", + "screen", + "show", + "taskbar", + "visibility", + "visible" + ], + "icon": "dock_to_bottom", + "description": "Display a dock with pinned and running applications" + }, + { + "section": "dockGroupByApp", + "label": "Group by App", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "app", + "count", + "dock", + "group", + "indicator", + "launcher bar", + "multiple", + "same", + "taskbar", + "together", + "window", + "windows" + ], + "description": "Group multiple windows of the same app together with a window count indicator" + }, + { + "section": "dockIconSize", + "label": "Icon Size", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "dock", + "icon", + "launcher bar", + "scale", + "size", + "taskbar" + ] + }, + { + "section": "dockIndicatorStyle", + "label": "Indicator Style", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "circle", + "dock", + "indicator", + "launcher bar", + "line", + "style", + "taskbar" + ] + }, + { + "section": "dockIsolateDisplays", + "label": "Isolate Displays", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "current", + "displays", + "dock", + "isolate", + "launcher bar", + "monitor", + "monitors", + "multi-monitor", + "output", + "outputs", + "panel", + "screen", + "screens", + "show", + "taskbar", + "windows" + ], + "description": "Only show windows from the current monitor on each dock" + }, + { + "section": "showDock", + "label": "Show Dock", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "app", + "applications", + "apps", + "display", + "dock", + "enable", + "launcher bar", + "monitor", + "output", + "panel", + "pinned", + "program", + "programs", + "running", + "screen", + "show", + "taskbar" + ], + "description": "Display a dock with pinned and running applications" + }, + { + "section": "dockOpenOnOverview", + "label": "Show on Overview", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "always", + "dock", + "launcher bar", + "niri", + "overview", + "panel", + "show", + "taskbar" + ], + "description": "Always show the dock when niri", + "conditionKey": "isNiri" + }, + { + "section": "dockSizing", + "label": "Sizing", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "dock", + "icon", + "launcher bar", + "scale", + "size", + "sizing", + "taskbar" + ], + "icon": "photo_size_select_large" + }, + { + "section": "dockSpacing", + "label": "Spacing", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "dock", + "gap", + "gaps", + "launcher bar", + "margin", + "margins", + "padding", + "spacing", + "taskbar" + ], + "icon": "space_bar" + }, + { + "section": "dockTransparency", + "label": "Transparency", + "tabIndex": 5, + "category": "Dock", + "keywords": [ + "alpha", + "dock", + "launcher bar", + "opacity", + "taskbar", + "translucent", + "transparency", + "transparent" + ], + "icon": "opacity" + }, + { + "section": "launcherLogoBrightness", + "label": "Brightness", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "backlight", + "bright", + "brightness", + "color", + "dim", + "drawer", + "launcher", + "logo", + "menu", + "start" + ] + }, + { + "section": "launcherLogoContrast", + "label": "Contrast", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "color", + "contrast", + "drawer", + "launcher", + "logo", + "menu", + "start" + ] + }, + { + "section": "niriOverviewOverlayEnabled", + "label": "Enable Overview Overlay", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "another", + "app drawer", + "app menu", + "applications", + "disable", + "drawer", + "enable", + "launcher", + "menu", + "niri", + "overlay", + "overview", + "show", + "start", + "start menu", + "typing" + ], + "description": "Show launcher overlay when typing in Niri overview. Disable to use another launcher." + }, + { + "section": "appLauncherGridColumns", + "label": "Grid Columns", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "adjust", + "columns", + "drawer", + "grid", + "launcher", + "layout", + "menu", + "mode", + "number", + "start", + "view" + ], + "description": "Adjust the number of columns in grid view mode." + }, + { + "section": "launcherLogoColorInvertOnMode", + "label": "Invert on mode change", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "change", + "color", + "drawer", + "invert", + "launcher", + "logo", + "menu", + "mode", + "start" + ] + }, + { + "section": "launchPrefix", + "label": "Launch Prefix", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "drawer", + "launch", + "launcher", + "menu", + "prefix", + "start" + ], + "icon": "terminal" + }, + { + "section": "launcherLogo", + "label": "Launcher Button Logo", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "app drawer", + "app menu", + "applications", + "button", + "drawer", + "launcher", + "logo", + "menu", + "offset", + "scale", + "size", + "start", + "start menu" + ], + "icon": "apps" + }, + { + "section": "spotlightCloseNiriOverview", + "label": "Niri Integration", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "apps", + "auto", + "close", + "drawer", + "integration", + "launch", + "launcher", + "launching", + "menu", + "niri", + "overview", + "start" + ], + "icon": "open_in_new", + "description": "Auto-close Niri overview when launching apps.", + "conditionKey": "isNiri" + }, + { + "section": "recentApps", + "label": "Recently Used Apps", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "apps", + "drawer", + "launcher", + "menu", + "recently", + "start" + ], + "icon": "history" + }, + { + "section": "launcherLogoSizeOffset", + "label": "Size Offset", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "drawer", + "launcher", + "logo", + "menu", + "offset", + "scale", + "size", + "start" + ] + }, + { + "section": "sortAppsAlphabetically", + "label": "Sort Alphabetically", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "alphabetically", + "apps", + "disabled", + "drawer", + "enabled", + "frequency", + "launcher", + "menu", + "order", + "sort", + "sorted", + "start", + "usage" + ], + "description": "When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency." + }, + { + "section": "launcherSorting", + "label": "Sorting & Layout", + "tabIndex": 9, + "category": "Launcher", + "keywords": [ + "alphabetically", + "apps", + "disabled", + "drawer", + "enabled", + "frequency", + "launcher", + "layout", + "menu", + "order", + "sort", + "sorted", + "sorting", + "start", + "usage" + ], + "icon": "sort_by_alpha", + "description": "When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency." + }, + { + "section": "matugenTemplateAlacritty", + "label": "Alacritty", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "alacritty", + "appearance", + "colors", + "look", + "matugen", + "scheme", + "style", + "template", + "terminal", + "theme" + ] + }, + { + "section": "applications", + "label": "Applications", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "app", + "appearance", + "applications", + "apps", + "colors", + "colour", + "dark", + "dark mode", + "hints", + "look", + "mode", + "night", + "portal", + "portals", + "program", + "programs", + "scheme", + "settings", + "style", + "sync", + "system", + "terminal", + "theme", + "wide" + ], + "icon": "terminal", + "description": "Sync dark mode with settings portals for system-wide theme hints" + }, + { + "section": "colorMode", + "label": "Color Mode", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "color", + "colors", + "colour", + "dark", + "dark mode", + "day", + "hue", + "light", + "light mode", + "look", + "mode", + "night", + "scheme", + "style", + "theme", + "tint" + ], + "icon": "contrast", + "description": "Use light theme instead of dark theme" + }, + { + "section": "cornerRadius", + "label": "Corner Radius", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "corner", + "corners", + "look", + "radius", + "round", + "rounded", + "scheme", + "square", + "style", + "theme" + ], + "description": "0 = square corners" + }, + { + "section": "modalDarkenBackground", + "label": "Darken Modal Background", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "background", + "behind", + "colors", + "dark mode", + "darken", + "darkened", + "dialogs", + "look", + "modal", + "night", + "overlay", + "scheme", + "show", + "style", + "theme" + ], + "description": "Show darkened overlay behind modal dialogs" + }, + { + "section": "matugenTemplateFirefox", + "label": "Firefox", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "firefox", + "look", + "matugen", + "scheme", + "style", + "template", + "theme" + ] + }, + { + "section": "matugenTemplateGtk", + "label": "GTK", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "gtk", + "look", + "matugen", + "scheme", + "style", + "template", + "theme" + ] + }, + { + "section": "matugenTemplateGhostty", + "label": "Ghostty", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "ghostty", + "look", + "matugen", + "scheme", + "style", + "template", + "terminal", + "theme" + ] + }, + { + "section": "iconTheme", + "label": "Icon Theme", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "colour", + "dankshell", + "icon", + "icons", + "look", + "scheme", + "style", + "system", + "theme" + ], + "description": "DankShell & System Icons (requires restart)" + }, + { + "section": "matugenTemplateKcolorscheme", + "label": "KColorScheme", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "colour", + "colours", + "hue", + "kcolorscheme", + "kde", + "look", + "matugen", + "palette", + "scheme", + "style", + "template", + "theme", + "tint" + ] + }, + { + "section": "isLightMode", + "label": "Light Mode", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "colour", + "dark", + "dark mode", + "day", + "light", + "light mode", + "look", + "mode", + "night", + "scheme", + "style", + "theme" + ], + "description": "Use light theme instead of dark theme" + }, + { + "section": "matugenScheme", + "label": "Matugen Palette", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "algorithm", + "appearance", + "background", + "based", + "bg", + "colors", + "colour", + "colours", + "desktop", + "dynamic", + "hue", + "image", + "look", + "material", + "matugen", + "palette", + "picture", + "scheme", + "select", + "style", + "theme", + "tint", + "wallpaper", + "wallpaper colors" + ], + "description": "Select the palette algorithm used for wallpaper-based colors" + }, + { + "section": "matugenTemplates", + "label": "Matugen Templates", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "dynamic", + "look", + "material", + "matugen", + "scheme", + "style", + "templates", + "theme", + "theming", + "wallpaper colors" + ], + "icon": "auto_awesome", + "conditionKey": "matugenAvailable" + }, + { + "section": "modalBackground", + "label": "Modal Background", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "background", + "behind", + "colors", + "dark mode", + "darken", + "darkened", + "dialogs", + "look", + "modal", + "night", + "overlay", + "scheme", + "show", + "style", + "theme" + ], + "description": "Show darkened overlay behind modal dialogs" + }, + { + "section": "niriLayout", + "label": "Niri Layout Overrides", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "custom", + "gap", + "gaps", + "layout", + "look", + "margin", + "margins", + "niri", + "overrides", + "padding", + "panel", + "radius", + "scheme", + "spacing", + "statusbar", + "style", + "taskbar", + "theme", + "topbar", + "window" + ], + "icon": "crop_square", + "description": "Use custom gaps instead of bar spacing", + "conditionKey": "isNiri" + }, + { + "section": "niriLayoutRadiusOverrideEnabled", + "label": "Override Corner Radius", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "colour", + "corner", + "corners", + "custom", + "look", + "niri", + "override", + "radius", + "round", + "rounded", + "scheme", + "style", + "theme", + "window" + ], + "description": "Use custom window radius instead of theme radius" + }, + { + "section": "niriLayoutGapsOverrideEnabled", + "label": "Override Gaps", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "custom", + "gap", + "gaps", + "look", + "margin", + "margins", + "niri", + "override", + "padding", + "panel", + "scheme", + "spacing", + "statusbar", + "style", + "taskbar", + "theme", + "topbar" + ], + "description": "Use custom gaps instead of bar spacing" + }, + { + "section": "popupTransparency", + "label": "Popup Transparency", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "alpha", + "appearance", + "colors", + "content", + "controls", + "layers", + "look", + "modal", + "modals", + "opacity", + "popouts", + "popup", + "scheme", + "style", + "their", + "theme", + "translucent", + "transparency", + "transparent" + ], + "description": "Controls opacity of all popouts, modals, and their content layers" + }, + { + "section": "runDmsMatugenTemplates", + "label": "Run DMS Templates", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "dms", + "look", + "matugen", + "run", + "scheme", + "style", + "templates", + "theme" + ] + }, + { + "section": "runUserMatugenTemplates", + "label": "Run User Templates", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "look", + "matugen", + "run", + "scheme", + "style", + "templates", + "theme", + "user" + ] + }, + { + "section": "syncModeWithPortal", + "label": "Sync Mode with Portal", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "colour", + "dark", + "dark mode", + "hints", + "look", + "mode", + "night", + "portal", + "portals", + "scheme", + "settings", + "style", + "sync", + "system", + "theme", + "wide" + ], + "description": "Sync dark mode with settings portals for system-wide theme hints" + }, + { + "section": "systemAppTheming", + "label": "System App Theming", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "app", + "appearance", + "colors", + "gtk", + "look", + "qt", + "scheme", + "style", + "system", + "theme", + "theming" + ], + "icon": "extension", + "conditionKey": "matugenAvailable" + }, + { + "section": "terminalsAlwaysDark", + "label": "Terminals - Always use Dark Theme", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "always", + "app", + "appearance", + "applications", + "apps", + "color", + "colors", + "colour", + "dark", + "dark mode", + "force", + "hue", + "look", + "night", + "program", + "programs", + "scheme", + "schemes", + "style", + "terminal", + "terminals", + "theme", + "tint" + ], + "description": "Force terminal applications to always use dark color schemes" + }, + { + "section": "themeColor", + "label": "Theme Color", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "algorithm", + "appearance", + "background", + "based", + "bg", + "color", + "colors", + "colour", + "colours", + "desktop", + "hue", + "image", + "look", + "palette", + "picture", + "scheme", + "select", + "style", + "theme", + "tint", + "wallpaper" + ], + "icon": "palette", + "description": "Select the palette algorithm used for wallpaper-based colors" + }, + { + "section": "matugenTemplateVscode", + "label": "VS Code", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "code", + "colors", + "look", + "matugen", + "scheme", + "style", + "template", + "theme", + "vscode" + ] + }, + { + "section": "matugenTemplateWezterm", + "label": "WezTerm", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "look", + "matugen", + "scheme", + "style", + "template", + "terminal", + "theme", + "wezterm" + ] + }, + { + "section": "widgetBackgroundColor", + "label": "Widget Background Color", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "background", + "choose", + "color", + "colors", + "colour", + "components", + "hue", + "look", + "modules", + "scheme", + "style", + "theme", + "tint", + "widget", + "widgets" + ], + "description": "Choose the background color for widgets" + }, + { + "section": "widgetColorMode", + "label": "Widget Style", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "change", + "colorful", + "colors", + "default", + "look", + "panel", + "scheme", + "statusbar", + "style", + "taskbar", + "theme", + "topbar", + "widget" + ], + "description": "Change bar appearance" + }, + { + "section": "widgetStyling", + "label": "Widget Styling", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "change", + "colors", + "look", + "opacity", + "panel", + "scheme", + "statusbar", + "style", + "styling", + "taskbar", + "theme", + "topbar", + "transparency", + "widget" + ], + "icon": "opacity", + "description": "Change bar appearance" + }, + { + "section": "niriLayoutRadiusOverride", + "label": "Window Corner Radius", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "corner", + "corners", + "look", + "niri", + "override", + "radius", + "round", + "rounded", + "scheme", + "style", + "theme", + "window", + "windows" + ], + "description": "Rounded corners for windows" + }, + { + "section": "niriLayoutGapsOverride", + "label": "Window Gaps", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "between", + "colors", + "gaps", + "look", + "niri", + "override", + "scheme", + "space", + "style", + "theme", + "window", + "windows" + ], + "description": "Space between windows" + }, + { + "section": "matugenTemplateDgop", + "label": "dgop", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "dgop", + "look", + "matugen", + "scheme", + "style", + "template", + "theme" + ] + }, + { + "section": "matugenTemplateEquibop", + "label": "equibop", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "discord", + "equibop", + "look", + "matugen", + "scheme", + "style", + "template", + "theme" + ] + }, + { + "section": "matugenTemplateFoot", + "label": "foot", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "foot", + "look", + "matugen", + "scheme", + "style", + "template", + "terminal", + "theme" + ] + }, + { + "section": "matugenTemplateKitty", + "label": "kitty", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "kitty", + "look", + "matugen", + "scheme", + "style", + "template", + "terminal", + "theme" + ] + }, + { + "section": "matugenTemplateNeovim", + "label": "neovim", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "lazy", + "look", + "manager", + "matugen", + "neovim", + "plugin", + "requires", + "scheme", + "style", + "template", + "terminal", + "theme" + ], + "description": "Requires lazy plugin manager" + }, + { + "section": "matugenTemplateNiri", + "label": "niri", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "look", + "matugen", + "niri", + "scheme", + "style", + "template", + "theme" + ] + }, + { + "section": "matugenTemplatePywalfox", + "label": "pywalfox", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "look", + "matugen", + "pywalfox", + "scheme", + "style", + "template", + "theme" + ] + }, + { + "section": "matugenTemplateQt5ct", + "label": "qt5ct", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "look", + "matugen", + "qt5ct", + "scheme", + "style", + "template", + "theme" + ] + }, + { + "section": "matugenTemplateQt6ct", + "label": "qt6ct", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "look", + "matugen", + "qt6ct", + "scheme", + "style", + "template", + "theme" + ] + }, + { + "section": "matugenTemplateVesktop", + "label": "vesktop", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "colors", + "discord", + "look", + "matugen", + "scheme", + "style", + "template", + "theme", + "vesktop" + ] + }, + { + "section": "lockScreenActiveMonitor", + "label": "Active Lock Screen Monitor", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "active", + "display", + "lock", + "lockscreen", + "login", + "monitor", + "password", + "screen", + "security" + ] + }, + { + "section": "enableFprint", + "label": "Enable fingerprint authentication", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "authentication", + "biometric", + "enable", + "enrolled", + "fingerprint", + "fprint", + "lock", + "lockscreen", + "login", + "password", + "reader", + "screen", + "security" + ], + "description": "Use fingerprint reader for lock screen authentication (requires enrolled fingerprints)" + }, + { + "section": "loginctlLockIntegration", + "label": "Enable loginctl lock integration", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "bind", + "dbus", + "disable", + "enable", + "external", + "integration", + "lock", + "lockscreen", + "login", + "loginctl", + "password", + "screen", + "security", + "signals" + ], + "description": "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen" + }, + { + "section": "lockDisplay", + "label": "Lock Screen Display", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "active", + "display", + "lock", + "lockscreen", + "login", + "monitor", + "output", + "password", + "screen", + "security" + ], + "icon": "monitor" + }, + { + "section": "lockBehavior", + "label": "Lock Screen behaviour", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "behaviour", + "bind", + "dbus", + "disable", + "external", + "integration", + "lock", + "lockscreen", + "login", + "loginctl", + "password", + "screen", + "security", + "signals" + ], + "icon": "lock", + "description": "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen" + }, + { + "section": "lockLayout", + "label": "Lock Screen layout", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "actions", + "appear", + "field", + "hidden", + "layout", + "lock", + "lockscreen", + "login", + "password", + "power", + "pressed", + "reboot", + "screen", + "security", + "shutdown", + "soon" + ], + "icon": "lock", + "description": "If the field is hidden, it will appear as soon as a key is pressed." + }, + { + "section": "lockScreenShowPasswordField", + "label": "Show Password Field", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "appear", + "field", + "hidden", + "input", + "lock", + "login", + "password", + "pressed", + "screen", + "security", + "show", + "soon", + "visible" + ], + "description": "If the field is hidden, it will appear as soon as a key is pressed." + }, + { + "section": "lockScreenShowPowerActions", + "label": "Show Power Actions", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "actions", + "hibernate", + "lock", + "login", + "password", + "power", + "reboot", + "restart", + "screen", + "security", + "show", + "shutdown", + "sleep", + "suspend" + ] + }, + { + "section": "lockScreenShowProfileImage", + "label": "Show Profile Image", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "avatar", + "image", + "lock", + "login", + "password", + "picture", + "profile", + "screen", + "security", + "show" + ] + }, + { + "section": "lockScreenShowDate", + "label": "Show System Date", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "calendar", + "date", + "display", + "lock", + "login", + "password", + "screen", + "security", + "show", + "system" + ] + }, + { + "section": "lockScreenShowSystemIcons", + "label": "Show System Icons", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "icons", + "lock", + "login", + "password", + "screen", + "security", + "show", + "status", + "system" + ] + }, + { + "section": "lockScreenShowTime", + "label": "Show System Time", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "clock", + "display", + "lock", + "login", + "password", + "screen", + "security", + "show", + "system", + "time" + ] + }, + { + "section": "animationSpeed", + "label": "Animation Speed", + "tabIndex": 14, + "category": "Typography & Motion", + "keywords": [ + "animate", + "animation", + "animations", + "duration", + "fine", + "fonts", + "milliseconds", + "motion", + "speed", + "text", + "timing", + "transition", + "tune", + "typography" + ], + "icon": "animation", + "description": "Fine-tune animation timing in milliseconds" + }, + { + "section": "customAnimationDuration", + "label": "Custom Duration", + "tabIndex": 14, + "category": "Typography & Motion", + "keywords": [ + "animate", + "animation", + "animations", + "custom", + "duration", + "fine", + "fonts", + "milliseconds", + "motion", + "speed", + "text", + "timing", + "transition", + "tune", + "typography" + ], + "description": "Fine-tune animation timing in milliseconds" + }, + { + "section": "fontScale", + "label": "Font Scale", + "tabIndex": 14, + "category": "Typography & Motion", + "keywords": [ + "animation", + "font", + "fonts", + "motion", + "scale", + "shell", + "size", + "sizes", + "text", + "throughout", + "typography", + "zoom" + ], + "description": "Scale all font sizes throughout the shell" + }, + { + "section": "fontWeight", + "label": "Font Weight", + "tabIndex": 14, + "category": "Typography & Motion", + "keywords": [ + "animation", + "bold", + "font", + "fonts", + "light", + "motion", + "select", + "text", + "typography", + "weight" + ], + "description": "Select font weight for UI text" + }, + { + "section": "monoFontFamily", + "label": "Monospace Font", + "tabIndex": 14, + "category": "Typography & Motion", + "keywords": [ + "animation", + "code", + "displays", + "font", + "fonts", + "list", + "monitor", + "monitors", + "monospace", + "motion", + "output", + "outputs", + "process", + "screen", + "screens", + "select", + "technical", + "terminal", + "text", + "typography" + ], + "description": "Select monospace font for process list and technical displays" + }, + { + "section": "fontFamily", + "label": "Normal Font", + "tabIndex": 14, + "category": "Typography & Motion", + "keywords": [ + "animation", + "family", + "font", + "fonts", + "motion", + "normal", + "select", + "text", + "typography" + ], + "description": "Select the font family for UI text" + }, + { + "section": "typography", + "label": "Typography", + "tabIndex": 14, + "category": "Typography & Motion", + "keywords": [ + "animation", + "family", + "font", + "fonts", + "motion", + "select", + "text", + "typeface", + "typography" + ], + "icon": "text_fields", + "description": "Select the font family for UI text" + }, + { + "section": "soundsEnabled", + "label": "Enable System Sounds", + "tabIndex": 15, + "category": "Sounds", + "keywords": [ + "audio", + "effects", + "enable", + "events", + "play", + "sfx", + "sound", + "sounds", + "system" + ], + "description": "Play sounds for system events" + }, + { + "section": "soundNewNotification", + "label": "New Notification", + "tabIndex": 15, + "category": "Sounds", + "keywords": [ + "alert", + "arrives", + "audio", + "effects", + "new", + "notif", + "notification", + "play", + "sfx", + "sound", + "sounds" + ], + "description": "Play sound when new notification arrives" + }, + { + "section": "soundPluggedIn", + "label": "Plugged In", + "tabIndex": 15, + "category": "Sounds", + "keywords": [ + "audio", + "cable", + "connected", + "effects", + "hibernate", + "play", + "plugged", + "power", + "reboot", + "restart", + "sfx", + "shutdown", + "sleep", + "sound", + "sounds", + "suspend" + ], + "description": "Play sound when power cable is connected" + }, + { + "section": "soundTheme", + "label": "Sound Theme", + "tabIndex": 15, + "category": "Sounds", + "keywords": [ + "appearance", + "audio", + "colors", + "colour", + "effects", + "look", + "select", + "sfx", + "sound", + "sounds", + "style", + "system", + "theme" + ], + "description": "Select system sound theme" + }, + { + "section": "systemSounds", + "label": "System Sounds", + "tabIndex": 15, + "category": "Sounds", + "keywords": [ + "audio", + "effects", + "events", + "notification", + "play", + "sfx", + "sound", + "sounds", + "system", + "volume" + ], + "description": "Play sounds for system events", + "conditionKey": "soundsAvailable" + }, + { + "section": "useSystemSoundTheme", + "label": "Use System Theme", + "tabIndex": 15, + "category": "Sounds", + "keywords": [ + "appearance", + "audio", + "colors", + "colour", + "effects", + "look", + "settings", + "sfx", + "sound", + "sounds", + "style", + "system", + "theme" + ], + "description": "Use sound theme from system settings" + }, + { + "section": "soundVolumeChanged", + "label": "Volume Changed", + "tabIndex": 15, + "category": "Sounds", + "keywords": [ + "adjusted", + "audio", + "changed", + "effects", + "loudness", + "play", + "sfx", + "sound", + "sounds", + "speaker", + "volume" + ], + "description": "Play sound when volume is adjusted" + }, + { + "section": "mediaPlayer", + "label": "Media Player Settings", + "tabIndex": 16, + "category": "Media Player", + "keywords": [ + "animated", + "audio", + "bars", + "media", + "mpris", + "music", + "panel", + "playback", + "player", + "progress", + "settings", + "spotify", + "statusbar", + "taskbar", + "topbar", + "wave" + ], + "icon": "music_note", + "description": "Use animated wave progress bars for media playback" + }, + { + "section": "notificationTimeoutCritical", + "label": "Critical Priority", + "tabIndex": 17, + "category": "Notifications", + "keywords": [ + "alert", + "alerts", + "critical", + "duration", + "messages", + "notif", + "notification", + "notifications", + "notifs", + "priority", + "timeout", + "toast" + ], + "description": "Timeout for critical priority notifications" + }, + { + "section": "doNotDisturb", + "label": "Do Not Disturb", + "tabIndex": 17, + "category": "Notifications", + "keywords": [ + "alert", + "alerts", + "disturb", + "dnd", + "enabled", + "messages", + "mute", + "not", + "notif", + "notification", + "notifications", + "popups", + "silent", + "suppress", + "toast", + "while" + ], + "icon": "notifications_off", + "description": "Suppress notification popups while enabled" + }, + { + "section": "notificationTimeoutLow", + "label": "Low Priority", + "tabIndex": 17, + "category": "Notifications", + "keywords": [ + "alert", + "alerts", + "duration", + "low", + "messages", + "notif", + "notification", + "notifications", + "notifs", + "priority", + "timeout", + "toast" + ], + "description": "Timeout for low priority notifications" + }, + { + "section": "notificationTimeoutNormal", + "label": "Normal Priority", + "tabIndex": 17, + "category": "Notifications", + "keywords": [ + "alert", + "alerts", + "duration", + "messages", + "normal", + "notif", + "notification", + "notifications", + "notifs", + "priority", + "timeout", + "toast" + ], + "description": "Timeout for normal priority notifications" + }, + { + "section": "notificationOverlayEnabled", + "label": "Notification Overlay", + "tabIndex": 17, + "category": "Notifications", + "keywords": [ + "alert", + "alerts", + "apps", + "display", + "fullscreen", + "messages", + "monitor", + "notif", + "notification", + "notifications", + "output", + "over", + "overlay", + "priorities", + "priority", + "screen", + "toast" + ], + "description": "Display all priorities over fullscreen apps" + }, + { + "section": "notificationPopups", + "label": "Notification Popups", + "tabIndex": 17, + "category": "Notifications", + "keywords": [ + "alert", + "alerts", + "appear", + "choose", + "location", + "messages", + "notif", + "notification", + "notifications", + "popup", + "popups", + "position", + "screen", + "toast", + "where" + ], + "icon": "notifications", + "description": "Choose where notification popups appear on screen" + }, + { + "section": "notificationTimeouts", + "label": "Notification Timeouts", + "tabIndex": 17, + "category": "Notifications", + "keywords": [ + "alert", + "alerts", + "duration", + "low", + "messages", + "notif", + "notification", + "notifications", + "notifs", + "priority", + "timeout", + "timeouts", + "toast" + ], + "icon": "timer", + "description": "Timeout for low priority notifications" + }, + { + "section": "notificationPopupPosition", + "label": "Popup Position", + "tabIndex": 17, + "category": "Notifications", + "keywords": [ + "alert", + "alerts", + "appear", + "choose", + "location", + "messages", + "notif", + "notification", + "notifications", + "popup", + "popups", + "position", + "screen", + "toast", + "where" + ], + "description": "Choose where notification popups appear on screen" + }, + { + "section": "osd", + "label": "On-screen Displays", + "tabIndex": 18, + "category": "On-screen Displays", + "keywords": [ + "appear", + "choose", + "displays", + "indicator", + "monitor", + "monitors", + "osd", + "output", + "outputs", + "popup", + "screen", + "screens", + "where" + ], + "icon": "tune", + "description": "Choose where on-screen displays appear on screen" + }, + { + "section": "runningApps", + "label": "Running Apps Settings", + "tabIndex": 19, + "category": "Running Apps", + "keywords": [ + "active", + "apps", + "current", + "desktop", + "open", + "running", + "settings", + "show", + "taskbar", + "tasks", + "virtual", + "windows", + "workspace" + ], + "icon": "apps", + "description": "Show only apps running in current workspace" + }, + { + "section": "systemUpdater", + "label": "System Updater", + "tabIndex": 20, + "category": "System Updater", + "keywords": [ + "found", + "hide", + "packages", + "system", + "update", + "updater", + "updates", + "upgrade", + "widget" + ], + "icon": "refresh", + "description": "When updater widget is used, then hide it if no update found" + }, + { + "section": "powerAdvanced", + "label": "Advanced", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "actually", + "advanced", + "battery", + "changes", + "charge", + "charging", + "does", + "energy", + "limit", + "percentage", + "power", + "shutdown", + "sleep", + "suspend" + ], + "icon": "tune", + "description": "Note: this only changes the percentage, it does not actually limit charging." + }, + { + "section": "lockTimeout", + "label": "Automatically lock after", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "after", + "automatic", + "automatically", + "energy", + "idle", + "lock", + "power", + "security", + "shutdown", + "sleep", + "suspend", + "timeout" + ] + }, + { + "section": "batteryChargeLimit", + "label": "Battery Charge Limit", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "actually", + "battery", + "changes", + "charge", + "charging", + "does", + "energy", + "limit", + "percentage", + "power", + "shutdown", + "sleep", + "suspend" + ], + "description": "Note: this only changes the percentage, it does not actually limit charging." + }, + { + "section": "customPowerActions", + "label": "Custom Power Actions", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "actions", + "custom", + "energy", + "hibernate", + "power", + "reboot", + "restart", + "shutdown", + "sleep", + "suspend" + ], + "icon": "developer_mode" + }, + { + "section": "powerMenuDefaultAction", + "label": "Default selected action", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "action", + "default", + "energy", + "logout", + "menu", + "power", + "reboot", + "selected", + "shutdown", + "sleep", + "suspend" + ] + }, + { + "section": "fadeToLockGracePeriod", + "label": "Fade grace period", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "energy", + "fade", + "grace", + "lock", + "period", + "power", + "shutdown", + "sleep", + "suspend", + "timeout" + ] + }, + { + "section": "fadeToLockEnabled", + "label": "Fade to lock screen", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "before", + "configurable", + "energy", + "fade", + "grace", + "grace period", + "gradually", + "idle", + "lock", + "locking", + "lockscreen", + "login", + "period", + "power", + "screen", + "security", + "shutdown", + "sleep", + "suspend" + ], + "description": "Gradually fade the screen before locking with a configurable grace period" + }, + { + "section": "powerActionHoldDuration", + "label": "Hold Duration", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "confirm", + "duration", + "energy", + "hold", + "power", + "shutdown", + "sleep", + "suspend", + "time" + ] + }, + { + "section": "powerActionConfirm", + "label": "Hold to Confirm Power Actions", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "actions", + "button", + "confirm", + "energy", + "hibernate", + "hold", + "holding", + "logout", + "power", + "reboot", + "require", + "restart", + "safety", + "shutdown", + "sleep", + "suspend" + ], + "description": "Require holding button/key to confirm power off, restart, suspend, hibernate and logout" + }, + { + "section": "idleSettings", + "label": "Idle Settings", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "afk", + "before", + "configurable", + "energy", + "fade", + "grace", + "grace period", + "gradually", + "idle", + "inactive", + "lock", + "locking", + "period", + "power", + "screen", + "screensaver", + "settings", + "shutdown", + "sleep", + "suspend", + "timeout" + ], + "icon": "schedule", + "description": "Gradually fade the screen before locking with a configurable grace period" + }, + { + "section": "lockBeforeSuspend", + "label": "Lock before suspend", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "automatically", + "before", + "energy", + "lock", + "power", + "prepares", + "screen", + "security", + "shutdown", + "sleep", + "suspend", + "system" + ], + "description": "Automatically lock the screen when the system prepares to suspend" + }, + { + "section": "powerConfirmation", + "label": "Power Action Confirmation", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "action", + "button", + "confirm", + "confirmation", + "energy", + "hibernate", + "hold", + "holding", + "logout", + "power", + "reboot", + "require", + "restart", + "safety", + "shutdown", + "sleep", + "suspend" + ], + "icon": "check_circle", + "description": "Require holding button/key to confirm power off, restart, suspend, hibernate and logout" + }, + { + "section": "powerMenu", + "label": "Power Menu Customization", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "actions", + "customization", + "display", + "energy", + "grid", + "hibernate", + "layout", + "list", + "menu", + "monitor", + "output", + "power", + "reboot", + "restart", + "screen", + "shutdown", + "sleep", + "suspend" + ], + "icon": "tune", + "description": "Display power menu actions in a grid instead of a list" + }, + { + "section": "suspendTimeout", + "label": "Suspend system after", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "after", + "energy", + "idle", + "power", + "shutdown", + "sleep", + "suspend", + "system", + "timeout" + ] + }, + { + "section": "powerProfile", + "label": "Switch to power profile", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "balanced", + "battery", + "energy", + "hibernate", + "performance", + "power", + "profile", + "reboot", + "restart", + "saver", + "shutdown", + "sleep", + "suspend", + "switch" + ] + }, + { + "section": "monitorTimeout", + "label": "Turn off monitors after", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "after", + "display", + "energy", + "idle", + "monitor", + "monitors", + "off", + "power", + "screen", + "shutdown", + "sleep", + "suspend", + "timeout", + "turn" + ] + }, + { + "section": "powerMenuGridLayout", + "label": "Use Grid Layout", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "actions", + "display", + "energy", + "grid", + "hibernate", + "layout", + "list", + "menu", + "monitor", + "output", + "power", + "reboot", + "restart", + "screen", + "shutdown", + "sleep", + "suspend" + ], + "description": "Display power menu actions in a grid instead of a list" + }, + { + "section": "disabled", + "label": "Advanced", + "tabIndex": 23, + "category": "System", + "keywords": [ + "advanced", + "clipboard", + "cliphist", + "copy", + "disable", + "entirely", + "history", + "linux", + "manager", + "os", + "paste", + "system" + ], + "icon": "tune", + "description": "Disable clipboard manager entirely (requires restart)" + }, + { + "section": "autoClearDays", + "label": "Auto-Clear After", + "tabIndex": 23, + "category": "System", + "keywords": [ + "after", + "auto", + "automatically", + "clear", + "clipboard", + "days", + "delete", + "entries", + "linux", + "older", + "os", + "system" + ], + "description": "Automatically delete entries older than this" + }, + { + "section": "clearAtStartup", + "label": "Behavior", + "tabIndex": 23, + "category": "System", + "keywords": [ + "behavior", + "clear", + "clipboard", + "history", + "linux", + "os", + "server", + "starts", + "system" + ], + "icon": "settings", + "description": "Clear all history when server starts" + }, + { + "section": "disableHistory", + "label": "Disable History Persistence", + "tabIndex": 23, + "category": "System", + "keywords": [ + "clipboard", + "cliphist", + "copy", + "disable", + "disk", + "history", + "linux", + "nothing", + "os", + "paste", + "persistence", + "saved", + "system", + "works" + ], + "description": "Clipboard works but nothing saved to disk" + }, + { + "section": "maxHistory", + "label": "History Settings", + "tabIndex": 23, + "category": "System", + "keywords": [ + "clipboard", + "cliphist", + "copy", + "entries", + "history", + "keep", + "limit", + "linux", + "maximum", + "number", + "os", + "paste", + "settings", + "system" + ], + "icon": "history", + "description": "Maximum number of clipboard entries to keep" + }, + { + "section": "maxEntrySize", + "label": "Maximum Entry Size", + "tabIndex": 23, + "category": "System", + "keywords": [ + "clipboard", + "cliphist", + "copy", + "entry", + "history", + "limit", + "linux", + "maximum", + "os", + "paste", + "size", + "system" + ], + "description": "Maximum size per clipboard entry" + } +]