Skip to main content
Version: 1.4

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

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

Plugins

By default, plugins without namespaces will fallback to dms-plugin:plugin, if the plugin has a specific namespaces you will have to run the command above or look at the plugin's code to know it if you do by looking at the code note the it will be dms-plugin: + the namespace, for example dms-plugin:emoji-launcher).

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

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 Theme & Colors>Widget Styling and untoggle Darken Modal Background.

Blur Settings

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
}

drop_shadow = true
shadow_range = 20
shadow_render_power = 3
col.shadow = rgba(00000099)
}

Layer Rules

Add these layer rules to enable blur for DMS components:

# Animations
layerrule = animation slide right, dms:control-center
layerrule = animation slide top, dms:workspace-overview
# You can find all available animations here: https://wiki.hypr.land/Configuring/Animations/#animation-tree

# Blur
# You can use regex like so to apply a rule to multiple layer
# You can also use variables
$blur_layer = dms:(color-picker|clipboard|spotlight|settings)
layerrule = blur, $blur_layer

# Dim (if you prefer a dim instead of a blur effect)
layerrule = dimaround, $blur_layer

Examples

Examples
Add a blur effect on the shell's Components

Lower the shell's components' opacity in Theme & Colors>Widget Styling.

$blur_layer = dms:(polkit|notification-center-modal|workspace-overview|color-picker|clipboard|spotlight|settings|process-list-modal)
layerrule = blur, $blur_layer
$blur_shell = 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)
layerrule = blur, $blur_shell
layerrule = ignorezero, $blur_shell

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.