diff --git a/quickshell/Common/SettingsData.qml b/quickshell/Common/SettingsData.qml index 5ecdf1972..3f1f5bba0 100644 --- a/quickshell/Common/SettingsData.qml +++ b/quickshell/Common/SettingsData.qml @@ -177,10 +177,12 @@ Singleton { property int niriLayoutRadiusOverride: -1 property int niriLayoutBorderSize: -1 property int hyprlandLayoutGapsOverride: -1 + property int hyprlandLayoutGapsOutOverride: -1 property int hyprlandLayoutRadiusOverride: -1 property int hyprlandLayoutBorderSize: -1 property bool hyprlandResizeOnBorder: false property int mangoLayoutGapsOverride: -1 + property int mangoLayoutGapsOutOverride: -1 property int mangoLayoutRadiusOverride: -1 property int mangoLayoutBorderSize: -1 property bool mangoTrackpadNaturalScrolling: true diff --git a/quickshell/Common/settings/SettingsSpec.js b/quickshell/Common/settings/SettingsSpec.js index d4b9ea75a..848b63d26 100644 --- a/quickshell/Common/settings/SettingsSpec.js +++ b/quickshell/Common/settings/SettingsSpec.js @@ -29,10 +29,12 @@ var SPEC = { niriLayoutRadiusOverride: { def: -1, onChange: "updateCompositorLayout" }, niriLayoutBorderSize: { def: -1, onChange: "updateCompositorLayout" }, hyprlandLayoutGapsOverride: { def: -1, onChange: "updateCompositorLayout" }, + hyprlandLayoutGapsOutOverride: { def: -1, onChange: "updateCompositorLayout" }, hyprlandLayoutRadiusOverride: { def: -1, onChange: "updateCompositorLayout" }, hyprlandLayoutBorderSize: { def: -1, onChange: "updateCompositorLayout" }, hyprlandResizeOnBorder: { def: false, onChange: "updateCompositorLayout" }, mangoLayoutGapsOverride: { def: -1, onChange: "updateCompositorLayout" }, + mangoLayoutGapsOutOverride: { def: -1, onChange: "updateCompositorLayout" }, mangoLayoutRadiusOverride: { def: -1, onChange: "updateCompositorLayout" }, mangoLayoutBorderSize: { def: -1, onChange: "updateCompositorLayout" }, mangoTrackpadNaturalScrolling: { def: true, onChange: "updateCompositorCursor" }, diff --git a/quickshell/Modules/DankBar/Widgets/WorkspaceSwitcher.qml b/quickshell/Modules/DankBar/Widgets/WorkspaceSwitcher.qml index 23bc3eba4..3c5ebf3c3 100644 --- a/quickshell/Modules/DankBar/Widgets/WorkspaceSwitcher.qml +++ b/quickshell/Modules/DankBar/Widgets/WorkspaceSwitcher.qml @@ -205,6 +205,21 @@ Item { return focusedWs ? focusedWs.num : 1; } + // Numbered workspaces first in id order, named (negative id) after, by name + function hyprlandWorkspaceOrder(a, b) { + const keyA = a.id < 0 ? Number.MAX_SAFE_INTEGER : a.id; + const keyB = b.id < 0 ? Number.MAX_SAFE_INTEGER : b.id; + if (keyA !== keyB) + return keyA - keyB; + return (a.name ?? "").localeCompare(b.name ?? ""); + } + + function hyprlandWorkspaceSelector(ws) { + if (!ws) + return 1; + return ws.id > 0 ? ws.id : "name:" + (ws.name ?? ""); + } + function getHyprlandWorkspaces() { const workspaces = Hyprland.workspaces?.values || []; if (workspaces.length === 0) { @@ -216,7 +231,14 @@ Item { ]; } - let filtered = workspaces.filter(ws => ws.id > -1); + // Hyprland gives named workspaces negative ids (from -1337 down); special + // workspaces always store a "special:" name prefix ("special" pre-colon era) + let filtered = workspaces.filter(ws => { + if (ws.id > 0) + return true; + const name = ws.name ?? ""; + return name !== "special" && !name.startsWith("special:"); + }); if (filtered.length === 0) { return [ { @@ -227,10 +249,10 @@ Item { } if (!root.screenName || SettingsData.workspaceFollowFocus) { - filtered = filtered.slice().sort((a, b) => a.id - b.id); + filtered = filtered.slice().sort(hyprlandWorkspaceOrder); } else { const monitorWorkspaces = filtered.filter(ws => ws.monitor?.name === root.screenName); - filtered = monitorWorkspaces.length > 0 ? monitorWorkspaces.sort((a, b) => a.id - b.id) : [ + filtered = monitorWorkspaces.length > 0 ? monitorWorkspaces.sort(hyprlandWorkspaceOrder) : [ { id: 1, name: "1" @@ -586,7 +608,7 @@ Item { break; case "hyprland": if (data.id) { - HyprlandService.focusWorkspace(data.id); + HyprlandService.focusWorkspace(hyprlandWorkspaceSelector(data)); } break; case "mango": @@ -676,7 +698,7 @@ Item { return; } - HyprlandService.focusWorkspace(realWorkspaces[nextIndex].id); + HyprlandService.focusWorkspace(hyprlandWorkspaceSelector(realWorkspaces[nextIndex])); } else if (root.isMango) { const realWorkspaces = getRealWorkspaces(); if (realWorkspaces.length < 2) { @@ -718,7 +740,7 @@ Item { if (CompositorService.isNiri) return (modelData?.idx !== undefined && modelData?.idx !== -1) ? modelData.idx : ""; if (CompositorService.isHyprland) - return modelData?.id || ""; + return modelData?.id > 0 ? modelData.id : (modelData?.name ?? ""); if (root.isMango) return (modelData?.tag !== undefined) ? (modelData.tag + 1) : ""; if (CompositorService.isSway || CompositorService.isScroll || CompositorService.isMiracle) @@ -1362,7 +1384,7 @@ Item { NiriService.switchToWorkspace(modelData.id); } } else if (CompositorService.isHyprland && modelData?.id) { - HyprlandService.focusWorkspace(modelData.id); + HyprlandService.focusWorkspace(root.hyprlandWorkspaceSelector(modelData)); } else if (root.isMango && modelData?.tag !== undefined) { MangoService.switchToTag(root.screenName, modelData.tag); } else if ((CompositorService.isSway || CompositorService.isScroll || CompositorService.isMiracle) && modelData?.num) { diff --git a/quickshell/Modules/Settings/CompositorLayoutTab.qml b/quickshell/Modules/Settings/CompositorLayoutTab.qml index 839f1b147..d0c042b39 100644 --- a/quickshell/Modules/Settings/CompositorLayoutTab.qml +++ b/quickshell/Modules/Settings/CompositorLayoutTab.qml @@ -275,19 +275,30 @@ awk '$1 == "xray" { print FILENAME ":" FNR; exit }' $files 2>/dev/null`; iconName: "layers" visible: CompositorService.isNiri - SettingsToggleRow { - tags: ["niri", "gaps", "override"] - settingKey: "niriLayoutGapsOverrideEnabled" - text: I18n.tr("Override Gaps") - description: I18n.tr("Use custom gaps instead of bar spacing") - checked: SettingsData.niriLayoutGapsOverride >= 0 - onToggled: checked => { - if (checked) { - const currentGaps = Math.max(4, (SettingsData.barConfigs[0]?.spacing ?? 4)); - SettingsData.set("niriLayoutGapsOverride", currentGaps); + SettingsButtonGroupRow { + tags: ["niri", "gaps", "override", "unmanaged"] + settingKey: "niriLayoutGapsMode" + text: I18n.tr("Gaps") + description: I18n.tr("Auto matches bar spacing; Off leaves gaps to your niri config") + model: [I18n.tr("Auto"), I18n.tr("Custom"), I18n.tr("Off")] + currentIndex: { + if (SettingsData.niriLayoutGapsOverride === -2) + return 2; + return SettingsData.niriLayoutGapsOverride >= 0 ? 1 : 0; + } + onSelectionChanged: (index, selected) => { + if (!selected) return; + switch (index) { + case 1: + SettingsData.set("niriLayoutGapsOverride", Math.max(4, (SettingsData.barConfigs[0]?.spacing ?? 4))); + return; + case 2: + SettingsData.set("niriLayoutGapsOverride", -2); + return; + default: + SettingsData.set("niriLayoutGapsOverride", -1); } - SettingsData.set("niriLayoutGapsOverride", -1); } } @@ -393,27 +404,38 @@ awk '$1 == "xray" { print FILENAME ":" FNR; exit }' $files 2>/dev/null`; iconName: "crop_square" visible: CompositorService.isHyprland - SettingsToggleRow { - tags: ["hyprland", "gaps", "override"] - settingKey: "hyprlandLayoutGapsOverrideEnabled" - text: I18n.tr("Override Gaps") - description: I18n.tr("Use custom gaps instead of bar spacing") - checked: SettingsData.hyprlandLayoutGapsOverride >= 0 - onToggled: checked => { - if (checked) { - const currentGaps = Math.max(4, (SettingsData.barConfigs[0]?.spacing ?? 4)); - SettingsData.set("hyprlandLayoutGapsOverride", currentGaps); + SettingsButtonGroupRow { + tags: ["hyprland", "gaps", "override", "inner", "outer", "unmanaged"] + settingKey: "hyprlandLayoutGapsMode" + text: I18n.tr("Gaps") + description: I18n.tr("Auto matches bar spacing; Off leaves gaps to your Hyprland config") + model: [I18n.tr("Auto"), I18n.tr("Custom"), I18n.tr("Off")] + currentIndex: { + if (SettingsData.hyprlandLayoutGapsOverride === -2) + return 2; + return SettingsData.hyprlandLayoutGapsOverride >= 0 ? 1 : 0; + } + onSelectionChanged: (index, selected) => { + if (!selected) return; + switch (index) { + case 1: + SettingsData.set("hyprlandLayoutGapsOverride", Math.max(4, (SettingsData.barConfigs[0]?.spacing ?? 4))); + return; + case 2: + SettingsData.set("hyprlandLayoutGapsOverride", -2); + return; + default: + SettingsData.set("hyprlandLayoutGapsOverride", -1); } - SettingsData.set("hyprlandLayoutGapsOverride", -1); } } SettingsSliderRow { - tags: ["hyprland", "gaps", "override"] + tags: ["hyprland", "gaps", "override", "inner"] settingKey: "hyprlandLayoutGapsOverride" - text: I18n.tr("Window Gaps") - description: I18n.tr("Space between windows") + " (gaps_in/gaps_out)" + text: I18n.tr("Inner Gaps") + description: I18n.tr("Space between windows") + " (gaps_in)" visible: SettingsData.hyprlandLayoutGapsOverride >= 0 value: Math.max(0, SettingsData.hyprlandLayoutGapsOverride) minimum: 0 @@ -423,6 +445,20 @@ awk '$1 == "xray" { print FILENAME ":" FNR; exit }' $files 2>/dev/null`; onSliderValueChanged: newValue => SettingsData.set("hyprlandLayoutGapsOverride", newValue) } + SettingsSliderRow { + tags: ["hyprland", "gaps", "override", "outer", "edge"] + settingKey: "hyprlandLayoutGapsOutOverride" + text: I18n.tr("Outer Gaps") + description: I18n.tr("Space between windows and screen edges") + " (gaps_out)" + visible: SettingsData.hyprlandLayoutGapsOverride >= 0 + value: SettingsData.hyprlandLayoutGapsOutOverride >= 0 ? SettingsData.hyprlandLayoutGapsOutOverride : Math.max(0, SettingsData.hyprlandLayoutGapsOverride) + minimum: 0 + maximum: 50 + unit: "px" + defaultValue: Math.max(0, SettingsData.hyprlandLayoutGapsOverride) + onSliderValueChanged: newValue => SettingsData.set("hyprlandLayoutGapsOutOverride", newValue) + } + SettingsToggleRow { tags: ["hyprland", "radius", "override", "rounding"] settingKey: "hyprlandLayoutRadiusOverrideEnabled" @@ -520,27 +556,38 @@ awk '$1 == "xray" { print FILENAME ":" FNR; exit }' $files 2>/dev/null`; iconName: "crop_square" visible: CompositorService.isMango - SettingsToggleRow { - tags: ["mangowc", "mango", "gaps", "override"] - settingKey: "mangoLayoutGapsOverrideEnabled" - text: I18n.tr("Override Gaps") - description: I18n.tr("Use custom gaps instead of bar spacing") - checked: SettingsData.mangoLayoutGapsOverride >= 0 - onToggled: checked => { - if (checked) { - const currentGaps = Math.max(4, (SettingsData.barConfigs[0]?.spacing ?? 4)); - SettingsData.set("mangoLayoutGapsOverride", currentGaps); + SettingsButtonGroupRow { + tags: ["mangowc", "mango", "gaps", "override", "inner", "outer", "unmanaged"] + settingKey: "mangoLayoutGapsMode" + text: I18n.tr("Gaps") + description: I18n.tr("Auto matches bar spacing; Off leaves gaps to your MangoWC config") + model: [I18n.tr("Auto"), I18n.tr("Custom"), I18n.tr("Off")] + currentIndex: { + if (SettingsData.mangoLayoutGapsOverride === -2) + return 2; + return SettingsData.mangoLayoutGapsOverride >= 0 ? 1 : 0; + } + onSelectionChanged: (index, selected) => { + if (!selected) return; + switch (index) { + case 1: + SettingsData.set("mangoLayoutGapsOverride", Math.max(4, (SettingsData.barConfigs[0]?.spacing ?? 4))); + return; + case 2: + SettingsData.set("mangoLayoutGapsOverride", -2); + return; + default: + SettingsData.set("mangoLayoutGapsOverride", -1); } - SettingsData.set("mangoLayoutGapsOverride", -1); } } SettingsSliderRow { - tags: ["mangowc", "mango", "gaps", "override"] + tags: ["mangowc", "mango", "gaps", "override", "inner"] settingKey: "mangoLayoutGapsOverride" - text: I18n.tr("Window Gaps") - description: I18n.tr("Space between windows") + " (gappih/gappiv/gappoh/gappov)" + text: I18n.tr("Inner Gaps") + description: I18n.tr("Space between windows") + " (gappih/gappiv)" visible: SettingsData.mangoLayoutGapsOverride >= 0 value: Math.max(0, SettingsData.mangoLayoutGapsOverride) minimum: 0 @@ -550,6 +597,20 @@ awk '$1 == "xray" { print FILENAME ":" FNR; exit }' $files 2>/dev/null`; onSliderValueChanged: newValue => SettingsData.set("mangoLayoutGapsOverride", newValue) } + SettingsSliderRow { + tags: ["mangowc", "mango", "gaps", "override", "outer", "edge"] + settingKey: "mangoLayoutGapsOutOverride" + text: I18n.tr("Outer Gaps") + description: I18n.tr("Space between windows and screen edges") + " (gappoh/gappov)" + visible: SettingsData.mangoLayoutGapsOverride >= 0 + value: SettingsData.mangoLayoutGapsOutOverride >= 0 ? SettingsData.mangoLayoutGapsOutOverride : Math.max(0, SettingsData.mangoLayoutGapsOverride) + minimum: 0 + maximum: 50 + unit: "px" + defaultValue: Math.max(0, SettingsData.mangoLayoutGapsOverride) + onSliderValueChanged: newValue => SettingsData.set("mangoLayoutGapsOutOverride", newValue) + } + SettingsToggleRow { tags: ["mangowc", "mango", "radius", "override"] settingKey: "mangoLayoutRadiusOverrideEnabled" diff --git a/quickshell/Services/HyprlandService.qml b/quickshell/Services/HyprlandService.qml index 70ef7b969..8a6aa3319 100644 --- a/quickshell/Services/HyprlandService.qml +++ b/quickshell/Services/HyprlandService.qml @@ -332,7 +332,10 @@ Singleton { const defaultBorderSize = 2; const cornerRadius = (typeof SettingsData !== "undefined" && SettingsData.hyprlandLayoutRadiusOverride >= 0) ? SettingsData.hyprlandLayoutRadiusOverride : defaultRadius; - const gaps = (typeof SettingsData !== "undefined" && SettingsData.hyprlandLayoutGapsOverride >= 0) ? SettingsData.hyprlandLayoutGapsOverride : defaultGaps; + const gapsOverride = typeof SettingsData !== "undefined" ? SettingsData.hyprlandLayoutGapsOverride : -1; + const manageGaps = gapsOverride !== -2; + const gapsIn = gapsOverride >= 0 ? gapsOverride : defaultGaps; + const gapsOut = (gapsOverride >= 0 && SettingsData.hyprlandLayoutGapsOutOverride >= 0) ? SettingsData.hyprlandLayoutGapsOutOverride : gapsIn; const borderSize = (typeof SettingsData !== "undefined" && SettingsData.hyprlandLayoutBorderSize >= 0) ? SettingsData.hyprlandLayoutBorderSize : defaultBorderSize; const resizeOnBorder = (typeof SettingsData !== "undefined" && SettingsData.hyprlandResizeOnBorder) ? true : false; const frameEnabled = typeof SettingsData !== "undefined" && SettingsData.frameEnabled; @@ -341,14 +344,16 @@ Singleton { // Connected frame mode has no separate bar/frame surface to target const barFrameTargetNamespace = !frameEnabled ? (SettingsData.standaloneBarXrayAvailable ? "dms:bar" : null) : (frameConnectedMode ? null : "dms:frame"); + const generalLines = []; + if (manageGaps) + generalLines.push(`gaps_in = ${gapsIn},`, `gaps_out = ${gapsOut},`); + generalLines.push(`border_size = ${borderSize},`, `resize_on_border = ${resizeOnBorder},`); + let content = `-- Auto-generated by DMS — do not edit manually hl.config({ general = { - gaps_in = ${gaps}, - gaps_out = ${gaps}, - border_size = ${borderSize}, - resize_on_border = ${resizeOnBorder}, +${generalLines.map(l => "\t\t" + l).join("\n")} }, decoration = { rounding = ${cornerRadius}, diff --git a/quickshell/Services/MangoService.qml b/quickshell/Services/MangoService.qml index f8303df2d..55cee612e 100644 --- a/quickshell/Services/MangoService.qml +++ b/quickshell/Services/MangoService.qml @@ -589,16 +589,22 @@ Singleton { const defaultBorderSize = 2; const cornerRadius = (typeof SettingsData !== "undefined" && SettingsData.mangoLayoutRadiusOverride >= 0) ? SettingsData.mangoLayoutRadiusOverride : defaultRadius; - const gaps = (typeof SettingsData !== "undefined" && SettingsData.mangoLayoutGapsOverride >= 0) ? SettingsData.mangoLayoutGapsOverride : defaultGaps; + const gapsOverride = typeof SettingsData !== "undefined" ? SettingsData.mangoLayoutGapsOverride : -1; + const manageGaps = gapsOverride !== -2; + const gapsIn = gapsOverride >= 0 ? gapsOverride : defaultGaps; + const gapsOut = (gapsOverride >= 0 && SettingsData.mangoLayoutGapsOutOverride >= 0) ? SettingsData.mangoLayoutGapsOutOverride : gapsIn; const borderSize = (typeof SettingsData !== "undefined" && SettingsData.mangoLayoutBorderSize >= 0) ? SettingsData.mangoLayoutBorderSize : defaultBorderSize; let content = `# Auto-generated by DMS - do not edit manually border_radius=${cornerRadius} -gappih=${gaps} -gappiv=${gaps} -gappoh=${gaps} -gappov=${gaps} borderpx=${borderSize} +`; + + if (manageGaps) + content += `gappih=${gapsIn} +gappiv=${gapsIn} +gappoh=${gapsOut} +gappov=${gapsOut} `; Proc.runCommand("mango-write-layout", ["sh", "-c", `mkdir -p "${mangoDmsDir}" && cat > "${layoutPath}" << 'EOF'\n${content}EOF`], (output, exitCode) => { diff --git a/quickshell/Services/NiriService.qml b/quickshell/Services/NiriService.qml index 7f86e42a7..af31c3633 100644 --- a/quickshell/Services/NiriService.qml +++ b/quickshell/Services/NiriService.qml @@ -1164,7 +1164,9 @@ Singleton { const defaultBorderSize = 2; const cornerRadius = (typeof SettingsData !== "undefined" && SettingsData.niriLayoutRadiusOverride >= 0) ? SettingsData.niriLayoutRadiusOverride : defaultRadius; - const gaps = (typeof SettingsData !== "undefined" && SettingsData.niriLayoutGapsOverride >= 0) ? SettingsData.niriLayoutGapsOverride : defaultGaps; + const gapsOverride = typeof SettingsData !== "undefined" ? SettingsData.niriLayoutGapsOverride : -1; + const manageGaps = gapsOverride !== -2; + const gaps = gapsOverride >= 0 ? gapsOverride : defaultGaps; const borderSize = (typeof SettingsData !== "undefined" && SettingsData.niriLayoutBorderSize >= 0) ? SettingsData.niriLayoutBorderSize : defaultBorderSize; const frameEnabled = typeof SettingsData !== "undefined" && SettingsData.frameEnabled; const frameConnectedMode = frameEnabled && SettingsData.frameMode === "connected"; @@ -1206,16 +1208,13 @@ layer-rule { `; + const layoutLines = []; + if (manageGaps) + layoutLines.push(` gaps ${gaps}`, ""); + layoutLines.push(" border {", ` width ${borderSize}`, " }", "", " focus-ring {", ` width ${borderSize}`, " }"); + const configContent = dmsWarning + `layout { - gaps ${gaps} - - border { - width ${borderSize} - } - - focus-ring { - width ${borderSize} - } +${layoutLines.join("\n")} } window-rule { diff --git a/quickshell/translations/settings_search_index.json b/quickshell/translations/settings_search_index.json index ae2f189dd..819c8cc60 100644 --- a/quickshell/translations/settings_search_index.json +++ b/quickshell/translations/settings_search_index.json @@ -8701,6 +8701,101 @@ "description": "Always blur against the wallpaper, even with Xray off", "conditionKey": "isNiri" }, + { + "section": "hyprlandLayoutGapsMode", + "label": "Gaps", + "tabIndex": 37, + "category": "Personalization", + "keywords": [ + "appearance", + "auto", + "config", + "custom", + "customize", + "gap", + "gaps", + "hyprland", + "inner", + "leaves", + "margin", + "margins", + "matches", + "outer", + "override", + "padding", + "panel", + "personal", + "personalization", + "statusbar", + "taskbar", + "topbar", + "unmanaged" + ], + "description": "Auto matches bar spacing; Off leaves gaps to your Hyprland config" + }, + { + "section": "mangoLayoutGapsMode", + "label": "Gaps", + "tabIndex": 37, + "category": "Personalization", + "keywords": [ + "appearance", + "auto", + "config", + "custom", + "customize", + "gap", + "gaps", + "inner", + "leaves", + "mango", + "mangowc", + "margin", + "margins", + "matches", + "outer", + "override", + "padding", + "panel", + "personal", + "personalization", + "statusbar", + "taskbar", + "topbar", + "unmanaged" + ], + "description": "Auto matches bar spacing; Off leaves gaps to your MangoWC config" + }, + { + "section": "niriLayoutGapsMode", + "label": "Gaps", + "tabIndex": 37, + "category": "Personalization", + "keywords": [ + "appearance", + "auto", + "config", + "custom", + "customize", + "gap", + "gaps", + "leaves", + "margin", + "margins", + "matches", + "niri", + "override", + "padding", + "panel", + "personal", + "personalization", + "statusbar", + "taskbar", + "topbar", + "unmanaged" + ], + "description": "Auto matches bar spacing; Off leaves gaps to your niri config" + }, { "section": "hyprlandLayout", "label": "Hyprland Layout Overrides", @@ -8708,15 +8803,19 @@ "category": "Personalization", "keywords": [ "appearance", + "auto", "border", + "config", "custom", "customize", "gap", "gaps", "hyprland", "layout", + "leaves", "margin", "margins", + "matches", "overrides", "padding", "panel", @@ -8724,16 +8823,58 @@ "personalization", "radius", "rounding", - "spacing", "statusbar", "taskbar", "topbar", "window" ], "icon": "crop_square", - "description": "Use custom gaps instead of bar spacing", + "description": "Auto matches bar spacing; Off leaves gaps to your Hyprland config", "conditionKey": "isHyprland" }, + { + "section": "hyprlandLayoutGapsOverride", + "label": "Inner Gaps", + "tabIndex": 37, + "category": "Personalization", + "keywords": [ + "appearance", + "between", + "custom", + "customize", + "gaps", + "hyprland", + "inner", + "override", + "personal", + "personalization", + "space", + "windows" + ], + "description": "Space between windows" + }, + { + "section": "mangoLayoutGapsOverride", + "label": "Inner Gaps", + "tabIndex": 37, + "category": "Personalization", + "keywords": [ + "appearance", + "between", + "custom", + "customize", + "gaps", + "inner", + "mango", + "mangowc", + "override", + "personal", + "personalization", + "space", + "windows" + ], + "description": "Space between windows" + }, { "section": "mangoLayout", "label": "MangoWC Layout Overrides", @@ -8741,31 +8882,34 @@ "category": "Personalization", "keywords": [ "appearance", + "auto", "border", + "config", "custom", "customize", "dwl", "gap", "gaps", "layout", + "leaves", "mango", "mangowc", "margin", "margins", + "matches", "overrides", "padding", "panel", "personal", "personalization", "radius", - "spacing", "statusbar", "taskbar", "topbar", "window" ], "icon": "crop_square", - "description": "Use custom gaps instead of bar spacing", + "description": "Auto matches bar spacing; Off leaves gaps to your MangoWC config", "conditionKey": "isMango" }, { @@ -8775,14 +8919,18 @@ "category": "Personalization", "keywords": [ "appearance", + "auto", "border", + "config", "custom", "customize", "gap", "gaps", "layout", + "leaves", "margin", "margins", + "matches", "niri", "overrides", "padding", @@ -8790,16 +8938,64 @@ "personal", "personalization", "radius", - "spacing", "statusbar", "taskbar", "topbar", "window" ], "icon": "layers", - "description": "Use custom gaps instead of bar spacing", + "description": "Auto matches bar spacing; Off leaves gaps to your niri config", "conditionKey": "isNiri" }, + { + "section": "hyprlandLayoutGapsOutOverride", + "label": "Outer Gaps", + "tabIndex": 37, + "category": "Personalization", + "keywords": [ + "appearance", + "between", + "custom", + "customize", + "edge", + "edges", + "gaps", + "hyprland", + "outer", + "override", + "personal", + "personalization", + "screen", + "space", + "windows" + ], + "description": "Space between windows and screen edges" + }, + { + "section": "mangoLayoutGapsOutOverride", + "label": "Outer Gaps", + "tabIndex": 37, + "category": "Personalization", + "keywords": [ + "appearance", + "between", + "custom", + "customize", + "edge", + "edges", + "gaps", + "mango", + "mangowc", + "outer", + "override", + "personal", + "personalization", + "screen", + "space", + "windows" + ], + "description": "Space between windows and screen edges" + }, { "section": "hyprlandLayoutBorderSizeEnabled", "label": "Override Border Size", @@ -8941,85 +9137,6 @@ ], "description": "Use custom window radius instead of theme radius" }, - { - "section": "hyprlandLayoutGapsOverrideEnabled", - "label": "Override Gaps", - "tabIndex": 37, - "category": "Personalization", - "keywords": [ - "appearance", - "custom", - "customize", - "gap", - "gaps", - "hyprland", - "margin", - "margins", - "override", - "padding", - "panel", - "personal", - "personalization", - "spacing", - "statusbar", - "taskbar", - "topbar" - ], - "description": "Use custom gaps instead of bar spacing" - }, - { - "section": "mangoLayoutGapsOverrideEnabled", - "label": "Override Gaps", - "tabIndex": 37, - "category": "Personalization", - "keywords": [ - "appearance", - "custom", - "customize", - "gap", - "gaps", - "mango", - "mangowc", - "margin", - "margins", - "override", - "padding", - "panel", - "personal", - "personalization", - "spacing", - "statusbar", - "taskbar", - "topbar" - ], - "description": "Use custom gaps instead of bar spacing" - }, - { - "section": "niriLayoutGapsOverrideEnabled", - "label": "Override Gaps", - "tabIndex": 37, - "category": "Personalization", - "keywords": [ - "appearance", - "custom", - "customize", - "gap", - "gaps", - "margin", - "margins", - "niri", - "override", - "padding", - "panel", - "personal", - "personalization", - "spacing", - "statusbar", - "taskbar", - "topbar" - ], - "description": "Use custom gaps instead of bar spacing" - }, { "section": "hyprlandResizeOnBorder", "label": "Resize on Border", @@ -9114,49 +9231,6 @@ ], "description": "Rounded corners for windows" }, - { - "section": "hyprlandLayoutGapsOverride", - "label": "Window Gaps", - "tabIndex": 37, - "category": "Personalization", - "keywords": [ - "appearance", - "between", - "custom", - "customize", - "gaps", - "hyprland", - "override", - "personal", - "personalization", - "space", - "window", - "windows" - ], - "description": "Space between windows" - }, - { - "section": "mangoLayoutGapsOverride", - "label": "Window Gaps", - "tabIndex": 37, - "category": "Personalization", - "keywords": [ - "appearance", - "between", - "custom", - "customize", - "gaps", - "mango", - "mangowc", - "override", - "personal", - "personalization", - "space", - "window", - "windows" - ], - "description": "Space between windows" - }, { "section": "niriLayoutGapsOverride", "label": "Window Gaps",