Skip to main content
Version: 1.6

Wayland Layer Shell & Layer Rules

Configuring blur for Wayland layer shells can be tricky since each compositor handles it differently.

Overview​

DMS uses Wayland's layer shell protocol for all UI components: the bar, popups, modals, OSDs, and notifications. Each component type gets its own namespace, allowing your compositor to target them individually for blur effects.

Layer shell surfaces differ from regular windows—they're UI overlays positioned at specific layers (background, bottom, top, overlay). By assigning unique namespaces to each component type, you can apply blur selectively (e.g., "blur all modals" or "blur all popouts") without affecting other elements.

Component Namespaces​

Every component namespace starts with dms: followed by the rest of the namespace, DMS uses the following namespaces for layer shell components:

Modals​

Full-screen modal dialogs including settings, power menu, and clipboard history. These overlay the entire screen and optionally dim the background.

ComponentNamespace
Clipboard historydms:clipboard
File browserdms:file-browser
Settingsdms:settings
Launcherdms:spotlight
Bluetooth pairingdms:bluetooth-pairing
Color pickerdms:color-picker
Hyprkeybindsdms:hyprkeybinds
Network infodms:network-info
Network info (wired)dms:network-info-wired
Notificationdms:notification-center-modal
Polkitdms:polkit
Power menudms:power-menu
Process listdms:process-list-modal
Wifi passworddms:wifi-password
Confirm modaldms:confirm-modal
Fallback namespacedms:modal

Popouts​

Popup panels triggered by bar widgets, such as the control center, app drawer, and notification center. These are anchored to the bar and slide out accordingly.

ComponentNamespace
App drawerdms:app-launcher
Control centerdms:control-center
Batterydms:battery
Vpndms:vpn
DankDashdms:dash
Notification centerdms:notification-center-popout
Process listdms:process-list-popout
Fallback namespacedms:popout
Plugindms:plugins:<namespace>
Fallback plugin namespacedms:plugins:plugin

Desktop widgets​

Desktop widget (both builtins and plugins) and other layers related to desktop widgets.

ComponentNamespace
Desktop widgetdms:desktop-widget:<plugin id>
Previewdms:desktop-widget-preview
Griddms:desktop-widget-grid
Helperdms:desktop-widget-helper

Misc Components​

Namespaces for other component that aren't modals or popouts.

ComponentNamespaceUse
DankBardms:barThe main panel, which can be positioned at the top, bottom, left, or right edge of the screen.
Dockdms:dockApplication dock (optional component).
Workspace overviewdms:workspace-overviewThe workspace overview for hyprland.
Notification popupdms:notification-popupToast notifications displayed when applications request user attention.
OSDdms:osdOn-screen displays for volume and brightness indicators. These appear briefly to show status information and fade out automatically.
Slideoutdms:slideoutSliding panels from screen edges (optional component).
Tooltipdms:tooltipTooltip shown for example when hovering an app on the dock.
Dock context menudock-context-menuContext menu when right clicking an app on the dock.
Toastdms:toastToast appearing on top middle of the screen.
Tray menu windowdms:tray-menu-windowMenu appearing when right clicking an applet in the system tray.

Tip: If you are unsure about a component's namespace, you can check it using your compositor's tools:

  • Hyprland: Run hyprctl layers with the layer opened
  • Niri: Run niri msg layers to list active layer surfaces

If you're a plugin dev, see the plugin development page to add your layer namespace.

Floating Windows​

DMS application windows — Settings, Notepad, Polkit, Process List, the greeter, and the app/widget browsers — are regular XDG toplevel windows, not layer-shell surfaces. They share app ID com.danklinux.dms, so compositor window rules (not layer rules) apply to them.

  • Floating vs. tiled: Theme & Colors → Floating Windows → Open Windows Floating manages a compositor window rule that opens DMS windows floating (niri, Hyprland, MangoWC). The rule lives in a managed fragment (~/.config/niri/dms/windowrules.kdl, ~/.config/hypr/dms/windowrules.lua, ~/.config/mango/dms/windowrules.conf); if the fragment isn't included in your compositor config yet, a First Time Setup banner on the same page adds it when you click Setup.
  • Transparency & blur: floating windows have their own Window Opacity and foreground controls under Theme & Colors → Floating Windows, independent of layer surfaces (which use Surface Styling). Enable Sync with Global Settings to have floating windows follow Surface Styling.
  • niri xray: the background-effect xray behavior of DMS windows follows Settings → Compositor → Layout → Xray Blur Effect and is managed in dms/layout.kdl — a hand-written background-effect block for DMS in your main niri config is redundant and can be removed.

