// This config is in the KDL format: https://kdl.dev // "/-" comments out the following node. // Check the wiki for a full description of the configuration: // https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction config-notification { disable-failed } gestures { hot-corners { off } } // Input device configuration. // Find the full list of options on the wiki: // https://github.com/YaLTeR/niri/wiki/Configuration:-Input input { keyboard { xkb { } numlock } touchpad { } mouse { } trackpoint { } } // You can configure outputs by their name, which you can find // by running `niri msg outputs` while inside a niri instance. // The built-in laptop monitor is usually called "eDP-1". // Find more information on the wiki: // https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs // Remember to uncomment the node by removing "/-"! /-output "eDP-2" { mode "2560x1600@239.998993" position x=2560 y=0 variable-refresh-rate } // Settings that influence how windows are positioned and sized. // Find more information on the wiki: // https://github.com/YaLTeR/niri/wiki/Configuration:-Layout layout { // Set gaps around windows in logical pixels. gaps 5 background-color "transparent" // When to center a column when changing focus, options are: // - "never", default behavior, focusing an off-screen column will keep at the left // or right edge of the screen. // - "always", the focused column will always be centered. // - "on-overflow", focusing a column will center it if it doesn't fit // together with the previously focused column. center-focused-column "never" // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. preset-column-widths { // Proportion sets the width as a fraction of the output width, taking gaps into account. // For example, you can perfectly fit four windows sized "proportion 0.25" on an output. // The default preset widths are 1/3, 1/2 and 2/3 of the output. proportion 0.33333 proportion 0.5 proportion 0.66667 // Fixed sets the width in logical pixels exactly. // fixed 1920 } // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between. // preset-window-heights { } // You can change the default width of the new windows. default-column-width { proportion 0.5; } // If you leave the brackets empty, the windows themselves will decide their initial width. // default-column-width {} // By default focus ring and border are rendered as a solid background rectangle // behind windows. That is, they will show up through semitransparent windows. // This is because windows using client-side decorations can have an arbitrary shape. // // If you don't like that, you should uncomment `prefer-no-csd` below. // Niri will draw focus ring and border *around* windows that agree to omit their // client-side decorations. // // Alternatively, you can override it with a window rule called // `draw-border-with-background`. border { off width 4 active-color "#707070" // Neutral gray inactive-color "#d0d0d0" // Light gray urgent-color "#cc4444" // Softer red } focus-ring { width 2 active-color "#808080" // Medium gray inactive-color "#505050" // Dark gray } shadow { softness 30 spread 5 offset x=0 y=5 color "#0007" } struts { } } layer-rule { match namespace="^quickshell$" place-within-backdrop true } overview { workspace-shadow { off } } // Add lines like this to spawn processes at startup. // Note that running niri as a session supports xdg-desktop-autostart, // which may be more convenient to use. // See the binds section below for more spawn examples. // This line starts waybar, a commonly used bar for Wayland compositors. spawn-at-startup "bash" "-c" "wl-paste --watch cliphist store &" spawn-at-startup "dms" "run" spawn-at-startup "{{POLKIT_AGENT_PATH}}" environment { XDG_CURRENT_DESKTOP "niri" QT_QPA_PLATFORM "wayland" ELECTRON_OZONE_PLATFORM_HINT "auto" QT_QPA_PLATFORMTHEME "gtk3" QT_QPA_PLATFORMTHEME_QT6 "gtk3" TERMINAL "{{TERMINAL_COMMAND}}" } hotkey-overlay { skip-at-startup } prefer-no-csd screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" animations { workspace-switch { spring damping-ratio=0.80 stiffness=523 epsilon=0.0001 } window-open { duration-ms 150 curve "ease-out-expo" } window-close { duration-ms 150 curve "ease-out-quad" } horizontal-view-movement { spring damping-ratio=0.85 stiffness=423 epsilon=0.0001 } window-movement { spring damping-ratio=0.75 stiffness=323 epsilon=0.0001 } window-resize { spring damping-ratio=0.85 stiffness=423 epsilon=0.0001 } config-notification-open-close { spring damping-ratio=0.65 stiffness=923 epsilon=0.001 } screenshot-ui-open { duration-ms 200 curve "ease-out-quad" } overview-open-close { spring damping-ratio=0.85 stiffness=800 epsilon=0.0001 } } // Window rules let you adjust behavior for individual windows. // Find more information on the wiki: // https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules // Work around WezTerm's initial configure bug // by setting an empty default-column-width. window-rule { // This regular expression is intentionally made as specific as possible, // since this is the default config, and we want no false positives. // You can get away with just app-id="wezterm" if you want. match app-id=r#"^org\.wezfurlong\.wezterm$"# default-column-width {} } window-rule { match app-id=r#"^org\.gnome\."# draw-border-with-background false geometry-corner-radius 12 clip-to-geometry true } window-rule { match app-id=r#"^gnome-control-center$"# match app-id=r#"^pavucontrol$"# match app-id=r#"^nm-connection-editor$"# default-column-width { proportion 0.5; } open-floating false } window-rule { match app-id=r#"^gnome-calculator$"# match app-id=r#"^galculator$"# match app-id=r#"^blueman-manager$"# match app-id=r#"^org\.gnome\.Nautilus$"# match app-id=r#"^steam$"# match app-id=r#"^xdg-desktop-portal$"# open-floating true } window-rule { match app-id=r#"^org\.wezfurlong\.wezterm$"# match app-id="Alacritty" match app-id="zen" match app-id="com.mitchellh.ghostty" match app-id="kitty" draw-border-with-background false } window-rule { match is-active=false opacity 0.9 } window-rule { match app-id=r#"firefox$"# title="^Picture-in-Picture$" match app-id="zoom" open-floating true } window-rule { geometry-corner-radius 12 clip-to-geometry true } // Open dms windows as floating by default window-rule { match app-id=r#"org.quickshell$"# open-floating true } binds { // === System & Overview === Mod+D { spawn "niri" "msg" "action" "toggle-overview"; } Mod+Tab repeat=false { toggle-overview; } Mod+Shift+Slash { show-hotkey-overlay; } // === Application Launchers === Mod+T hotkey-overlay-title="Open Terminal" { spawn "{{TERMINAL_COMMAND}}"; } Mod+Space hotkey-overlay-title="Application Launcher" { spawn "dms" "ipc" "call" "spotlight" "toggle"; } Mod+V hotkey-overlay-title="Clipboard Manager" { spawn "dms" "ipc" "call" "clipboard" "toggle"; } Mod+M hotkey-overlay-title="Task Manager" { spawn "dms" "ipc" "call" "processlist" "focusOrToggle"; } Mod+Comma hotkey-overlay-title="Settings" { spawn "dms" "ipc" "call" "settings" "focusOrToggle"; } Mod+Y hotkey-overlay-title="Browse Wallpapers" { spawn "dms" "ipc" "call" "dankdash" "wallpaper"; } Mod+N hotkey-overlay-title="Notification Center" { spawn "dms" "ipc" "call" "notifications" "toggle"; } Mod+Shift+N hotkey-overlay-title="Notepad" { spawn "dms" "ipc" "call" "notepad" "toggle"; } // === Security === Mod+Alt+L hotkey-overlay-title="Lock Screen" { spawn "dms" "ipc" "call" "lock" "lock"; } Mod+Shift+E { quit; } Ctrl+Alt+Delete hotkey-overlay-title="Task Manager" { spawn "dms" "ipc" "call" "processlist" "focusOrToggle"; } // === Audio Controls === XF86AudioRaiseVolume allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "increment" "3"; } XF86AudioLowerVolume allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "decrement" "3"; } XF86AudioMute allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "mute"; } XF86AudioMicMute allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "micmute"; } // === Brightness Controls === XF86MonBrightnessUp allow-when-locked=true { spawn "dms" "ipc" "call" "brightness" "increment" "5" ""; } XF86MonBrightnessDown allow-when-locked=true { spawn "dms" "ipc" "call" "brightness" "decrement" "5" ""; } // === Window Management === Mod+Q repeat=false { close-window; } Mod+F { maximize-column; } Mod+Shift+F { fullscreen-window; } Mod+Shift+T { toggle-window-floating; } Mod+Shift+V { switch-focus-between-floating-and-tiling; } Mod+W { toggle-column-tabbed-display; } // === Focus Navigation === Mod+Left { focus-column-left; } Mod+Down { focus-window-down; } Mod+Up { focus-window-up; } Mod+Right { focus-column-right; } Mod+H { focus-column-left; } Mod+J { focus-window-down; } Mod+K { focus-window-up; } Mod+L { focus-column-right; } // === Window Movement === Mod+Shift+Left { move-column-left; } Mod+Shift+Down { move-window-down; } Mod+Shift+Up { move-window-up; } Mod+Shift+Right { move-column-right; } Mod+Shift+H { move-column-left; } Mod+Shift+J { move-window-down; } Mod+Shift+K { move-window-up; } Mod+Shift+L { move-column-right; } // === Column Navigation === Mod+Home { focus-column-first; } Mod+End { focus-column-last; } Mod+Ctrl+Home { move-column-to-first; } Mod+Ctrl+End { move-column-to-last; } // === Monitor Navigation === Mod+Ctrl+Left { focus-monitor-left; } //Mod+Ctrl+Down { focus-monitor-down; } //Mod+Ctrl+Up { focus-monitor-up; } Mod+Ctrl+Right { focus-monitor-right; } Mod+Ctrl+H { focus-monitor-left; } Mod+Ctrl+J { focus-monitor-down; } Mod+Ctrl+K { focus-monitor-up; } Mod+Ctrl+L { focus-monitor-right; } // === Move to Monitor === Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } Mod+Shift+Ctrl+H { move-column-to-monitor-left; } Mod+Shift+Ctrl+J { move-column-to-monitor-down; } Mod+Shift+Ctrl+K { move-column-to-monitor-up; } Mod+Shift+Ctrl+L { move-column-to-monitor-right; } // === Workspace Navigation === Mod+Page_Down { focus-workspace-down; } Mod+Page_Up { focus-workspace-up; } Mod+U { focus-workspace-down; } Mod+I { focus-workspace-up; } Mod+Ctrl+Down { move-column-to-workspace-down; } Mod+Ctrl+Up { move-column-to-workspace-up; } Mod+Ctrl+U { move-column-to-workspace-down; } Mod+Ctrl+I { move-column-to-workspace-up; } // === Move Workspaces === Mod+Shift+Page_Down { move-workspace-down; } Mod+Shift+Page_Up { move-workspace-up; } Mod+Shift+U { move-workspace-down; } Mod+Shift+I { move-workspace-up; } // === Mouse Wheel Navigation === Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } Mod+WheelScrollRight { focus-column-right; } Mod+WheelScrollLeft { focus-column-left; } Mod+Ctrl+WheelScrollRight { move-column-right; } Mod+Ctrl+WheelScrollLeft { move-column-left; } Mod+Shift+WheelScrollDown { focus-column-right; } Mod+Shift+WheelScrollUp { focus-column-left; } Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } // === Numbered Workspaces === Mod+1 { focus-workspace 1; } Mod+2 { focus-workspace 2; } Mod+3 { focus-workspace 3; } Mod+4 { focus-workspace 4; } Mod+5 { focus-workspace 5; } Mod+6 { focus-workspace 6; } Mod+7 { focus-workspace 7; } Mod+8 { focus-workspace 8; } Mod+9 { focus-workspace 9; } // === Move to Numbered Workspaces === Mod+Shift+1 { move-column-to-workspace 1; } Mod+Shift+2 { move-column-to-workspace 2; } Mod+Shift+3 { move-column-to-workspace 3; } Mod+Shift+4 { move-column-to-workspace 4; } Mod+Shift+5 { move-column-to-workspace 5; } Mod+Shift+6 { move-column-to-workspace 6; } Mod+Shift+7 { move-column-to-workspace 7; } Mod+Shift+8 { move-column-to-workspace 8; } Mod+Shift+9 { move-column-to-workspace 9; } // === Column Management === Mod+BracketLeft { consume-or-expel-window-left; } Mod+BracketRight { consume-or-expel-window-right; } Mod+Period { expel-window-from-column; } // === Sizing & Layout === Mod+R { switch-preset-column-width; } Mod+Shift+R { switch-preset-window-height; } Mod+Ctrl+R { reset-window-height; } Mod+Ctrl+F { expand-column-to-available-width; } Mod+C { center-column; } Mod+Ctrl+C { center-visible-columns; } // === Manual Sizing === Mod+Minus { set-column-width "-10%"; } Mod+Equal { set-column-width "+10%"; } Mod+Shift+Minus { set-window-height "-10%"; } Mod+Shift+Equal { set-window-height "+10%"; } // === Screenshots === XF86Launch1 { screenshot; } Ctrl+XF86Launch1 { screenshot-screen; } Alt+XF86Launch1 { screenshot-window; } Print { screenshot; } Ctrl+Print { screenshot-screen; } Alt+Print { screenshot-window; } // === System Controls === Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } Mod+Shift+P { power-off-monitors; } } debug { honor-xdg-activation-with-invalid-serial }