personal nixos config and packages
at main 27 kB view raw
1{ 2 writeText, 3 lib, 4 mkWrapper, 5 theme, 6 niri, 7 alacritty-wrapped, 8 chromium-wrapped, 9 noctalia-shell, 10}: 11let 12 cfg = writeText "config.kdl" '' 13 // This config is in the KDL format: https://kdl.dev 14 // "/-" comments out the following node. 15 // Check the wiki for a full description of the configuration: 16 // https://github.com/YaLTeR/niri/wiki/Configuration:-Overview 17 18 // Input device configuration. 19 // Find the full list of options on the wiki: 20 // https://github.com/YaLTeR/niri/wiki/Configuration:-Input 21 input { 22 // mod-key "Alt" 23 // mod-key-nested "Alt" 24 25 keyboard { 26 xkb { 27 // You can set rules, model, layout, variant and options. 28 // For more information, see xkeyboard-config(7). 29 30 // For example: 31 // layout "us,ru" 32 // options "grp:win_space_toggle,compose:ralt,ctrl:nocaps" 33 options "caps:escape" 34 } 35 repeat-delay 300 36 repeat-rate 32 37 } 38 39 // Next sections include libinput settings. 40 // Omitting settings disables them, or leaves them at their default values. 41 touchpad { 42 // off 43 // tap 44 // dwt 45 // dwtp 46 // drag-lock 47 natural-scroll 48 // accel-speed 0.2 49 accel-profile "adaptive" 50 scroll-method "two-finger" 51 click-method "clickfinger" 52 scroll-factor 0.3 53 // disabled-on-external-mouse 54 } 55 56 mouse { 57 // off 58 // natural-scroll 59 // accel-speed 0.2 60 // accel-profile "flat" 61 // scroll-method "no-scroll" 62 } 63 64 trackpoint { 65 // off 66 // natural-scroll 67 // accel-speed 0.2 68 // accel-profile "flat" 69 // scroll-method "on-button-down" 70 // scroll-button 273 71 // middle-emulation 72 } 73 74 // Uncomment this to make the mouse warp to the center of newly focused windows. 75 // warp-mouse-to-focus 76 77 // Focus windows and outputs automatically when moving the mouse into them. 78 // Setting max-scroll-amount="0%" makes it work only on windows already fully on screen. 79 // focus-follows-mouse max-scroll-amount="0%" 80 } 81 82 output "DP-3" { 83 mode "2560x1440@60" 84 85 scale 1.25 86 87 background-color "#${theme.colors.bg-darker}" 88 } 89 90 // You can configure outputs by their name, which you can find 91 // by running `niri msg outputs` while inside a niri instance. 92 // The built-in laptop monitor is usually called "eDP-1". 93 // Find more information on the wiki: 94 // https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs 95 // Remember to uncomment the node by removing "/-"! 96 output "eDP-1" { 97 // Uncomment this line to disable this output. 98 // off 99 100 // Resolution and, optionally, refresh rate of the output. 101 // The format is "<width>x<height>" or "<width>x<height>@<refresh rate>". 102 // If the refresh rate is omitted, niri will pick the highest refresh rate 103 // for the resolution. 104 // If the mode is omitted altogether or is invalid, niri will pick one automatically. 105 // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes. 106 mode "2256x1504@60" 107 108 // You can use integer or fractional scale, for example use 1.5 for 150% scale. 109 scale 1.5 110 111 // Transform allows to rotate the output counter-clockwise, valid values are: 112 // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270. 113 transform "normal" 114 115 background-color "#${theme.colors.bg-darker}" 116 117 // Position of the output in the global coordinate space. 118 // This affects directional monitor actions like "focus-monitor-left", and cursor movement. 119 // The cursor can only move between directly adjacent outputs. 120 // Output scale and rotation has to be taken into account for positioning: 121 // outputs are sized in logical, or scaled, pixels. 122 // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080, 123 // so to put another output directly adjacent to it on the right, set its x to 1920. 124 // If the position is unset or results in an overlap, the output is instead placed 125 // automatically. 126 // position x=1280 y=0 127 } 128 129 output "DP-3" { 130 // Uncomment this line to disable this output. 131 // off 132 133 // Resolution and, optionally, refresh rate of the output. 134 // The format is "<width>x<height>" or "<width>x<height>@<refresh rate>". 135 // If the refresh rate is omitted, niri will pick the highest refresh rate 136 // for the resolution. 137 // If the mode is omitted altogether or is invalid, niri will pick one automatically. 138 // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes. 139 mode "2560x1440@60" 140 141 // You can use integer or fractional scale, for example use 1.5 for 150% scale. 142 scale 1.25 143 144 // Transform allows to rotate the output counter-clockwise, valid values are: 145 // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270. 146 transform "normal" 147 148 background-color "#${theme.colors.bg-darker}" 149 150 // Position of the output in the global coordinate space. 151 // This affects directional monitor actions like "focus-monitor-left", and cursor movement. 152 // The cursor can only move between directly adjacent outputs. 153 // Output scale and rotation has to be taken into account for positioning: 154 // outputs are sized in logical, or scaled, pixels. 155 // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080, 156 // so to put another output directly adjacent to it on the right, set its x to 1920. 157 // If the position is unset or results in an overlap, the output is instead placed 158 // automatically. 159 // position x=1280 y=0 160 } 161 162 // Settings that influence how windows are positioned and sized. 163 // Find more information on the wiki: 164 // https://github.com/YaLTeR/niri/wiki/Configuration:-Layout 165 layout { 166 // Set gaps around windows in logical pixels. 167 gaps 4 168 169 // When to center a column when changing focus, options are: 170 // - "never", default behavior, focusing an off-screen column will keep at the left 171 // or right edge of the screen. 172 // - "always", the focused column will always be centered. 173 // - "on-overflow", focusing a column will center it if it doesn't fit 174 // together with the previously focused column. 175 center-focused-column "never" 176 177 // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. 178 preset-column-widths { 179 // Proportion sets the width as a fraction of the output width, taking gaps into account. 180 // For example, you can perfectly fit four windows sized "proportion 0.25" on an output. 181 // The default preset widths are 1/3, 1/2 and 2/3 of the output. 182 proportion 0.33333 183 proportion 0.5 184 proportion 0.66667 185 186 // Fixed sets the width in logical pixels exactly. 187 // fixed 1920 188 } 189 190 // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between. 191 // preset-window-heights { } 192 193 // You can change the default width of the new windows. 194 default-column-width { proportion 0.5; } 195 // If you leave the brackets empty, the windows themselves will decide their initial width. 196 // default-column-width {} 197 198 // By default focus ring and border are rendered as a solid background rectangle 199 // behind windows. That is, they will show up through semitransparent windows. 200 // This is because windows using client-side decorations can have an arbitrary shape. 201 // 202 // If you don't like that, you should uncomment `prefer-no-csd` below. 203 // Niri will draw focus ring and border *around* windows that agree to omit their 204 // client-side decorations. 205 // 206 // Alternatively, you can override it with a window rule called 207 // `draw-border-with-background`. 208 209 focus-ring { 210 off 211 } 212 213 // You can also add a border. It's similar to the focus ring, but always visible. 214 border { 215 width ${theme.lengths.border-width} 216 active-color "#${theme.colors.cyan}" 217 inactive-color "#${theme.colors.gray}" 218 } 219 220 default-column-display "normal" 221 222 tab-indicator { 223 width 8 224 gap 4 225 length total-proportion=1.0 226 position "top" 227 place-within-column 228 } 229 230 // You can enable drop shadows for windows. 231 shadow { 232 // Uncomment the next line to enable shadows. 233 // on 234 235 // By default, the shadow draws only around its window, and not behind it. 236 // Uncomment this setting to make the shadow draw behind its window. 237 // 238 // Note that niri has no way of knowing about the CSD window corner 239 // radius. It has to assume that windows have square corners, leading to 240 // shadow artifacts inside the CSD rounded corners. This setting fixes 241 // those artifacts. 242 // 243 // However, instead you may want to set prefer-no-csd and/or 244 // geometry-corner-radius. Then, niri will know the corner radius and 245 // draw the shadow correctly, without having to draw it behind the 246 // window. These will also remove client-side shadows if the window 247 // draws any. 248 // 249 // draw-behind-window true 250 251 // You can change how shadows look. The values below are in logical 252 // pixels and match the CSS box-shadow properties. 253 254 // Softness controls the shadow blur radius. 255 softness 30 256 257 // Spread expands the shadow. 258 spread 5 259 260 // Offset moves the shadow relative to the window. 261 offset x=0 y=5 262 263 // You can also change the shadow color and opacity. 264 color "#0007" 265 } 266 267 // Struts shrink the area occupied by windows, similarly to layer-shell panels. 268 // You can think of them as a kind of outer gaps. They are set in logical pixels. 269 // Left and right struts will cause the next window to the side to always be visible. 270 // Top and bottom struts will simply add outer gaps in addition to the area occupied by 271 // layer-shell panels and regular gaps. 272 struts { 273 // remove gaps from top bar 274 top -4 275 } 276 } 277 278 // Add lines like this to spawn processes at startup. 279 // Note that running niri as a session supports xdg-desktop-autostart, 280 // which may be more convenient to use. 281 // See the binds section below for more spawn examples. 282 // spawn-at-startup "alacritty" "-e" "bash" 283 284 // Uncomment this line to ask the clients to omit their client-side decorations if possible. 285 // If the client will specifically ask for CSD, the request will be honored. 286 // Additionally, clients will be informed that they are tiled, removing some client-side rounded corners. 287 // This option will also fix border/focus ring drawing behind some semitransparent windows. 288 // After enabling or disabling this, you need to restart the apps for this to take effect. 289 prefer-no-csd 290 291 // You can change the path where screenshots are saved. 292 // A ~ at the front will be expanded to the home directory. 293 // The path is formatted with strftime(3) to give you the screenshot date and time. 294 screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" 295 296 // You can also set this to null to disable saving screenshots to disk. 297 // screenshot-path null 298 299 // Animation settings. 300 // The wiki explains how to configure individual animations: 301 // https://github.com/YaLTeR/niri/wiki/Configuration:-Animations 302 animations { 303 // Uncomment to turn off all animations. 304 // off 305 306 // Slow down all animations by this factor. Values below 1 speed them up instead. 307 slowdown 0.5 308 } 309 310 // Window rules let you adjust behavior for individual windows. 311 // Find more information on the wiki: 312 // https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules 313 314 // Open the chromium-wrapped picture-in-picture player as floating by default. 315 window-rule { 316 // This app-id regular expression will work for both: 317 // - host chromium-wrapped (app-id is "chromium-wrapped") 318 // - Flatpak chromium-wrapped (app-id is "org.mozilla.chromium-wrapped") 319 match app-id=r#""# title="^Picture in picture$" 320 open-floating true 321 } 322 323 // Example: block out two password managers from screen capture. 324 // (This example rule is commented out with a "/-" in front.) 325 /-window-rule { 326 match app-id=r#"^org\.keepassxc\.KeePassXC$"# 327 match app-id=r#"^org\.gnome\.World\.Secrets$"# 328 329 block-out-from "screen-capture" 330 331 // Use this instead if you want them visible on third-party screenshot tools. 332 // block-out-from "screencast" 333 } 334 335 // Example: enable rounded corners for all windows. 336 // (This example rule is commented out with a "/-" in front.) 337 window-rule { 338 geometry-corner-radius ${theme.lengths.border-radius} 339 clip-to-geometry true 340 } 341 342 // window-rule { 343 // match is-floating=true 344 // baba-is-float true 345 // } 346 347 binds { 348 // Keys consist of modifiers separated by + signs, followed by an XKB key name 349 // in the end. To find an XKB name for a particular key, you may use a program 350 // like wev. 351 // 352 // "Mod" is a special modifier equal to Super when running on a TTY, and to Alt 353 // when running as a winit window. 354 // 355 // Most actions that you can bind here can also be invoked programmatically with 356 // `niri msg action do-something`. 357 358 // Mod-Shift-/, which is usually the same as Mod-?, 359 // shows a list of important hotkeys. 360 Mod+Shift+Slash { show-hotkey-overlay; } 361 362 // Suggested binds for running programs: terminal, app launcher, screen locker. 363 Mod+Return { spawn "${lib.getExe alacritty-wrapped}"; } 364 Mod+Shift+Return { spawn "${lib.getExe chromium-wrapped}"; } 365 366 // You can also use a shell. Do this if you need pipes, multiple commands, etc. 367 // Note: the entire command goes as a single argument in the end. 368 // Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; } 369 370 // Core Noctalia binds 371 Mod+D { spawn "${lib.getExe noctalia-shell}" "ipc" "call" "launcher" "toggle"; } 372 Mod+Space { spawn "${lib.getExe noctalia-shell}" "ipc" "call" "launcher" "toggle"; } 373 374 // Audio controls 375 XF86AudioRaiseVolume { spawn "${lib.getExe noctalia-shell}" "ipc" "call" "volume" "increase"; } 376 XF86AudioLowerVolume { spawn "${lib.getExe noctalia-shell}" "ipc" "call" "volume" "decrease"; } 377 XF86AudioMute { spawn "${lib.getExe noctalia-shell}" "ipc" "call" "volume" "muteOutput"; } 378 379 // Brightness controls 380 XF86MonBrightnessUp { spawn "${lib.getExe noctalia-shell}" "ipc" "call" "brightness" "increase"; } 381 XF86MonBrightnessDown { spawn "${lib.getExe noctalia-shell}" "ipc" "call" "brightness" "decrease"; } 382 383 Mod+Ctrl+Shift+Alt+L { spawn "${lib.getExe chromium-wrapped}" "--new-window" "https://www.linkedin.com/"; } 384 385 Mod+Q { close-window; } 386 387 Mod+Left { focus-column-left; } 388 Mod+Down { focus-window-down; } 389 Mod+Up { focus-window-up; } 390 Mod+Right { focus-column-right; } 391 Mod+H { focus-column-left; } 392 Mod+J { focus-window-down; } 393 Mod+K { focus-window-up; } 394 Mod+L { focus-column-right; } 395 396 Mod+Shift+Left { move-column-left; } 397 Mod+Shift+Down { move-window-down; } 398 Mod+Shift+Up { move-window-up; } 399 Mod+Shift+Right { move-column-right; } 400 Mod+Shift+H { move-column-left; } 401 Mod+Shift+J { move-window-down; } 402 Mod+Shift+K { move-window-up; } 403 Mod+Shift+L { move-column-right; } 404 405 // Alternative commands that move across workspaces when reaching 406 // the first or last window in a column. 407 // Mod+J { focus-window-or-workspace-down; } 408 // Mod+K { focus-window-or-workspace-up; } 409 // Mod+Ctrl+J { move-window-down-or-to-workspace-down; } 410 // Mod+Ctrl+K { move-window-up-or-to-workspace-up; } 411 412 Mod+Home { focus-column-first; } 413 Mod+End { focus-column-last; } 414 Mod+Shift+Home { move-column-to-first; } 415 Mod+Shift+End { move-column-to-last; } 416 417 Mod+Control+Left { focus-monitor-left; } 418 Mod+Control+Down { focus-monitor-down; } 419 Mod+Control+Up { focus-monitor-up; } 420 Mod+Control+Right { focus-monitor-right; } 421 Mod+Control+H { focus-monitor-left; } 422 Mod+Control+J { focus-monitor-down; } 423 Mod+Control+K { focus-monitor-up; } 424 Mod+Control+L { focus-monitor-right; } 425 426 Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } 427 Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } 428 Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } 429 Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } 430 Mod+Shift+Ctrl+H { move-column-to-monitor-left; } 431 Mod+Shift+Ctrl+J { move-column-to-monitor-down; } 432 Mod+Shift+Ctrl+K { move-column-to-monitor-up; } 433 Mod+Shift+Ctrl+L { move-column-to-monitor-right; } 434 435 // Alternatively, there are commands to move just a single window: 436 // Mod+Shift+Ctrl+Left { move-window-to-monitor-left; } 437 // ... 438 439 // And you can also move a whole workspace to another monitor: 440 // Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; } 441 // ... 442 443 Mod+Page_Down { focus-workspace-down; } 444 Mod+Page_Up { focus-workspace-up; } 445 Mod+U { focus-workspace-down; } 446 Mod+I { focus-workspace-up; } 447 Mod+Shift+Page_Down { move-column-to-workspace-down; } 448 Mod+Shift+Page_Up { move-column-to-workspace-up; } 449 Mod+Shift+U { move-column-to-workspace-down; } 450 Mod+Shift+I { move-column-to-workspace-up; } 451 452 // Alternatively, there are commands to move just a single window: 453 // Mod+Ctrl+Page_Down { move-window-to-workspace-down; } 454 // ... 455 456 Mod+Ctrl+Page_Down { move-workspace-down; } 457 Mod+Ctrl+Page_Up { move-workspace-up; } 458 Mod+Ctrl+U { move-workspace-down; } 459 Mod+Ctrl+I { move-workspace-up; } 460 461 Mod+S { toggle-overview; } 462 463 // You can bind mouse wheel scroll ticks using the following syntax. 464 // These binds will change direction based on the natural-scroll setting. 465 // 466 // To avoid scrolling through workspaces really fast, you can use 467 // the cooldown-ms property. The bind will be rate-limited to this value. 468 // You can set a cooldown on any bind, but it's most useful for the wheel. 469 Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } 470 Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } 471 Mod+Shift+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } 472 Mod+Shift+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } 473 474 Mod+WheelScrollRight { focus-column-right; } 475 Mod+WheelScrollLeft { focus-column-left; } 476 Mod+Ctrl+WheelScrollRight { move-column-right; } 477 Mod+Ctrl+WheelScrollLeft { move-column-left; } 478 479 // Usually scrolling up and down with Shift in applications results in 480 // horizontal scrolling; these binds replicate that. 481 Mod+Ctrl+WheelScrollDown { focus-column-right; } 482 Mod+Ctrl+WheelScrollUp { focus-column-left; } 483 Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } 484 Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } 485 486 // Similarly, you can bind touchpad scroll "ticks". 487 // Touchpad scrolling is continuous, so for these binds it is split into 488 // discrete intervals. 489 // These binds are also affected by touchpad's natural-scroll, so these 490 // example binds are "inverted", since we have natural-scroll enabled for 491 // touchpads by default. 492 493 // You can refer to workspaces by index. However, keep in mind that 494 // niri is a dynamic workspace system, so these commands are kind of 495 // "best effort". Trying to refer to a workspace index bigger than 496 // the current workspace count will instead refer to the bottommost 497 // (empty) workspace. 498 // 499 // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on 500 // will all refer to the 3rd workspace. 501 Mod+1 { focus-workspace 1; } 502 Mod+2 { focus-workspace 2; } 503 Mod+3 { focus-workspace 3; } 504 Mod+4 { focus-workspace 4; } 505 Mod+5 { focus-workspace 5; } 506 Mod+6 { focus-workspace 6; } 507 Mod+7 { focus-workspace 7; } 508 Mod+8 { focus-workspace 8; } 509 Mod+9 { focus-workspace 9; } 510 Mod+Shift+1 { move-column-to-workspace 1; } 511 Mod+Shift+2 { move-column-to-workspace 2; } 512 Mod+Shift+3 { move-column-to-workspace 3; } 513 Mod+Shift+4 { move-column-to-workspace 4; } 514 Mod+Shift+5 { move-column-to-workspace 5; } 515 Mod+Shift+6 { move-column-to-workspace 6; } 516 Mod+Shift+7 { move-column-to-workspace 7; } 517 Mod+Shift+8 { move-column-to-workspace 8; } 518 Mod+Shift+9 { move-column-to-workspace 9; } 519 520 // Alternatively, there are commands to move just a single window: 521 // Mod+Ctrl+1 { move-window-to-workspace 1; } 522 523 // Switches focus between the current and the previous workspace. 524 // Mod+Tab { focus-workspace-previous; } 525 526 // The following binds move the focused window in and out of a column. 527 // If the window is alone, they will consume it into the nearby column to the side. 528 // If the window is already in a column, they will expel it out. 529 Mod+BracketLeft { consume-or-expel-window-left; } 530 Mod+BracketRight { consume-or-expel-window-right; } 531 532 // Consume one window from the right to the bottom of the focused column. 533 Mod+Comma { consume-window-into-column; } 534 // Expel the bottom window from the focused column to the right. 535 Mod+Period { expel-window-from-column; } 536 537 Mod+R { switch-preset-column-width; } 538 Mod+Shift+R { switch-preset-window-height; } 539 Mod+Ctrl+R { reset-window-height; } 540 Mod+F { maximize-column; } 541 Mod+Shift+F { fullscreen-window; } 542 543 // Expand the focused column to space not taken up by other fully visible columns. 544 // Makes the column "fill the rest of the space". 545 Mod+Ctrl+F { expand-column-to-available-width; } 546 547 Mod+C { center-column; } 548 549 // Finer width adjustments. 550 // This command can also: 551 // * set width in pixels: "1000" 552 // * adjust width in pixels: "-5" or "+5" 553 // * set width as a percentage of screen width: "25%" 554 // * adjust width as a percentage of screen width: "-10%" or "+10%" 555 // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0, 556 // set-column-width "100" will make the column occupy 200 physical screen pixels. 557 Mod+Minus { set-column-width "-10%"; } 558 Mod+Equal { set-column-width "+10%"; } 559 560 // Finer height adjustments when in column with other windows. 561 Mod+Shift+Minus { set-window-height "-10%"; } 562 Mod+Shift+Equal { set-window-height "+10%"; } 563 564 // Move the focused window between the floating and the tiling layout. 565 Mod+V { toggle-window-floating; } 566 Mod+Shift+V { switch-focus-between-floating-and-tiling; } 567 568 // Toggle tabbed column display mode. 569 // Windows in this column will appear as vertical tabs, 570 // rather than stacked on top of each other. 571 Mod+W { toggle-column-tabbed-display; } 572 573 // Actions to switch layouts. 574 // Note: if you uncomment these, make sure you do NOT have 575 // a matching layout switch hotkey configured in xkb options above. 576 // Having both at once on the same hotkey will break the switching, 577 // since it will switch twice upon pressing the hotkey (once by xkb, once by niri). 578 // Mod+Space { switch-layout "next"; } 579 // Mod+Shift+Space { switch-layout "prev"; } 580 581 Print { screenshot; } 582 Ctrl+Print { screenshot-screen; } 583 Alt+Print { screenshot-window; } 584 Mod+P { screenshot; } 585 Ctrl+Mod+P { screenshot-screen; } 586 Alt+Mod+P { screenshot-window; } 587 588 // Applications such as remote-desktop clients and software KVM switches may 589 // request that niri stops processing the keyboard shortcuts defined here 590 // so they may, for example, forward the key presses as-is to a remote machine. 591 // It's a good idea to bind an escape hatch to toggle the inhibitor, 592 // so a buggy application can't hold your session hostage. 593 // 594 // The allow-inhibiting=false property can be applied to other binds as well, 595 // which ensures niri always processes them, even when an inhibitor is active. 596 Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } 597 598 // The quit action will show a confirmation dialog to avoid accidental exits. 599 Mod+Shift+E { quit; } 600 Ctrl+Alt+Delete { quit; } 601 602 // Powers off the monitors. To turn them back on, do any input like 603 // moving the mouse or pressing any other key. 604 Mod+Shift+P { power-off-monitors; } 605 } 606 607 // noctalia settings 608 layer-rule { 609 match namespace="^quickshell-overview$" 610 place-within-backdrop true 611 } 612 613 debug { 614 honor-xdg-activation-with-invalid-serial 615 } 616 ''; 617in 618mkWrapper { 619 pkg = niri; 620 niri.env.NIRI_CONFIG = "${cfg}"; 621}