Compositor Examples​

Each compositor has its own syntax for layer rules.

Hyprland​

info

In order for some layer rules (such as animation, blur and dimaround), you will have to disable the shell's animations and dim effect.

  • You can disable animations in Settings>Personalization>Animation Speed and set to None.
  • You can disable the dim in Settings>Launcher and untoggle Darken Modal Background.

Blur Settings​

hl.config({
decoration = {
blur = {
enabled = true,
size = 10,
passes = 4,
ignore_opacity = true,
new_optimizations = true,
xray = false,
noise = 0.02,
contrast = 1.1,
vibrancy = 0.2,
vibrancy_darkness = 0.3
},
shadow = {
enabled = true,
range = 20,
render_power = 3,
color = "rgba(00000099)"
},
},
})

Layer Rules​

Add these layer rules to enable blur for DMS components:

hl.layer_rule({
match = { namespace = "dms:control-center" },
animation = "slide right"
})

hl.layer_rule({
match= { namespace = "dms:workspace-overview" },
animation = "slide top"
})
-- You can find all available animations here: https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/#animation-tree

-- Blur
-- You can use match.namespace with regex to target multiple layers
hl.layer_rule({
match = { namespace = "dms:(color-picker|clipboard|spotlight|settings)" },
blur = true,
ignore_alpha = 0
})

-- Dim (if you prefer a dim instead of a blur effect)
hl.layer_rule({
match = { namespace = "dms:(color-picker|clipboard|spotlight|settings)" },
dim_around = true
})

Examples​

Examples
Add a blur effect on the shell's Components​

Lower the shell's components' opacity in Theme & Colors>Surface Styling (Surface Opacity).

-- Modals
hl.layer_rule({
match = { namespace = "dms:(polkit|notification-center-modal|workspace-overview|color-picker|clipboard|spotlight|settings|process-list-modal)" },
blur = true,
ignore_alpha = 0
})

-- Shell components (bar, popouts, etc.)
hl.layer_rule({
match = { namespace = "dms:(bar|tooltip|toast|dock-context-menu|tray-menu-window|control-center|notification-center-popout|dash|system-update|process-list-popout|battery|popout|app-launcher)" },
blur = true,
ignore_alpha = 0
})

Performance Tuning​

If blur is impacting system performance, try these optimizations in order:

  1. Reduce passes: Set passes = 2 instead of 4
  2. Reduce size: Set size = 6 instead of 10
  3. Use xray mode: Set xray = true to reduce blur on stacked layers

You can test blur impact in real-time:

hyprctl keyword decoration:blur:enabled false
# Test performance
hyprctl keyword decoration:blur:enabled true

You can find more about Hyprland's layer rules here.

Niri​

Niri uses a different configuration format with layer-rule blocks. Each rule can match namespaces using regex patterns.

Layer Rules​

// Block out sensitive components from screencasts
layer-rule {
match namespace="^dms:clipboard$"

block-out-from "screencast"
}

// Match all DMS layers with a regex
layer-rule {
match namespace=r#"^dms:.*"#

// Apply rules to all DMS components
}

Shadow Settings​

layer-rule {
match namespace="^dms:bar$"
match namespace="^dms:dock$"

shadow {
on
// off
softness 40
spread 5
offset x=0 y=5
draw-behind-window true
color "#00000064"
// inactive-color "#00000064"
}
}

You can find more about Niri's layer rules here.

Other Compositors​

Not all compositors support blur or layer rules. Check your compositor's documentation for available options.

DMS is compositor-agnostic—it only sets namespaces and lets the compositor handle the effects. Once you determine the appropriate layer rule syntax for your compositor, you can target the same namespaces listed above.