1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-08-01 19:18:28 -04:00

niri/xray: make bar xray implicit, add conflict detection for

configuration
This commit is contained in:
bbedward
2026-07-02 10:05:23 -04:00
parent 57d08f6b3b
commit 9ff085c46a
9 changed files with 1686 additions and 1280 deletions
+7 -6
View File
@@ -176,14 +176,10 @@ Singleton {
property int niriLayoutGapsOverride: -1
property int niriLayoutRadiusOverride: -1
property int niriLayoutBorderSize: -1
property bool niriLayoutXrayEnabled: false
property bool niriLayoutBarXrayEnabled: true
property int hyprlandLayoutGapsOverride: -1
property int hyprlandLayoutRadiusOverride: -1
property int hyprlandLayoutBorderSize: -1
property bool hyprlandResizeOnBorder: false
property bool hyprlandLayoutXrayEnabled: false
property bool hyprlandLayoutBarXrayEnabled: true
property int mangoLayoutGapsOverride: -1
property int mangoLayoutRadiusOverride: -1
property int mangoLayoutBorderSize: -1
@@ -1020,9 +1016,14 @@ Singleton {
}
]
// Bar xray is only safe when no window can end up underneath: auto-hide and overlay-layer
// bars float over windows, and negative spacing pulls windows under the strip
function _standaloneBarXrayAvailable(configs) {
const activeBars = (configs || []).filter(c => c && c.enabled && (c.visible ?? true));
return activeBars.every(c => !c.autoHide);
const list = configs || [];
const activeBars = list.filter(c => c && c.enabled && (c.visible ?? true));
const gapsOverride = (typeof CompositorService !== "undefined" && CompositorService.isHyprland) ? hyprlandLayoutGapsOverride : niriLayoutGapsOverride;
const layoutGaps = gapsOverride >= 0 ? gapsOverride : Math.max(4, (list[0]?.spacing ?? 4));
return activeBars.every(c => !c.autoHide && !(c.useOverlayLayer ?? false) && (c.spacing ?? 4) + (c.bottomGap ?? 0) + layoutGaps >= 0);
}
readonly property bool standaloneBarXrayAvailable: _standaloneBarXrayAvailable(barConfigs)
@@ -28,14 +28,10 @@ var SPEC = {
niriLayoutGapsOverride: { def: -1, onChange: "updateCompositorLayout" },
niriLayoutRadiusOverride: { def: -1, onChange: "updateCompositorLayout" },
niriLayoutBorderSize: { def: -1, onChange: "updateCompositorLayout" },
niriLayoutXrayEnabled: { def: false, onChange: "updateCompositorLayout" },
niriLayoutBarXrayEnabled: { def: true, onChange: "updateCompositorLayout" },
hyprlandLayoutGapsOverride: { def: -1, onChange: "updateCompositorLayout" },
hyprlandLayoutRadiusOverride: { def: -1, onChange: "updateCompositorLayout" },
hyprlandLayoutBorderSize: { def: -1, onChange: "updateCompositorLayout" },
hyprlandResizeOnBorder: { def: false, onChange: "updateCompositorLayout" },
hyprlandLayoutXrayEnabled: { def: false, onChange: "updateCompositorLayout" },
hyprlandLayoutBarXrayEnabled: { def: true, onChange: "updateCompositorLayout" },
mangoLayoutGapsOverride: { def: -1, onChange: "updateCompositorLayout" },
mangoLayoutRadiusOverride: { def: -1, onChange: "updateCompositorLayout" },
mangoLayoutBorderSize: { def: -1, onChange: "updateCompositorLayout" },
@@ -1,6 +1,5 @@
import QtCore
import QtQuick
import Quickshell
import qs.Common
import qs.Services
import qs.Widgets
@@ -22,6 +21,7 @@ Item {
readonly property bool readOnly: CompositorService.isHyprland && layoutIncludeStatus.readOnly === true
property bool checkingInclude: false
property bool fixingInclude: false
property string xrayConflictSource: ""
function getLayoutConfigPaths() {
const configDir = Paths.strip(StandardPaths.writableLocation(StandardPaths.ConfigLocation));
@@ -120,9 +120,28 @@ Item {
});
}
function checkXrayConflicts() {
if (!CompositorService.isNiri)
return;
const configDir = Paths.strip(StandardPaths.writableLocation(StandardPaths.ConfigLocation));
const script = `cd "${configDir}/niri" 2>/dev/null || exit 0
files="config.kdl"
for f in $(sed -nE 's/^[[:space:]]*include[[:space:]]+"([^"]+)".*/\\1/p' config.kdl 2>/dev/null); do
case "$f" in dms/*|/*dms/*) continue ;; esac
[ -f "$f" ] && files="$files $f"
done
awk '$1 == "xray" { print FILENAME ":" FNR; exit }' $files 2>/dev/null`;
Proc.runCommand("check-xray-conflict", ["sh", "-c", script], (output, exitCode) => {
xrayConflictSource = exitCode === 0 ? output.trim() : "";
});
}
Component.onCompleted: {
if (CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isMango)
if (CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isMango) {
checkLayoutIncludeStatus();
checkXrayConflicts();
}
}
DankFlickable {
@@ -215,6 +234,39 @@ Item {
}
}
StyledRect {
width: parent.width
height: xrayConflictRow.implicitHeight + Theme.spacingL * 2
radius: Theme.cornerRadius
color: Theme.withAlpha(Theme.primary, 0.15)
border.color: Theme.withAlpha(Theme.primary, 0.3)
border.width: 1
visible: root.xrayConflictSource !== ""
Row {
id: xrayConflictRow
anchors.fill: parent
anchors.margins: Theme.spacingL
spacing: Theme.spacingM
DankIcon {
name: "warning"
size: Theme.iconSize
color: Theme.primary
anchors.verticalCenter: parent.verticalCenter
}
StyledText {
width: parent.width - Theme.iconSize - Theme.spacingM
anchors.verticalCenter: parent.verticalCenter
text: I18n.tr("An xray rule at %1 may conflict with the Xray settings below").arg(root.xrayConflictSource)
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
wrapMode: Text.WordWrap
}
}
}
SettingsCard {
width: parent.width
tags: ["niri", "layout", "gaps", "radius", "window", "border"]
@@ -312,25 +364,13 @@ Item {
}
SettingsToggleRow {
visible: CompositorService.isNiri
tags: ["niri", "xray", "blur", "background-effect", "performance"]
settingKey: "niriLayoutXrayEnabled"
text: I18n.tr("Xray Blur Effect")
description: SettingsData.niriLayoutXrayEnabled ? I18n.tr("Xray on makes the windows background visible through to the wallpaper") : I18n.tr("Xray off shows the real background beneath the blurred surfaces")
checked: SettingsData.niriLayoutXrayEnabled
onToggled: checked => SettingsData.set("niriLayoutXrayEnabled", checked)
}
SettingsToggleRow {
// Hidden in Frame Connected mode, where it has no target
visible: !(SettingsData.frameEnabled && SettingsData.frameMode === "connected")
enabled: SettingsData.frameEnabled || SettingsData.standaloneBarXrayAvailable
opacity: enabled ? 1 : 0.5
tags: ["niri", "xray", "bar", "frame", "performance"]
settingKey: "niriLayoutBarXrayEnabled"
text: SettingsData.frameEnabled ? I18n.tr("Frame Xray") : I18n.tr("Dank Bar Xray")
description: !SettingsData.frameEnabled && !SettingsData.standaloneBarXrayAvailable ? I18n.tr("Unavailable while using Auto Hide as Xray would reveal the wallpaper through windows") : (SettingsData.niriLayoutBarXrayEnabled ? (SettingsData.frameEnabled ? I18n.tr("Xray on makes the Frame's border visible through to the wallpaper; more efficient") : I18n.tr("Xray on makes the Dank Bar visible through to the wallpaper; more efficient")) : (SettingsData.frameEnabled ? I18n.tr("Xray off shows the real background beneath the Frame's border") : I18n.tr("Xray off shows the real background beneath the Dank Bar")))
checked: SettingsData.niriLayoutBarXrayEnabled
onToggled: checked => SettingsData.set("niriLayoutBarXrayEnabled", checked)
description: I18n.tr("Blurred surfaces show the wallpaper instead of the content beneath")
checked: NiriService.layoutXrayEnabled
onToggled: checked => NiriService.setLayoutXray(checked)
}
}
@@ -440,25 +480,13 @@ Item {
}
SettingsToggleRow {
visible: CompositorService.isHyprland
tags: ["hyprland", "xray", "blur", "background-effect", "performance"]
settingKey: "hyprlandLayoutXrayEnabled"
text: I18n.tr("Xray Blur Effect")
description: SettingsData.hyprlandLayoutXrayEnabled ? I18n.tr("Xray on makes the windows background visible through to the wallpaper") : I18n.tr("Xray off shows the real background beneath the blurred surfaces")
checked: SettingsData.hyprlandLayoutXrayEnabled
onToggled: checked => SettingsData.set("hyprlandLayoutXrayEnabled", checked)
}
SettingsToggleRow {
// Hidden in Frame Connected mode, where it has no target
visible: !(SettingsData.frameEnabled && SettingsData.frameMode === "connected")
enabled: SettingsData.frameEnabled || SettingsData.standaloneBarXrayAvailable
opacity: enabled ? 1 : 0.5
tags: ["hyprland", "xray", "bar", "frame", "performance"]
settingKey: "hyprlandLayoutBarXrayEnabled"
text: SettingsData.frameEnabled ? I18n.tr("Frame Xray") : I18n.tr("Dank Bar Xray")
description: !SettingsData.frameEnabled && !SettingsData.standaloneBarXrayAvailable ? I18n.tr("Unavailable while an enabled Dank Bar uses Auto Hide because Xray would reveal the wallpaper through windows") : (SettingsData.hyprlandLayoutBarXrayEnabled ? (SettingsData.frameEnabled ? I18n.tr("Xray on makes the Frame's border visible through to the wallpaper; more efficient") : I18n.tr("Xray on makes the Dank Bar visible through to the wallpaper; more efficient")) : (SettingsData.frameEnabled ? I18n.tr("Xray off shows the real background beneath the Frame's border") : I18n.tr("Xray off shows the real background beneath the Dank Bar")))
checked: SettingsData.hyprlandLayoutBarXrayEnabled
onToggled: checked => SettingsData.set("hyprlandLayoutBarXrayEnabled", checked)
description: I18n.tr("Blurred surfaces show the wallpaper instead of the content beneath")
checked: HyprlandService.layoutXrayEnabled
onToggled: checked => HyprlandService.setLayoutXray(checked)
}
}
@@ -1816,7 +1816,7 @@ Item {
Item {
width: parent.width
height: xrayHintRow.implicitHeight
visible: CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isMango
visible: CompositorService.isNiri || CompositorService.isHyprland
Row {
id: xrayHintRow
@@ -1833,7 +1833,7 @@ Item {
StyledText {
width: parent.width - Theme.iconSizeSmall - Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
text: I18n.tr("Xray specific options for blurred surfaces live in Compositor → Layout")
text: I18n.tr("Xray options are in Compositor → Layout")
font.pixelSize: Theme.fontSizeSmall
color: Theme.primary
wrapMode: Text.Wrap
+34 -5
View File
@@ -32,6 +32,11 @@ Singleton {
property int _frameTransitionRevision: 0
readonly property bool frameLayoutReady: _layoutAppliedRevision >= _frameTransitionRevision
// dms/layout.lua is the source of truth for xray; parsed once before the first regeneration
property bool layoutXrayEnabled: false
property bool _layoutXrayLoaded: false
property bool _layoutXrayLoading: false
DeferredAction {
id: layoutGenerationAction
onTriggered: root.doGenerateLayoutConfig()
@@ -262,6 +267,28 @@ Singleton {
});
}
function setLayoutXray(enabled) {
layoutXrayEnabled = enabled;
_layoutXrayLoaded = true;
generateLayoutConfig();
}
function loadLayoutXrayState() {
if (_layoutXrayLoading)
return;
_layoutXrayLoading = true;
const configDir = Paths.strip(StandardPaths.writableLocation(StandardPaths.ConfigLocation));
Proc.runCommand("hypr-read-layout-xray", ["cat", configDir + "/hypr/dms/layout.lua"], (output, exitCode) => {
_layoutXrayLoading = false;
if (!_layoutXrayLoaded) {
layoutXrayEnabled = exitCode === 0 && output.includes('"^dms:.*$"');
_layoutXrayLoaded = true;
}
if (layoutGenerationPending)
layoutGenerationAction.schedule();
});
}
function generateLayoutConfig(frameTransition) {
if (!CompositorService.isHyprland)
return;
@@ -275,6 +302,10 @@ Singleton {
function doGenerateLayoutConfig() {
if (layoutGenerationRunning)
return;
if (!_layoutXrayLoaded) {
loadLayoutXrayState();
return;
}
layoutGenerationPending = false;
const requestRevision = _layoutRequestRevision;
if (!canWriteLuaConfig("layout")) {
@@ -295,12 +326,10 @@ Singleton {
const gaps = (typeof SettingsData !== "undefined" && SettingsData.hyprlandLayoutGapsOverride >= 0) ? SettingsData.hyprlandLayoutGapsOverride : defaultGaps;
const borderSize = (typeof SettingsData !== "undefined" && SettingsData.hyprlandLayoutBorderSize >= 0) ? SettingsData.hyprlandLayoutBorderSize : defaultBorderSize;
const resizeOnBorder = (typeof SettingsData !== "undefined" && SettingsData.hyprlandResizeOnBorder) ? true : false;
const xrayEnabled = typeof SettingsData !== "undefined" && SettingsData.hyprlandLayoutXrayEnabled;
const barFrameXrayEnabled = typeof SettingsData === "undefined" || SettingsData.hyprlandLayoutBarXrayEnabled;
const frameEnabled = typeof SettingsData !== "undefined" && SettingsData.frameEnabled;
const frameConnectedMode = frameEnabled && SettingsData.frameMode === "connected";
// Hyprland `xray = false` is still early-development; unset already samples real content, so only force xray=true
// Standalone Bar Xray is safe only while every active bar reserves its strip
// Bar/Frame sit flush on the wallpaper, so force the cheap xray blur whenever safe
const barFrameTargetNamespace = !frameEnabled ? (SettingsData.standaloneBarXrayAvailable ? "dms:bar" : null) : (frameConnectedMode ? null : "dms:frame");
let content = `-- Auto-generated by DMS do not edit manually
@@ -318,7 +347,7 @@ hl.config({
})
`;
if (xrayEnabled) {
if (layoutXrayEnabled) {
content += `
hl.layer_rule({
match = { namespace = "^dms:.*$" },
@@ -326,7 +355,7 @@ hl.layer_rule({
})
`;
}
if (barFrameXrayEnabled && barFrameTargetNamespace) {
if (barFrameTargetNamespace) {
content += `
hl.layer_rule({
match = { namespace = "^${barFrameTargetNamespace}$" },
+67 -35
View File
@@ -49,6 +49,11 @@ Singleton {
property string _lastGeneratedAlttabContent: ""
readonly property bool frameLayoutReady: _layoutAppliedRevision >= _frameTransitionRevision
// dms/layout.kdl is the source of truth for xray; parsed once before the first regeneration
property bool layoutXrayEnabled: true
property bool _layoutXrayLoaded: false
property bool _layoutXrayLoading: false
readonly property string screenshotsDir: Paths.strip(StandardPaths.writableLocation(StandardPaths.PicturesLocation)) + "/Screenshots"
property string pendingScreenshotPath: ""
@@ -1094,6 +1099,28 @@ Singleton {
return _matchAndEnrichToplevels(toplevels, windows.filter(nw => outputWorkspaceIds.has(nw.workspace_id)));
}
function setLayoutXray(enabled) {
layoutXrayEnabled = enabled;
_layoutXrayLoaded = true;
generateNiriLayoutConfig();
}
function loadLayoutXrayState() {
if (_layoutXrayLoading)
return;
_layoutXrayLoading = true;
const configDir = Paths.strip(StandardPaths.writableLocation(StandardPaths.ConfigLocation));
Proc.runCommand("niri-read-layout-xray", ["cat", configDir + "/niri/dms/layout.kdl"], (output, exitCode) => {
_layoutXrayLoading = false;
if (!_layoutXrayLoaded) {
layoutXrayEnabled = exitCode !== 0 || !output.includes("xray false");
_layoutXrayLoaded = true;
}
if (configGenerationPending)
configGenerationAction.schedule();
});
}
function generateNiriLayoutConfig(frameTransition) {
if (!CompositorService.isNiri)
return;
@@ -1108,6 +1135,10 @@ Singleton {
function doGenerateNiriLayoutConfig() {
if (writeConfigProcess.running || _awaitingLayoutReloadRevision > _layoutAppliedRevision)
return;
if (!_layoutXrayLoaded) {
loadLayoutXrayState();
return;
}
configGenerationPending = false;
log.debug("Generating layout config...");
@@ -1118,63 +1149,65 @@ Singleton {
const cornerRadius = (typeof SettingsData !== "undefined" && SettingsData.niriLayoutRadiusOverride >= 0) ? SettingsData.niriLayoutRadiusOverride : defaultRadius;
const gaps = (typeof SettingsData !== "undefined" && SettingsData.niriLayoutGapsOverride >= 0) ? SettingsData.niriLayoutGapsOverride : defaultGaps;
const borderSize = (typeof SettingsData !== "undefined" && SettingsData.niriLayoutBorderSize >= 0) ? SettingsData.niriLayoutBorderSize : defaultBorderSize;
const xrayEnabled = typeof SettingsData !== "undefined" && SettingsData.niriLayoutXrayEnabled;
const barFrameXrayEnabled = typeof SettingsData === "undefined" || SettingsData.niriLayoutBarXrayEnabled;
const frameEnabled = typeof SettingsData !== "undefined" && SettingsData.frameEnabled;
const frameConnectedMode = frameEnabled && SettingsData.frameMode === "connected";
// Standalone Bar Xray is safe only while every active bar reserves its strip
// Bar/Frame sit flush on the wallpaper, so force the cheap xray blur whenever safe
const barFrameTargetNamespace = !frameEnabled ? (SettingsData.standaloneBarXrayAvailable ? "dms:bar" : null) : (frameConnectedMode ? null : "dms:frame");
// Xray is niri's default blur, so only the off state needs a rule
let xrayRules = "";
if (!xrayEnabled) {
if (!layoutXrayEnabled) {
xrayRules += `
layer-rule {
match namespace=".*"
background-effect {
layer-rule {
background-effect {
xray false
}
}`;
}
}`;
}
if (barFrameXrayEnabled && barFrameTargetNamespace) {
if (barFrameTargetNamespace) {
xrayRules += `
layer-rule {
match namespace="^${barFrameTargetNamespace}$"
background-effect {
layer-rule {
match namespace="^${barFrameTargetNamespace}$"
background-effect {
xray true
}
}`;
}
}`;
}
const dmsWarning = `// ! DO NOT EDIT !
// ! AUTO-GENERATED BY DMS !
// ! CHANGES WILL BE OVERWRITTEN !
// ! PLACE YOUR CUSTOM CONFIGURATION ELSEWHERE !
// ! AUTO-GENERATED BY DMS !
// ! CHANGES WILL BE OVERWRITTEN !
// ! PLACE YOUR CUSTOM CONFIGURATION ELSEWHERE !
`;
`;
const configContent = dmsWarning + `layout {
gaps ${gaps}
gaps ${gaps}
border {
border {
width ${borderSize}
}
}
focus-ring {
focus-ring {
width ${borderSize}
}
}
window-rule {
geometry-corner-radius ${cornerRadius}
clip-to-geometry true
tiled-state true
draw-border-with-background false
}` + xrayRules;
}
}
window-rule {
geometry-corner-radius ${cornerRadius}
clip-to-geometry true
tiled-state true
draw-border-with-background false
}` + xrayRules;
const alttabContent = dmsWarning + `recent-windows {
highlight {
highlight {
corner-radius ${cornerRadius}
}
}`;
}
}`;
const configDir = Paths.strip(StandardPaths.writableLocation(StandardPaths.ConfigLocation));
const niriDmsDir = configDir + "/niri/dms";
@@ -1203,7 +1236,6 @@ Singleton {
log.warn("Failed to ensure " + name + ".kdl, exit code:", exitCode);
});
}
}
function generateNiriBlurrule() {
File diff suppressed because it is too large Load Diff
@@ -8642,80 +8642,6 @@
],
"description": "Width of window border and focus ring"
},
{
"section": "hyprlandLayoutBarXrayEnabled",
"label": "Frame Xray",
"tabIndex": 37,
"category": "Personalization",
"keywords": [
"appearance",
"auto",
"background",
"bar",
"because",
"bg",
"custom",
"customize",
"dank",
"desktop",
"enabled",
"frame",
"hide",
"hyprland",
"image",
"panel",
"performance",
"personal",
"personalization",
"picture",
"reveal",
"statusbar",
"taskbar",
"through",
"topbar",
"unavailable",
"uses",
"wallpaper",
"while",
"windows",
"would",
"xray"
],
"description": "Unavailable while an enabled Dank Bar uses Auto Hide because Xray would reveal the wallpaper through windows"
},
{
"section": "niriLayoutBarXrayEnabled",
"label": "Frame Xray",
"tabIndex": 37,
"category": "Personalization",
"keywords": [
"appearance",
"auto",
"background",
"bar",
"bg",
"custom",
"customize",
"desktop",
"frame",
"hide",
"image",
"niri",
"performance",
"personal",
"personalization",
"picture",
"reveal",
"through",
"unavailable",
"wallpaper",
"while",
"windows",
"would",
"xray"
],
"description": "Unavailable while using Auto Hide as Xray would reveal the wallpaper through windows"
},
{
"section": "hyprlandLayout",
"label": "Hyprland Layout Overrides",
@@ -9202,26 +9128,28 @@
"appearance",
"background",
"background-effect",
"beneath",
"bg",
"blur",
"blurred",
"content",
"custom",
"customize",
"desktop",
"effect",
"hyprland",
"image",
"makes",
"performance",
"personal",
"personalization",
"picture",
"through",
"visible",
"show",
"surfaces",
"wallpaper",
"windows",
"xray"
],
"description": "Xray on makes the windows background visible through to the wallpaper"
"description": "Blurred surfaces show the wallpaper instead of the content beneath",
"conditionKey": "isHyprland"
},
{
"section": "niriLayoutXrayEnabled",
@@ -9232,26 +9160,28 @@
"appearance",
"background",
"background-effect",
"beneath",
"bg",
"blur",
"blurred",
"content",
"custom",
"customize",
"desktop",
"effect",
"image",
"makes",
"niri",
"performance",
"personal",
"personalization",
"picture",
"through",
"visible",
"show",
"surfaces",
"wallpaper",
"windows",
"xray"
],
"description": "Xray on makes the windows background visible through to the wallpaper"
"description": "Blurred surfaces show the wallpaper instead of the content beneath",
"conditionKey": "isNiri"
},
{
"section": "windowRules",
+326 -116
View File
@@ -20,6 +20,13 @@
"reference": "",
"comment": ""
},
{
"term": "%1 Startup Failed",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "%1 active session",
"translation": "",
@@ -111,20 +118,6 @@
"reference": "",
"comment": ""
},
{
"term": "%1 exists but is not included in config. Custom keybinds will not work until this is fixed.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "%1 exists but is not included. Window rules won't apply.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "%1 filtered",
"translation": "",
@@ -1357,6 +1350,13 @@
"reference": "",
"comment": ""
},
{
"term": "An xray rule at %1 may conflict with the Xray settings below",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Analog",
"translation": "",
@@ -1490,6 +1490,13 @@
"reference": "",
"comment": ""
},
{
"term": "App name or identity (e.g., firefox)",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Appearance",
"translation": "",
@@ -2533,13 +2540,6 @@
"reference": "",
"comment": ""
},
{
"term": "Binds Include Missing",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Binds include added",
"translation": "",
@@ -2673,6 +2673,13 @@
"reference": "",
"comment": ""
},
{
"term": "Blurred surfaces show the wallpaper instead of the content beneath",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Body",
"translation": "",
@@ -2869,6 +2876,13 @@
"reference": "",
"comment": ""
},
{
"term": "Browse and set wallpapers",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Browse or search plugins",
"translation": "",
@@ -3366,6 +3380,13 @@
"reference": "",
"comment": ""
},
{
"term": "Choose wallpaper folder",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Choose where notification popups appear on screen",
"translation": "",
@@ -3492,13 +3513,6 @@
"reference": "",
"comment": ""
},
{
"term": "Click 'Setup' to create %1 and add include to config.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Click 'Setup' to create %1 and add include to your compositor config.",
"translation": "",
@@ -3506,13 +3520,6 @@
"reference": "",
"comment": ""
},
{
"term": "Click 'Setup' to create cursor config and add include to your compositor config.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Click 'Setup' to create the outputs config and add include to your compositor config.",
"translation": "",
@@ -3646,6 +3653,13 @@
"reference": "",
"comment": ""
},
{
"term": "Clock, calendar, system info and profile",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Close",
"translation": "",
@@ -3745,7 +3759,7 @@
"comment": ""
},
{
"term": "Color shown for areas not covered by wallpaper (e.g. Fit or Pad modes)",
"term": "Color shown for areas not covered by wallpaper",
"translation": "",
"context": "",
"reference": "",
@@ -4298,7 +4312,7 @@
"comment": ""
},
{
"term": "Controls outlines around blurred foreground cards, pills, and notification cards",
"term": "Controls outlines around foreground cards, pills, and notification cards",
"translation": "",
"context": "",
"reference": "",
@@ -4724,20 +4738,6 @@
"reference": "",
"comment": ""
},
{
"term": "Cursor Config Not Configured",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Cursor Include Missing",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Cursor Size",
"translation": "",
@@ -5060,6 +5060,13 @@
"reference": "",
"comment": ""
},
{
"term": "Dank Dash",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "DankBar",
"translation": "",
@@ -6019,6 +6026,13 @@
"reference": "",
"comment": ""
},
{
"term": "Drag a widget by its handle here to reorder it or drop it into another group",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Drag to Reorder",
"translation": "",
@@ -6026,6 +6040,13 @@
"reference": "",
"comment": ""
},
{
"term": "Drag to reorder or click to hide tabs. Use ↑/↓ to highlight a tab and Ctrl+↑/↓ to move it.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Drag widgets to reorder within sections. Use the eye icon to hide/show widgets (maintains spacing), or X to remove them completely.",
"translation": "",
@@ -6061,6 +6082,13 @@
"reference": "",
"comment": ""
},
{
"term": "Drop here",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Drop your override for %1 so the DMS default action re-applies?",
"translation": "",
@@ -6159,6 +6187,13 @@
"reference": "",
"comment": ""
},
{
"term": "Edge Hover Reveal",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Edge Spacing",
"translation": "",
@@ -6754,6 +6789,13 @@
"reference": "",
"comment": ""
},
{
"term": "Excluded Media Players",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Exclusive Zone Offset",
"translation": "",
@@ -7090,13 +7132,6 @@
"reference": "",
"comment": ""
},
{
"term": "Failed to enable plugin: %1",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Failed to fetch network QR code: %1",
"translation": "",
@@ -7713,20 +7748,6 @@
"reference": "",
"comment": ""
},
{
"term": "Fix Now",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Fixing...",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Flags",
"translation": "",
@@ -7867,6 +7888,13 @@
"reference": "",
"comment": ""
},
{
"term": "Focused Display",
"translation": "",
"context": "workspace appearance tab",
"reference": "",
"comment": ""
},
{
"term": "Focused Monitor Only",
"translation": "",
@@ -8077,6 +8105,13 @@
"reference": "",
"comment": ""
},
{
"term": "Forecast and conditions",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Foreground Layers",
"translation": "",
@@ -8791,6 +8826,13 @@
"reference": "",
"comment": ""
},
{
"term": "Hidden until weather is enabled",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Hide",
"translation": "",
@@ -9057,6 +9099,13 @@
"reference": "",
"comment": ""
},
{
"term": "Hover Popouts",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "How often the server polls for new updates.",
"translation": "",
@@ -9736,6 +9785,20 @@
"reference": "",
"comment": ""
},
{
"term": "Jump to page",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Jump to page (1 - %1)",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Keep Awake",
"translation": "",
@@ -11647,6 +11710,13 @@
"reference": "",
"comment": ""
},
{
"term": "Next page",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Night",
"translation": "",
@@ -12018,6 +12088,13 @@
"reference": "",
"comment": ""
},
{
"term": "No excluded players configured",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "No features enabled",
"translation": "",
@@ -12270,6 +12347,13 @@
"reference": "",
"comment": ""
},
{
"term": "No screenshot provided",
"translation": "",
"context": "plugin browser no screenshot",
"reference": "",
"comment": ""
},
{
"term": "No session selected",
"translation": "",
@@ -12648,6 +12732,13 @@
"reference": "",
"comment": ""
},
{
"term": "Now playing and media controls",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Numbers",
"translation": "",
@@ -12837,6 +12928,13 @@
"reference": "",
"comment": ""
},
{
"term": "Open Delay",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Open Dir",
"translation": "",
@@ -12928,6 +13026,20 @@
"reference": "",
"comment": ""
},
{
"term": "Open the launcher by hovering the emerge edge (when free of bar and dock)",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Open widget popouts by hovering over the bar. Moving to another widget switches the popout.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Open with...",
"translation": "",
@@ -13075,13 +13187,6 @@
"reference": "",
"comment": ""
},
{
"term": "Outputs Include Missing",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Overcast",
"translation": "",
@@ -13782,6 +13887,13 @@
"reference": "",
"comment": ""
},
{
"term": "Plugin dependency missing",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Plugin disabled: %1",
"translation": "",
@@ -14146,6 +14258,13 @@
"reference": "",
"comment": ""
},
{
"term": "Prevent specific applications from displaying in the media controllers (e.g., browser audio streams, background tools). Matches player identity or desktop file name case-insensitively.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Preview",
"translation": "",
@@ -14167,6 +14286,13 @@
"reference": "",
"comment": ""
},
{
"term": "Previous page",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Primary",
"translation": "",
@@ -14671,6 +14797,13 @@
"reference": "",
"comment": ""
},
{
"term": "Related: %1",
"translation": "",
"context": "related plugins",
"reference": "",
"comment": ""
},
{
"term": "Release",
"translation": "",
@@ -14881,6 +15014,13 @@
"reference": "",
"comment": ""
},
{
"term": "Reorder & Group",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Repeat",
"translation": "",
@@ -15553,10 +15693,17 @@
"reference": "",
"comment": ""
},
{
"term": "Screenshot unavailable",
"translation": "",
"context": "plugin browser screenshot error",
"reference": "",
"comment": ""
},
{
"term": "Scroll",
"translation": "",
"context": "",
"context": "wallpaper fill mode",
"reference": "",
"comment": ""
},
@@ -16071,6 +16218,13 @@
"reference": "",
"comment": ""
},
{
"term": "Separate Appearance for Unfocused Display(s)",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Separate Light & Dark Themes",
"translation": "",
@@ -16078,6 +16232,13 @@
"reference": "",
"comment": ""
},
{
"term": "Separate appearance for unfocused displays is not supported on this compositor.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Separator",
"translation": "",
@@ -16190,6 +16351,13 @@
"reference": "",
"comment": ""
},
{
"term": "Setting up...",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Settings",
"translation": "",
@@ -16337,6 +16505,13 @@
"reference": "",
"comment": ""
},
{
"term": "Shortcut that opens this settings window",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Shortcuts",
"translation": "",
@@ -16884,7 +17059,7 @@
"comment": ""
},
{
"term": "Show foreground surfaces on blurred panels for stronger contrast",
"term": "Show foreground surfaces on panels for stronger contrast",
"translation": "",
"context": "",
"reference": "",
@@ -17289,6 +17464,13 @@
"reference": "",
"comment": ""
},
{
"term": "Sort wallpapers",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Sorting & Layout",
"translation": "",
@@ -18073,6 +18255,13 @@
"reference": "",
"comment": ""
},
{
"term": "The 'boregard' tool is not installed or not on your PATH.\n\nInstall it from https://danklinux.com, then re-enable this plugin.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "The 'dgop' tool is required for system monitoring.\nPlease install dgop to use this feature.",
"translation": "",
@@ -18227,6 +18416,13 @@
"reference": "",
"comment": ""
},
{
"term": "This install is still using hyprland.conf. Run dms setup to migrate before editing layout settings.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "This install is still using hyprland.conf. Run dms setup to migrate before editing shortcuts in Settings.",
"translation": "",
@@ -18381,6 +18577,13 @@
"reference": "",
"comment": ""
},
{
"term": "Time to rest on a widget before its popout opens",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Time to wait before hiding after the pointer leaves",
"translation": "",
@@ -18892,6 +19095,13 @@
"reference": "",
"comment": ""
},
{
"term": "Unfocused Display(s)",
"translation": "",
"context": "workspace appearance tab",
"reference": "",
"comment": ""
},
{
"term": "Ungrouped",
"translation": "",
@@ -19382,6 +19592,13 @@
"reference": "",
"comment": ""
},
{
"term": "Use different workspace colors on displays that are not focused",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Use fingerprint authentication for the lock screen.",
"translation": "",
@@ -20271,20 +20488,6 @@
"reference": "",
"comment": ""
},
{
"term": "Window Rules Include Missing",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Window Rules Not Configured",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Wipe",
"translation": "",
@@ -20404,6 +20607,13 @@
"reference": "",
"comment": ""
},
{
"term": "Xray Blur Effect",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Xray blurs only the wallpaper (efficient) and is the default when Blur is on. Set Xray to Off for regular full blur of everything beneath the window (more expensive).",
"translation": "",
@@ -20411,6 +20621,13 @@
"reference": "",
"comment": ""
},
{
"term": "Xray options are in Compositor → Layout",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Y",
"translation": "",
@@ -20530,6 +20747,13 @@
"reference": "",
"comment": ""
},
{
"term": "boregard is required",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "brandon",
"translation": "",
@@ -20607,20 +20831,6 @@
"reference": "",
"comment": ""
},
{
"term": "dms/cursor config exists but is not included. Cursor settings won't apply.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "dms/outputs config exists but is not included in your compositor config. Display changes won't persist.",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "e.g. /usr/bin/my-script --flag",
"translation": "",
@@ -20943,6 +21153,13 @@
"reference": "",
"comment": ""
},
{
"term": "reviewed",
"translation": "",
"context": "plugin status",
"reference": "",
"comment": ""
},
{
"term": "seconds",
"translation": "",
@@ -21027,13 +21244,6 @@
"reference": "",
"comment": ""
},
{
"term": "verified",
"translation": "",
"context": "plugin status",
"reference": "",
"comment": ""
},
{
"term": "wtype not available - install wtype for paste support",
"translation": "",