// 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 } // Open dms windows as floating by default window-rule { match app-id=r#"org.quickshell$"# open-floating true } debug { honor-xdg-activation-with-invalid-serial } // Override to disable super+tab recent-windows { binds { Alt+Tab { next-window scope="output"; } Alt+Shift+Tab { previous-window scope="output"; } Alt+grave { next-window filter="app-id"; } Alt+Shift+grave { previous-window filter="app-id"; } } } // Include dms files include "dms/colors.kdl" include "dms/layout.kdl" include "dms/alttab.kdl" include "dms/binds.kdl"