personal nixos config and packages
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}