From b5dacf6d1931d3ed5eef5311a47fcd8b7b54ef7b Mon Sep 17 00:00:00 2001 From: etwas Date: Fri, 14 Nov 2025 21:51:17 +0100 Subject: [PATCH] feat(wm): configure niri --- home/wm/src/niriconf.kdl | 142 ++++++++++++++++++++------------------- 1 file changed, 74 insertions(+), 68 deletions(-) diff --git a/home/wm/src/niriconf.kdl b/home/wm/src/niriconf.kdl index 8368c36..627ec96 100644 --- a/home/wm/src/niriconf.kdl +++ b/home/wm/src/niriconf.kdl @@ -1,11 +1,11 @@ // 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 +// https://yalter.github.io/niri/Configuration:-Introduction // Input device configuration. // Find the full list of options on the wiki: -// https://github.com/YaLTeR/niri/wiki/Configuration:-Input +// https://yalter.github.io/niri/Configuration:-Input input { keyboard { xkb { @@ -15,6 +15,10 @@ input { // For example: // layout "us,ru" // options "grp:win_space_toggle,compose:ralt,ctrl:nocaps" + + // If this section is empty, niri will fetch xkb settings + // from org.freedesktop.locale1. You can control these using + // localectl set-x11-keymap. layout "de" variant "neo_qwertz" } @@ -31,11 +35,11 @@ input { tap // dwt // dwtp - drag true + // drag false // drag-lock natural-scroll - accel-speed 0.3 scroll-factor 0.8 + accel-speed 0.2 // accel-profile "flat" // scroll-method "two-finger" // disabled-on-external-mouse @@ -45,7 +49,6 @@ input { // off // natural-scroll // accel-speed 0.2 - accel-speed 0.3 // accel-profile "flat" // scroll-method "no-scroll" } @@ -66,16 +69,16 @@ input { // Focus windows and outputs automatically when moving the mouse into them. // Setting max-scroll-amount="0%" makes it work only on windows already fully on screen. - // focus-follows-mouse max-scroll-amount="0%" + focus-follows-mouse max-scroll-amount="50%" } // 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 +// https://yalter.github.io/niri/Configuration:-Outputs // Remember to uncomment the node by removing "/-"! -/-output "eDP-1" { +output "eDP-1" { // Uncomment this line to disable this output. // off @@ -85,10 +88,10 @@ input { // for the resolution. // If the mode is omitted altogether or is invalid, niri will pick one automatically. // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes. - mode "1920x1080@120.030" + mode "2880x1920@120" // You can use integer or fractional scale, for example use 1.5 for 150% scale. - scale 2 + scale 1.5 // Transform allows to rotate the output counter-clockwise, valid values are: // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270. @@ -103,15 +106,15 @@ input { // so to put another output directly adjacent to it on the right, set its x to 1920. // If the position is unset or results in an overlap, the output is instead placed // automatically. - position x=1280 y=0 + // position x=1280 y=0 } // Settings that influence how windows are positioned and sized. // Find more information on the wiki: -// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout +// https://yalter.github.io/niri/Configuration:-Layout layout { // Set gaps around windows in logical pixels. - gaps 16 + gaps 3 // When to center a column when changing focus, options are: // - "never", default behavior, focusing an off-screen column will keep at the left @@ -126,7 +129,6 @@ layout { // 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 @@ -159,7 +161,7 @@ layout { // off // How many logical pixels the ring extends out from the windows. - width 4 + width 1 // Colors can be set in a variety of ways: // - CSS named colors: "red" @@ -167,13 +169,13 @@ layout { // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others. // Color of the ring on the active monitor. - active-color "#7fc8ff" + // active-color "rgba(33ccffee)" // Color of the ring on inactive monitors. // // The focus ring only draws around the active window, so the only place // where you can see its inactive-color is on other monitors. - inactive-color "#505050" + inactive-color "#595959aa" // You can also use gradients. They take precedence over solid colors. // Gradients are rendered the same as CSS linear-gradient(angle, from, to). @@ -182,7 +184,7 @@ layout { // You can use any CSS linear-gradient tool on the web to set these up. // Changing the color space is also supported, check the wiki for more info. // - // active-gradient from="#80c8ff" to="#c7ff7f" angle=45 + active-gradient from="#33ccffee" to="#00ff99ee" angle=45 // You can also color the gradient relative to the entire view // of the workspace, rather than relative to just the window itself. @@ -268,10 +270,18 @@ layout { // See the binds section below for more spawn examples. // This line starts waybar, a commonly used bar for Wayland compositors. -spawn-at-startup "waybar" +// spawn-at-startup "waybar" - should spawn automatically spawn-at-startup "nm-applet &" spawn-at-startup "wl-paste --watch cliphist -max-items 50 store" +// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup: +// spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell" + +hotkey-overlay { + // Uncomment this line to disable the "Important Hotkeys" pop-up at startup. + // skip-at-startup +} + // Uncomment this line to ask the clients to omit their client-side decorations if possible. // If the client will specifically ask for CSD, the request will be honored. // Additionally, clients will be informed that they are tiled, removing some client-side rounded corners. @@ -282,14 +292,14 @@ spawn-at-startup "wl-paste --watch cliphist -max-items 50 store" // You can change the path where screenshots are saved. // A ~ at the front will be expanded to the home directory. // The path is formatted with strftime(3) to give you the screenshot date and time. -screenshot-path "~/Pictures/screenshots/%Y-%m-%d %H-%M-%S_niri.png" +screenshot-path "~/Pictures/screenshots/%Y-%m-%d_%H-%M-%S.png" // You can also set this to null to disable saving screenshots to disk. // screenshot-path null // Animation settings. // The wiki explains how to configure individual animations: -// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations +// https://yalter.github.io/niri/Configuration:-Animations animations { // Uncomment to turn off all animations. // off @@ -300,7 +310,7 @@ animations { // Window rules let you adjust behavior for individual windows. // Find more information on the wiki: -// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules +// https://yalter.github.io/niri/Configuration:-Window-Rules // Work around WezTerm's initial configure bug // by setting an empty default-column-width. @@ -321,25 +331,6 @@ window-rule { open-floating true } -window-rule { - // This app-id regular expression will work for both: - // - host Firefox (app-id is "firefox") - // - Flatpak Firefox (app-id is "org.mozilla.firefox") - match app-id=r#"firefox$"# title="^Picture-in-Picture$" - open-floating true -} - - -window-rule { - match title="flameshot" - open-floating true -} - -window-rule { - match title="Welcome to ((IntelliJ IDEA)|PyCharm|RustRover|GoLand|DataGrip|(Android Studio))" - open-floating true -} - // Example: block out two password managers from screen capture. // (This example rule is commented out with a "/-" in front.) /-window-rule { @@ -376,24 +367,36 @@ binds { // Suggested binds for running programs: terminal, app launcher, screen locker. Mod+Q hotkey-overlay-title="Open a Terminal: alacritty" { spawn "alacritty"; } - Mod+D hotkey-overlay-title="Run an Application: fuzzel" { spawn "fuzzel"; } - Mod+R hotkey-overlay-title="Run an application: rofi drun" { spawn "rofi" "-drun"; } - Mod+Perid hotkey-overlay-title="Run an application: rofimoji" { spawn "rofimoji" "-a" "copy" "-s" "neutral"; } - Mod+X hotkey-overlay-title="Run an application: clipboard history" { spawn "cliphist list | rofi -dmenu | cliphist decode | wl-copy"; } - Mod+Shift+L hotkey-overlay-title="Lock the Screen: swaylock" { spawn "swaylock"; } + Mod+E hotkey-overlay-title="Open File Manager" { spawn "nautilus"; } + Super+Alt+L hotkey-overlay-title="Lock the Screen: swaylock" { spawn "swaylock"; } - // You can also use a shell. Do this if you need pipes, multiple commands, etc. - // Note: the entire command goes as a single argument in the end. - // Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; } + Mod+Space { spawn-sh "rofi -show drun"; } + Mod+Period { spawn-sh "rofimoji -a copy -s neutral"; } + Mod+X { spawn-sh "cliphist list | rofi -dmenu | cliphist decode | wl-copy"; } + + // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc. + // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`. + // For example, this is a standard bind to toggle the screen reader (orca). + Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; } // Example volume keys mappings for PipeWire & WirePlumber. // The allow-when-locked=true property makes them work even when the session is locked. - XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; } - XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; } - XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; } - XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; } + // Using spawn-sh allows to pass multiple arguments together with the command. + XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+"; } + XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; } + XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; } + XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; } + + // Example media keys mapping using playerctl. + // This will work with any MPRIS-enabled media player. + XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; } + XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; } + XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; } + XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; } // Example brightness key mappings for brightnessctl. + // You can use regular spawn with multiple arguments too (to avoid going through "sh"), + // but you need to manually put each argument in separate "" quotes. XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; } XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; } @@ -441,6 +444,7 @@ binds { Mod+Shift+H { focus-monitor-left; } Mod+Shift+J { focus-monitor-down; } Mod+Shift+K { focus-monitor-up; } + Mod+Shift+L { focus-monitor-right; } Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } @@ -506,8 +510,8 @@ binds { // These binds are also affected by touchpad's natural-scroll, so these // example binds are "inverted", since we have natural-scroll enabled for // touchpads by default. - // Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; } - // Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; } + // Mod+TouchpadScrollDown { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+"; } + // Mod+TouchpadScrollUp { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-"; } // You can refer to workspaces by index. However, keep in mind that // niri is a dynamic workspace system, so these commands are kind of @@ -526,15 +530,15 @@ binds { Mod+7 { focus-workspace 7; } Mod+8 { focus-workspace 8; } Mod+9 { focus-workspace 9; } - Mod+Ctrl+1 { move-column-to-workspace 1; } - Mod+Ctrl+2 { move-column-to-workspace 2; } - Mod+Ctrl+3 { move-column-to-workspace 3; } - Mod+Ctrl+4 { move-column-to-workspace 4; } - Mod+Ctrl+5 { move-column-to-workspace 5; } - Mod+Ctrl+6 { move-column-to-workspace 6; } - Mod+Ctrl+7 { move-column-to-workspace 7; } - Mod+Ctrl+8 { move-column-to-workspace 8; } - Mod+Ctrl+9 { move-column-to-workspace 9; } + 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; } // Alternatively, there are commands to move just a single window: // Mod+Ctrl+1 { move-window-to-workspace 1; } @@ -551,9 +555,11 @@ binds { // Consume one window from the right to the bottom of the focused column. Mod+Comma { consume-window-into-column; } // Expel the bottom window from the focused column to the right. - Mod+Period { expel-window-from-column; } + //Mod+Period { expel-window-from-column; } Mod+R { switch-preset-column-width; } + // Cycling through the presets in reverse order is also possible. + // Mod+R { switch-preset-column-width-back; } Mod+Shift+R { switch-preset-window-height; } Mod+Ctrl+R { reset-window-height; } Mod+F { maximize-column; } @@ -590,7 +596,7 @@ binds { // Toggle tabbed column display mode. // Windows in this column will appear as vertical tabs, // rather than stacked on top of each other. - Mod+W { toggle-column-tabbed-display; } + Mod+T { toggle-column-tabbed-display; } // Actions to switch layouts. // Note: if you uncomment these, make sure you do NOT have @@ -615,10 +621,10 @@ binds { Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } // The quit action will show a confirmation dialog to avoid accidental exits. - Mod+Shift+E { quit; } + Mod+Shift+M { quit; } Ctrl+Alt+Delete { quit; } // Powers off the monitors. To turn them back on, do any input like // moving the mouse or pressing any other key. Mod+Shift+P { power-off-monitors; } -} +} \ No newline at end of file