summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_sources/generated.json8
-rw-r--r--_sources/generated.nix8
-rw-r--r--accounts/gkleen@sif/niri/default.nix1015
-rw-r--r--accounts/gkleen@sif/niri/waybar.nix4
-rw-r--r--flake.lock58
-rw-r--r--flake.nix2
-rw-r--r--hosts/sif/default.nix8
-rw-r--r--hosts/sif/greetd/default.nix5
8 files changed, 592 insertions, 516 deletions
diff --git a/_sources/generated.json b/_sources/generated.json
index 72f913ec..b3d09fc4 100644
--- a/_sources/generated.json
+++ b/_sources/generated.json
@@ -407,7 +407,7 @@
407 }, 407 },
408 "v4l2loopback": { 408 "v4l2loopback": {
409 "cargoLocks": null, 409 "cargoLocks": null,
410 "date": "2025-01-18", 410 "date": "2025-02-03",
411 "extract": null, 411 "extract": null,
412 "name": "v4l2loopback", 412 "name": "v4l2loopback",
413 "passthru": null, 413 "passthru": null,
@@ -419,12 +419,12 @@
419 "name": null, 419 "name": null,
420 "owner": "umlaeute", 420 "owner": "umlaeute",
421 "repo": "v4l2loopback", 421 "repo": "v4l2loopback",
422 "rev": "39ad8a43522c18b5e4f4363ce053f604312fc413", 422 "rev": "7164d6e6b9aad52a27652c8bb8bd3c3d7a5b336b",
423 "sha256": "sha256-A1p5ZfoMlw6/J3vBdQcXMvERdyBnqs9Ca+0LcLnu7b8=", 423 "sha256": "sha256-1f4+pIbPM/TOJOc7Ns2VDXlBCGyrXiNpmKfThl5kZfk=",
424 "sparseCheckout": [], 424 "sparseCheckout": [],
425 "type": "github" 425 "type": "github"
426 }, 426 },
427 "version": "39ad8a43522c18b5e4f4363ce053f604312fc413" 427 "version": "7164d6e6b9aad52a27652c8bb8bd3c3d7a5b336b"
428 }, 428 },
429 "xcompose": { 429 "xcompose": {
430 "cargoLocks": null, 430 "cargoLocks": null,
diff --git a/_sources/generated.nix b/_sources/generated.nix
index e25f1bda..63c464bb 100644
--- a/_sources/generated.nix
+++ b/_sources/generated.nix
@@ -254,15 +254,15 @@
254 }; 254 };
255 v4l2loopback = { 255 v4l2loopback = {
256 pname = "v4l2loopback"; 256 pname = "v4l2loopback";
257 version = "39ad8a43522c18b5e4f4363ce053f604312fc413"; 257 version = "7164d6e6b9aad52a27652c8bb8bd3c3d7a5b336b";
258 src = fetchFromGitHub { 258 src = fetchFromGitHub {
259 owner = "umlaeute"; 259 owner = "umlaeute";
260 repo = "v4l2loopback"; 260 repo = "v4l2loopback";
261 rev = "39ad8a43522c18b5e4f4363ce053f604312fc413"; 261 rev = "7164d6e6b9aad52a27652c8bb8bd3c3d7a5b336b";
262 fetchSubmodules = true; 262 fetchSubmodules = true;
263 sha256 = "sha256-A1p5ZfoMlw6/J3vBdQcXMvERdyBnqs9Ca+0LcLnu7b8="; 263 sha256 = "sha256-1f4+pIbPM/TOJOc7Ns2VDXlBCGyrXiNpmKfThl5kZfk=";
264 }; 264 };
265 date = "2025-01-18"; 265 date = "2025-02-03";
266 }; 266 };
267 xcompose = { 267 xcompose = {
268 pname = "xcompose"; 268 pname = "xcompose";
diff --git a/accounts/gkleen@sif/niri/default.nix b/accounts/gkleen@sif/niri/default.nix
index 7e187c84..abcb80fc 100644
--- a/accounts/gkleen@sif/niri/default.nix
+++ b/accounts/gkleen@sif/niri/default.nix
@@ -1,6 +1,10 @@
1{ config, hostConfig, pkgs, lib, ... }: 1{ config, hostConfig, pkgs, lib, flakeInputs, ... }:
2let 2let
3 niri = config.programs.niri.package; 3 cfg = config.programs.niri;
4
5 kdl = flakeInputs.niri-flake.lib.kdl;
6
7 niri = cfg.package;
4 terminal = lib.getExe config.programs.kitty.package; 8 terminal = lib.getExe config.programs.kitty.package;
5 makoctl = lib.getExe' config.services.mako.package "makoctl"; 9 makoctl = lib.getExe' config.services.mako.package "makoctl";
6 loginctl = lib.getExe' hostConfig.systemd.package "loginctl"; 10 loginctl = lib.getExe' hostConfig.systemd.package "loginctl";
@@ -78,7 +82,7 @@ let
78 jq --arg active_workspace "$active_workspace" -c "$action" <<<"$workspace_json" | tee /dev/stderr | socat STDIO "$NIRI_SOCKET" 82 jq --arg active_workspace "$active_workspace" -c "$action" <<<"$workspace_json" | tee /dev/stderr | socat STDIO "$NIRI_SOCKET"
79 ''; 83 '';
80 }; 84 };
81 with-adjacent-workspace-action = config.lib.niri.actions.spawn (lib.getExe with_adjacent_workspace) "^pwctl|eff|kpxc|bmgr|edit|term$"; 85 with-adjacent-workspace-action = config.lib.niri.actions.spawn (lib.getExe with_adjacent_workspace) "^${lib.concatMapStringsSep "|" ({ name, ...}: name) cfg.scratchspaces}$";
82 focus-adjacent-workspace = direction: with-adjacent-workspace-action direction ''{"Action":{"FocusWorkspace":{"reference":{"Id": .id}}}}''; 86 focus-adjacent-workspace = direction: with-adjacent-workspace-action direction ''{"Action":{"FocusWorkspace":{"reference":{"Id": .id}}}}'';
83 move-column-to-adjacent-workspace = direction: with-adjacent-workspace-action direction ''{"Action":{"MoveColumnToWorkspace":{"reference":{"Id": .id}}}}''; 87 move-column-to-adjacent-workspace = direction: with-adjacent-workspace-action direction ''{"Action":{"MoveColumnToWorkspace":{"reference":{"Id": .id}}}}'';
84 88
@@ -129,6 +133,54 @@ in {
129 ./swayosd.nix 133 ./swayosd.nix
130 ]; 134 ];
131 135
136 options = {
137 programs.niri.scratchspaces = lib.mkOption {
138 type = lib.types.listOf (lib.types.submodule ({ config, ... }: {
139 options = {
140 name = lib.mkOption {
141 type = lib.types.str;
142 };
143 match = lib.mkOption {
144 type = lib.types.listOf (lib.types.attrsOf kdl.types.kdl-args);
145 default = [];
146 };
147 exclude = lib.mkOption {
148 type = lib.types.listOf (lib.types.attrsOf kdl.types.kdl-args);
149 default = [];
150 };
151 windowRuleExtra = lib.mkOption {
152 type = kdl.types.kdl-nodes;
153 default = [];
154 };
155 key = lib.mkOption {
156 type = lib.types.nullOr lib.types.str;
157 default = null;
158 };
159 spawn = lib.mkOption {
160 type = lib.types.nullOr (lib.types.listOf lib.types.str);
161 default = null;
162 };
163 app-id = lib.mkOption {
164 type = lib.types.nullOr lib.types.str;
165 default = null;
166 };
167 selector = lib.mkOption {
168 type = lib.types.nullOr lib.types.str;
169 default = null;
170 };
171 };
172
173 config = lib.mkMerge [
174 (lib.mkIf (config.app-id != null) {
175 match = lib.mkDefault [ { app-id = "^${lib.escapeRegex config.app-id}$"; } ];
176 selector = lib.mkDefault "select(.app_id == \"${config.app-id}\")";
177 })
178 ];
179 }));
180 default = [];
181 };
182 };
183
132 config = { 184 config = {
133 systemd.user.services.xwayland-satellite = { 185 systemd.user.services.xwayland-satellite = {
134 Unit = { 186 Unit = {
@@ -268,476 +320,495 @@ in {
268 }; 320 };
269 }; 321 };
270 322
271 programs.niri.settings = { 323 programs.niri.scratchspaces = [
272 prefer-no-csd = true; 324 { name = "pwctl";
273 screenshot-path = "${config.home.homeDirectory}/screenshots"; 325 key = "Mod+Control+A";
274 326 spawn = ["pwvucontrol"];
275 hotkey-overlay.skip-at-startup = true; 327 app-id = "com.saivert.pwvucontrol";
276 328 }
277 input = { 329 { name = "kpxc";
278 keyboard = { 330 exclude = [
279 repeat-delay = 300; 331 { title = "^Unlock Database.*"; }
280 repeat-rate = 50; 332 { title = "^Access Request.*"; }
281 333 { title = ".*Passkey credentials$"; }
282 xkb = {
283 layout = "us,us";
284 variant = "dvp,";
285 options = "compose:caps,grp:win_space_toggle";
286 };
287 };
288
289 workspace-auto-back-and-forth = true;
290 # focus-follows-mouse.enable = true;
291 warp-mouse-to-focus = true;
292 };
293
294 outputs = {
295 "eDP-1" = {
296 scale = 1.5;
297 position = { x = 0; y = 0; };
298 };
299 "Ancor Communications Inc ASUS PB287Q 0x0000DD9B" = {
300 scale = 1.5;
301 position = { x = 2560; y = 0; };
302 };
303 "HP Inc. HP 727pu CN4417143K" = {
304 mode = { width = 2560; height = 1440; refresh = 119.998; };
305 scale = 1;
306 position = { x = 2560; y = 0; };
307 variable-refresh-rate = "on-demand";
308 };
309 };
310
311 environment = {
312 NIXOS_OZONE_WL = "1";
313 QT_QPA_PLATFORM = "wayland";
314 QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
315 GDK_BACKEND = "wayland";
316 SDL_VIDEODRIVER = "wayland";
317 DISPLAY = ":0";
318 };
319
320 debug.render-drm-device = "/dev/dri/by-path/pci-0000:00:02.0-render";
321
322 animations = {
323 slowdown = 0.5;
324 workspace-switch = null;
325 };
326
327 layout = {
328 gaps = 8;
329 struts = { left = 0; right = 0; top = 0; bottom = 0; };
330 focus-ring = {
331 width = 2;
332 active.gradient = {
333 from = "hsla(195 100% 60% 0.75)";
334 to = "hsla(155 100% 50% 0.75)";
335 angle = 29;
336 relative-to = "workspace-view";
337 };
338 inactive.gradient = {
339 from = "hsla(0 0% 42% 0.66)";
340 to = "hsla(0 0% 35% 0.66)";
341 angle = 29;
342 relative-to = "workspace-view";
343 };
344 };
345
346 preset-column-widths = [
347 { proportion = 1. / 4.; }
348 { proportion = 1. / 3.; }
349 { proportion = 1. / 2.; }
350 { proportion = 2. / 3.; }
351 { proportion = 3. / 4.; }
352 ]; 334 ];
353 default-column-width.proportion = 1. / 2.; 335 windowRuleExtra = [
354 preset-window-heights = [ 336 (kdl.leaf "open-focused" false)
355 { proportion = 1. / 3.; } 337 ];
356 { proportion = 1. / 2.; } 338 key = "Mod+Control+P";
357 { proportion = 2. / 3.; } 339 app-id = "org.keepassxc.KeePassXC";
358 { proportion = 1.; } 340 spawn = [ "keepassxc" ];
341 }
342 { name = "bmgr";
343 key = "Mod+Control+B";
344 app-id = ".blueman-manager-wrapped";
345 spawn = [ "blueman-manager" ];
346 }
347 { name = "term";
348 key = "Mod+Control+Return";
349 app-id = "kitty-scratch";
350 spawn = [ "kitty" "--app-id" "kitty-scratch" ];
351 }
352 { name = "edit";
353 match = [ { title = "^scratch$"; app-id = "^emacs$"; } ];
354 key = "Mod+Control+E";
355 selector = "select(.app_id == \"emacs\" and .title == \"scratch\")";
356 spawn = [ "emacsclient" "-c" "--frame-parameters=(quote (name . \"scratch\"))" ];
357 }
358 { name = "eff";
359 key = "Mod+Control+O";
360 app-id = "com.github.wwmm.easyeffects";
361 spawn = [ "easyeffects" ];
362 }
363 ];
364 programs.niri.config =
365 let
366 inherit (kdl) node plain leaf flag;
367 optional-node = cond: v:
368 if cond
369 then v
370 else null;
371 opt-props = lib.filterAttrs (lib.const (value: value != null));
372 in
373 [ (flag "prefer-no-csd")
374
375 (plain "hotkey-overlay" [
376 (flag "skip-at-startup")
377 ])
378
379 (plain "input" [
380 (plain "keyboard" [
381 (leaf "repeat-delay" 300)
382 (leaf "repeat-rate" 50)
383
384 (plain "xkb" [
385 (leaf "layout" "us,us")
386 (leaf "variant" "dvp,")
387 (leaf "options" "compose:caps,grp:win_space_toggle")
388 ])
389 ])
390
391 (flag "workspace-auto-back-and-forth")
392 # (leaf "focus-follows-mouse" {})
393 # (flag "warp-mouse-to-focus")
394
395 (plain "touchpad" [ (flag "off") ])
396 (plain "trackball" [
397 (leaf "scroll-method" "on-button-down")
398 (leaf "scroll-button" 278)
399 ])
400 ])
401
402 (plain "environment" (lib.mapAttrsToList leaf {
403 NIXOS_OZONE_WL = "1";
404 QT_QPA_PLATFORM = "wayland";
405 QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
406 GDK_BACKEND = "wayland";
407 SDL_VIDEODRIVER = "wayland";
408 DISPLAY = ":0";
409 }))
410
411 (node "output" "eDP-1" [
412 (leaf "scale" 1.5)
413 (leaf "position" { x = 0; y = 0; })
414 ])
415 (node "output" "Ancor Communications Inc ASUS PB287Q 0x0000DD9B" [
416 (leaf "scale" 1.5)
417 (leaf "position" { x = 2560; y = 0; })
418 ])
419 (node "output" "HP Inc. HP 727pu CN4417143K" [
420 (leaf "mode" "2560x1440@120") # 119.998
421 (leaf "scale" 1)
422 (leaf "position" { x = 2560; y = 0; })
423 (flag "variable-refresh-rate")
424 ])
425
426 (plain "debug" [
427 (leaf "render-drm-device" "/dev/dri/by-path/pci-0000:00:02.0-render")
428 ])
429
430 (plain "animations" [
431 (leaf "slowdown" 0.5)
432 (plain "workspace-switch" [(flag "off")])
433 ])
434
435 (plain "layout" [
436 (leaf "gaps" 8)
437 (plain "struts" [
438 (leaf "left" 0)
439 (leaf "right" 0)
440 (leaf "top" 0)
441 (leaf "bottom" 0)
442 ])
443 (plain "focus-ring" [
444 (leaf "width" 2)
445 (leaf "active-gradient" {
446 from = "hsla(195 100% 45% 1)";
447 to = "hsla(155 100% 37.5% 1)";
448 angle = 29;
449 relative-to = "workspace-view";
450 })
451 (leaf "inactive-gradient" {
452 from = "hsla(0 0% 27.7% 1)";
453 to = "hsla(0 0% 23% 1)";
454 angle = 29;
455 relative-to = "workspace-view";
456 })
457 ])
458
459 (plain "preset-column-widths" (map (prop: leaf "proportion" prop) [
460 (1. / 4.) (1. / 3.) (1. / 2.) (2. / 3.) (3. / 4.)
461 ]))
462 (plain "default-column-width" [ (leaf "proportion" (1. / 2.)) ])
463 (plain "preset-window-heights" (map (prop: leaf "proportion" prop) [
464 (1. / 3.) (1. / 2.) (2. / 3.) (1.)
465 ]))
466
467 (flag "always-center-single-column")
468
469 (plain "tab-indicator" [
470 (leaf "gap" (-6))
471 (leaf "width" 6)
472 (leaf "length" { total-proportion = 1.; })
473 (leaf "active-gradient" {
474 from = "hsla(195 100% 60% 0.75)";
475 to = "hsla(155 100% 50% 0.75)";
476 angle = 29;
477 relative-to = "workspace-view";
478 })
479 (leaf "inactive-gradient" {
480 from = "hsla(0 0% 42% 0.66)";
481 to = "hsla(0 0% 35% 0.66)";
482 angle = 29;
483 relative-to = "workspace-view";
484 })
485 ])
486 ])
487
488 (plain "cursor" [
489 (flag "hide-when-typing")
490 ])
491
492 (map (name:
493 (node "workspace" name [
494 (leaf "open-on-output" "eDP-1")
495 ])
496 ) (map ({name, ...}: name) cfg.scratchspaces))
497 (map (name:
498 (leaf "workspace" name)
499 ) ["comm" "web" "vid" "bmr"])
500
501 (plain "window-rule" [
502 (leaf "match" { is-floating = true; })
503 (leaf "geometry-corner-radius" 8)
504 (leaf "clip-to-geometry" true)
505 ])
506
507 (plain "window-rule" [
508 (leaf "match" { app-id = "^org\\.keepassxc\\.KeePassXC$"; })
509 (leaf "block-out-from" "screencast")
510 ])
511 (plain "window-rule" [
512 (map (title:
513 (leaf "match" { app-id = "^org\\.keepassxc\\.KeePassXC$"; inherit title; })
514 ) ["^Unlock Database.*" "^Access Request.*" ".*Passkey credentials$"])
515 (leaf "open-focused" true)
516 (leaf "open-floating" true)
517 ])
518
519 (map ({ name, match, exclude, windowRuleExtra, ... }:
520 (optional-node (match != []) (plain "window-rule" [
521 (map (leaf "match") match)
522 (map (leaf "exclude") exclude)
523 (leaf "open-on-workspace" name)
524 (leaf "open-maximized" true)
525 windowRuleExtra
526 ]))
527 ) cfg.scratchspaces)
528
529 (plain "window-rule" [
530 (leaf "match" { app-id = "^emacs$"; })
531 (leaf "match" { app-id = "^firefox$"; })
532 (plain "default-column-width" [(leaf "proportion" (2. / 3.))])
533 ])
534 (plain "window-rule" [
535 (leaf "match" { app-id = "^kitty$"; })
536 (leaf "match" { app-id = "^kitty-play$"; })
537 (plain "default-column-width" [(leaf "proportion" (1. / 3.))])
538 ])
539
540 (plain "window-rule" [
541 (leaf "match" { app-id = "^thunderbird$"; })
542 (leaf "match" { app-id = "^Element$"; })
543 (leaf "match" { app-id = "^Rainbow$"; })
544 (leaf "open-on-workspace" "comm")
545 ])
546 (plain "window-rule" [
547 (leaf "match" { app-id = "^firefox$"; })
548 (leaf "open-on-workspace" "web")
549 (leaf "open-maximized" true)
550 ])
551 (plain "window-rule" [
552 (leaf "match" { app-id = "^mpv$"; })
553 (leaf "open-on-workspace" "vid")
554 (plain "default-column-width" [(leaf "proportion" 1.)])
555 ])
556 (plain "window-rule" [
557 (leaf "match" { app-id = "^kitty-play$"; })
558 (leaf "open-on-workspace" "vid")
559 (leaf "open-focused" false)
560 ])
561 (plain "window-rule" [
562 (leaf "match" { app-id = "^pdfpc$"; })
563 (plain "default-column-width" [(leaf "proportion" 1.)])
564 ])
565 (plain "window-rule" [
566 (leaf "match" { app-id = "^pdfpc$"; title = "^pdfpc - presentation$"; })
567 (plain "default-column-width" [(leaf "proportion" 1.)])
568 (leaf "open-fullscreen" true)
569 (leaf "open-on-workspace" "bmr")
570 (leaf "open-focused" false)
571 ])
572 (plain "window-rule" [
573 (map (leaf "match") [
574 { app-id = "^Gimp-"; title = "^Quit GIMP$"; }
575 { app-id = "^org\\.kde\\.polkit-kde-authentication-agent-1$"; }
576 { app-id = "^xdg-desktop-portal-gtk$"; }
577 ])
578 (leaf "open-floating" true)
579 ])
580
581 (plain "layer-rule" [
582 (leaf "match" { namespace = "^notifications$"; })
583 (leaf "match" { namespace = "^waybar$"; })
584 (leaf "match" { namespace = "^launcher$"; })
585 (leaf "block-out-from" "screencast")
586 ])
587
588 (plain "binds"
589 (let
590 bind = name: cfg: node name (opt-props {
591 cooldown-ms = cfg.cooldown-ms or null;
592 }
593 // (lib.optionalAttrs (!(cfg.repeat or true)) {
594 repeat = false;
595 })
596 // (lib.optionalAttrs (cfg.allow-when-locked or false) {
597 allow-when-locked = true;
598 })) (lib.mapAttrsToList leaf (lib.removeAttrs cfg.action ["__functor"]));
599 in
600 [
601 (lib.mapAttrsToList bind (with config.lib.niri.actions; {
602 "Mod+Slash".action = show-hotkey-overlay;
603
604 "Mod+Return".action = spawn terminal;
605 "Mod+Q".action = close-window;
606 "Mod+O".action = spawn (lib.getExe config.programs.fuzzel.package);
607 "Mod+Shift+O".action = spawn (lib.getExe config.programs.fuzzel.package) "--list-executables-in-path";
608
609 "Mod+Alt+E".action = spawn (lib.getExe' config.services.emacs.package "emacsclient") "-c";
610 "Mod+Alt+Y".action = spawn (lib.getExe (pkgs.writeShellApplication {
611 name = "queue-yt-dlp";
612 runtimeInputs = with pkgs; [ wl-clipboard-rs socat ];
613 text = ''
614 socat STDIO UNIX-CONNECT:"$XDG_RUNTIME_DIR"/yt-dlp.sock <<<$'{ "urls": ["'"$(wl-paste)"$'"] }'
615 '';
616 }));
617 "Mod+Alt+L".action = spawn (lib.getExe (pkgs.writeShellApplication {
618 name = "queue-yt-dlp";
619 runtimeInputs = with pkgs; [ wl-clipboard-rs config.programs.kitty.package ];
620 text = ''
621 exec -- kitty --app-id kitty-play --directory "$HOME"/media mpv "$(wl-paste)"
622 '';
623 }));
624
625 "Mod+U".action = spawn (lib.getExe (pkgs.writeShellApplication {
626 name = "qalc-fuzzel";
627 runtimeInputs = with pkgs; [ wl-clipboard-rs libqalculate config.programs.fuzzel.package coreutils findutils libnotify gnugrep ];
628 text = ''
629 RESULTS_DIR="$HOME/.cache/qalc-fuzzel"
630 prev() {
631 FOUND=false
632 while IFS= read -r line; do
633 [[ -n "$line" ]] || continue
634 FOUND=true
635 echo "$line"
636 done < <(export LC_ALL=C.UTF-8; echo; find "$RESULTS_DIR" -type f -printf $'%T@ %p\n' | sort -n | cut -d' ' -f2- | xargs -r cat)
637 $FOUND || echo
638 }
639 FUZZEL_RES=$(prev | fuzzel --dmenu --prompt "qalc> ") || exit $?
640 if [[ "$FUZZEL_RES" =~ .*\ =\ .* ]]; then
641 QALC_RES="$FUZZEL_RES"
642 QALC_RET=0
643 else
644 QALC_RES=$(qalc "$FUZZEL_RES" 2>&1)
645 QALC_RET=$?
646 fi
647 [[ -n "$QALC_RES" ]] || exit 1
648 EXISTING=false
649 set +o pipefail
650 grep -Fxrl "$QALC_RES" "$RESULTS_DIR" | xargs -r touch
651 [[ ''${PIPESTATUS[0]} -eq 0 ]] && EXISTING=true
652 set -o pipefail
653 if [[ $QALC_RET -eq 0 ]] && ! $EXISTING; then
654 set +o pipefail
655 RES_FILE="$RESULTS_DIR"/$(date -uIs).$(tr -Cd 'a-zA-Z0-9' </dev/random | head -c 10)
656 set -o pipefail
657 cat >"$RES_FILE" <<<"$QALC_RES"
658 fi
659 [[ "$QALC_RES" =~ .*\ =\ (.*) ]] && QALC_RES="''${BASH_REMATCH[1]}"
660 [[ $QALC_RET -eq 0 ]] && wl-copy "$QALC_RES"
661 notify-send "$QALC_RES"
662 '';
663 }));
664 "Mod+E".action = spawn (lib.getExe (pkgs.writeShellApplication {
665 name = "emoji-fuzzel";
666 runtimeInputs = with pkgs; [ config.programs.fuzzel.package wtype wl-clipboard-rs ];
667 text = ''
668 FUZZEL_RES=$(fuzzel --dmenu --prompt "emoji> " <"$HOME"/.local/share/emoji-data/list.txt) || exit $?
669 [[ -n "$FUZZEL_RES" ]] || exit 1
670 wl-copy "$(cut -d ':' -f 1 <<<"$FUZZEL_RES" | tr -d '\n')" && wtype -k XF86Paste
671 '';
672 }));
673 "Print".action = spawn (lib.getExe (pkgs.writeShellApplication {
674 name = "screenshot";
675 runtimeInputs = with pkgs; [ grim slurp wl-clipboard-rs coreutils ];
676 text = ''
677 grim -g "$(slurp -b 00000080 -c FFFFFFFF -s 00000000 -w 1)" - \
678 | tee "$HOME/screenshots/$(date +"%Y-%m-%dT%H:%M:%S").png" \
679 | wl-copy --type image/png
680 '';
681 }));
682 "Shift+Print".action = spawn (lib.getExe (pkgs.writeShellApplication {
683 name = "screenshot";
684 runtimeInputs = with pkgs; [ grim niri gojq wl-clipboard-rs coreutils ];
685 text = ''
686 grim -o "$(niri msg -j workspaces | jq -r '.[] | select(.is_focused) | .output')" - \
687 | tee "$HOME/screenshots/$(date +"%Y-%m-%dT%H:%M:%S").png" \
688 | wl-copy --type image/png
689 '';
690 }));
691 "Mod+B".action = with-select-window-action ".workspace_id == ($active_workspace | tonumber)" "{\"Action\":{\"FocusWindow\":{\"id\": .id}}}";
692 "Mod+Shift+B".action = with-select-window-action "true" "{\"Action\":{\"FocusWindow\":{\"id\": .id}}}";
693
694 "Mod+H".action = focus-column-left;
695 "Mod+T".action = focus-window-down;
696 "Mod+N".action = focus-window-up;
697 "Mod+S".action = focus-column-right;
698
699 "Mod+Shift+H".action = move-column-left;
700 "Mod+Shift+T".action = move-window-down;
701 "Mod+Shift+N".action = move-window-up;
702 "Mod+Shift+S".action = move-column-right;
703
704 "Mod+Control+H".action = focus-monitor-left;
705 "Mod+Control+T".action = focus-monitor-down;
706 "Mod+Control+N".action = focus-monitor-up;
707 "Mod+Control+S".action = focus-monitor-right;
708
709 "Mod+Shift+Control+H".action = move-workspace-to-monitor-left;
710 "Mod+Shift+Control+T".action = move-workspace-to-monitor-down;
711 "Mod+Shift+Control+N".action = move-workspace-to-monitor-up;
712 "Mod+Shift+Control+S".action = move-workspace-to-monitor-right;
713
714 "Mod+G".action = focus-adjacent-workspace "down";
715 "Mod+C".action = focus-adjacent-workspace "up";
716
717 "Mod+Shift+G".action = move-column-to-adjacent-workspace "down";
718 "Mod+Shift+C".action = move-column-to-adjacent-workspace "up";
719
720 "Mod+Shift+Control+G".action = move-workspace-down;
721 "Mod+Shift+Control+C".action = move-workspace-up;
722
723 "Mod+ParenLeft".action = focus-workspace "comm";
724 "Mod+Shift+ParenLeft".action = move-column-to-workspace "comm";
725
726 "Mod+ParenRight".action = focus-workspace "web";
727 "Mod+Shift+ParenRight".action = move-column-to-workspace "web";
728
729 "Mod+BraceRight".action = focus-workspace "read";
730 "Mod+Shift+BraceRight".action = move-column-to-workspace "read";
731
732 "Mod+BraceLeft".action = focus-workspace "mon";
733 "Mod+Shift+BraceLeft".action = move-column-to-workspace "mon";
734
735 "Mod+Asterisk".action = focus-workspace "vid";
736 "Mod+Shift+Asterisk".action = move-column-to-workspace "vid";
737
738 "Mod+Plus".action = with-unnamed-workspace-action ''{"Action":{"FocusWorkspace":{"reference":{"Id": .id}}}}'';
739 "Mod+Shift+Plus".action = with-unnamed-workspace-action ''{"Action":{"MoveColumnToWorkspace":{"reference":{"Id": .id}}}}'';
740
741 "Mod+M".action = consume-or-expel-window-left;
742 "Mod+W".action = consume-or-expel-window-right;
743
744 "Mod+Shift+M".action = toggle-column-tabbed-display;
745
746 "Mod+R".action = switch-preset-column-width;
747 "Mod+Shift+R".action = switch-preset-window-height;
748 "Mod+F".action = center-column;
749 "Mod+Shift+F".action = maximize-column;
750 "Mod+Shift+Ctrl+F".action = fullscreen-window;
751
752 "Mod+V".action = switch-focus-between-floating-and-tiling;
753 "Mod+Shift+V".action = toggle-window-floating;
754
755 "Mod+Left".action = set-column-width "-10%";
756 "Mod+Down".action = set-window-height "-10%";
757 "Mod+Up".action = set-window-height "+10%";
758 "Mod+Right".action = set-column-width "+10%";
759
760 "Mod+Shift+Z" = {
761 action = spawn (lib.getExe niri) "msg" "action" "power-off-monitors";
762 allow-when-locked = true;
763 };
764 "Mod+Shift+L".action = spawn loginctl "lock-session";
765 "Mod+Shift+E".action = quit;
766 "Mod+Shift+Minus" = {
767 action = spawn systemctl "suspend";
768 allow-when-locked = true;
769 };
770 "Mod+Shift+Control+Minus" = {
771 action = spawn systemctl "hibernate";
772 allow-when-locked = true;
773 };
774 "Mod+Shift+P" = {
775 action = spawn (lib.getExe pkgs.playerctl) "-a" "pause";
776 allow-when-locked = true;
777 };
778
779 "XF86MonBrightnessUp" = {
780 action = spawn swayosd-client "--brightness" "raise";
781 allow-when-locked = true;
782 };
783 "XF86MonBrightnessDown" = {
784 action = spawn swayosd-client "--brightness" "lower";
785 allow-when-locked = true;
786 };
787 "XF86AudioRaiseVolume" = {
788 action = spawn swayosd-client "--output-volume" "raise";
789 allow-when-locked = true;
790 };
791 "XF86AudioLowerVolume" = {
792 action = spawn swayosd-client "--output-volume" "lower";
793 allow-when-locked = true;
794 };
795 "XF86AudioMute" = {
796 action = spawn swayosd-client "--output-volume" "mute-toggle";
797 allow-when-locked = true;
798 };
799 "XF86AudioMicMute" = {
800 action = spawn swayosd-client "--input-volume" "mute-toggle";
801 allow-when-locked = true;
802 };
803
804 "Mod+Semicolon".action = spawn makoctl "dismiss" "--group";
805 "Mod+Shift+Semicolon".action = spawn makoctl "dismiss" "--all";
806 "Mod+Period".action = spawn makoctl "menu" (lib.getExe config.programs.fuzzel.package) "--dmenu";
807 "Mod+Comma".action = spawn makoctl "restore";
808 }))
809 (map ({ name, selector, spawn, key, ...}: if key != null && selector != null && spawn != null then bind key { action = focus-or-spawn-action selector name spawn; } else null) cfg.scratchspaces)
810 ]
811 ))
359 ]; 812 ];
360
361 always-center-single-column = true;
362 };
363
364 cursor.hide-when-typing = true;
365
366 input = {
367 touchpad.enable = false;
368 trackball = {
369 scroll-method = "on-button-down";
370 scroll-button = 278;
371 };
372 };
373
374 workspaces = {
375 "001" = { name = "pwctl"; open-on-output = "eDP-1"; };
376 "002" = { name = "kpxc"; open-on-output = "eDP-1"; };
377 "003" = { name = "bmgr"; open-on-output = "eDP-1"; };
378 "004" = { name = "term"; open-on-output = "eDP-1"; };
379 "005" = { name = "edit"; open-on-output = "eDP-1"; };
380 "006" = { name = "eff"; open-on-output = "eDP-1"; };
381 "101".name = "comm";
382 "102".name = "web";
383 # "104".name = "read";
384 # "105".name = "mon";
385 "110".name = "vid";
386 "120".name = "bmr";
387 };
388
389 window-rules = [
390 {
391 matches = [ { is-floating = true; } ];
392 geometry-corner-radius =
393 let
394 allCorners = r: { bottom-left = r; bottom-right = r; top-left = r; top-right = r; };
395 in allCorners 8.;
396 clip-to-geometry = true;
397 }
398 {
399 matches = [ { app-id = "^com\.saivert\.pwvucontrol$"; } ];
400 open-on-workspace = "pwctl";
401 open-maximized = true;
402 }
403 {
404 matches = [ { app-id = "^com\.github\.wwmm\.easyeffects$"; } ];
405 open-on-workspace = "eff";
406 open-maximized = true;
407 }
408 {
409 matches = [ { app-id = "^\.blueman-manager-wrapped$"; } ];
410 open-on-workspace = "bmgr";
411 open-maximized = true;
412 }
413 {
414 matches = [ { app-id = "^org\.keepassxc\.KeePassXC$"; } ];
415 block-out-from = "screencast";
416 }
417 {
418 matches = [ { app-id = "^org\.keepassxc\.KeePassXC$"; } ];
419 excludes = [
420 { title = "^Unlock Database.*"; }
421 { title = "^Access Request.*"; }
422 { title = ".*Passkey credentials$"; }
423 ];
424 open-on-workspace = "kpxc";
425 open-maximized = true;
426 open-focused = false;
427 }
428 {
429 matches = [
430 { app-id = "^org\.keepassxc\.KeePassXC$"; title = "^Unlock Database.*"; }
431 { app-id = "^org\.keepassxc\.KeePassXC$"; title = "^Access Request.*"; }
432 { app-id = "^org\.keepassxc\.KeePassXC$"; title = ".*Passkey credentials$"; }
433 ];
434 open-focused = true;
435 open-floating = true;
436 }
437 {
438 matches = [ { app-id = "^kitty-scratch$"; } ];
439 open-on-workspace = "term";
440 open-maximized = true;
441 }
442 {
443 matches = [ { title = "^scratch$"; app-id = "^emacs$"; } ];
444 open-on-workspace = "edit";
445 open-maximized = true;
446 }
447 {
448 matches = [
449 { app-id = "^emacs$"; }
450 { app-id = "^firefox$"; }
451 ];
452 default-column-width.proportion = 2. / 3.;
453 }
454 {
455 matches = [
456 { app-id = "^kitty$"; }
457 { app-id = "^kitty-play$"; }
458 ];
459 default-column-width.proportion = 1. / 3.;
460 }
461 {
462 matches = [
463 { app-id = "^thunderbird$"; }
464 { app-id = "^Element$"; }
465 { app-id = "^Rainbow$"; }
466 ];
467 open-on-workspace = "comm";
468 }
469 {
470 matches = [ { app-id = "^firefox$"; } ];
471 open-on-workspace = "web";
472 open-maximized = true;
473 variable-refresh-rate = true;
474 }
475 # {
476 # matches = [
477 # { app-id = "^evince$"; }
478 # { app-id = "^imv$"; }
479 # { app-id = "^org\.pwmt\.zathura$"; }
480 # ];
481 # open-on-workspace = "read";
482 # }
483 {
484 matches = [ { app-id = "^mpv$"; } ];
485 open-on-workspace = "vid";
486 default-column-width.proportion = 1.;
487 variable-refresh-rate = true;
488 }
489 {
490 matches = [ { app-id = "^kitty-play$"; } ];
491 open-on-workspace = "vid";
492 open-focused = false;
493 }
494 # {
495 # matches = [
496 # { app-id = "^qemu$"; }
497 # { app-id = "^virt-manager$"; }
498 # ];
499 # open-on-workspace = "mon";
500 # }
501 {
502 matches = [ { app-id = "^pdfpc$"; } ];
503 default-column-width.proportion = 1.;
504 }
505 {
506 matches = [ { app-id = "^pdfpc$"; title = "^pdfpc - presentation"; } ];
507 open-on-workspace = "bmr";
508 open-fullscreen = true;
509 }
510 {
511 matches = [
512 { app-id = "^Gimp-"; title = "^Quit GIMP$"; }
513 { app-id = "^org\.kde\.polkit-kde-authentication-agent-1$"; }
514 { app-id = "^xdg-desktop-portal-gtk$"; }
515 ];
516 open-floating = true;
517 }
518 ];
519 layer-rules = [
520 { matches = [
521 { namespace = "^notifications$"; }
522 { namespace = "^waybar$"; }
523 ];
524 block-out-from = "screencast";
525 }
526 ];
527
528 binds = with config.lib.niri.actions; {
529 "Mod+Slash".action = show-hotkey-overlay;
530
531 "Mod+Return".action = spawn terminal;
532 "Mod+Q".action = close-window;
533 "Mod+O".action = spawn (lib.getExe config.programs.fuzzel.package);
534 "Mod+Shift+O".action = spawn (lib.getExe config.programs.fuzzel.package) "--list-executables-in-path";
535
536 "Mod+Alt+E".action = spawn (lib.getExe' config.services.emacs.package "emacsclient") "-c";
537 "Mod+Alt+Y".action = spawn (lib.getExe (pkgs.writeShellApplication {
538 name = "queue-yt-dlp";
539 runtimeInputs = with pkgs; [ wl-clipboard-rs socat ];
540 text = ''
541 socat STDIO UNIX-CONNECT:"$XDG_RUNTIME_DIR"/yt-dlp.sock <<<$'{ "urls": ["'"$(wl-paste)"$'"] }'
542 '';
543 }));
544 "Mod+Alt+L".action = spawn (lib.getExe (pkgs.writeShellApplication {
545 name = "queue-yt-dlp";
546 runtimeInputs = with pkgs; [ wl-clipboard-rs config.programs.kitty.package ];
547 text = ''
548 exec -- kitty --app-id kitty-play --directory "$HOME"/media mpv "$(wl-paste)"
549 '';
550 }));
551
552 "Mod+U".action = spawn (lib.getExe (pkgs.writeShellApplication {
553 name = "qalc-fuzzel";
554 runtimeInputs = with pkgs; [ wl-clipboard-rs libqalculate config.programs.fuzzel.package coreutils findutils libnotify gnugrep ];
555 text = ''
556 RESULTS_DIR="$HOME/.cache/qalc-fuzzel"
557 prev() {
558 FOUND=false
559 while IFS= read -r line; do
560 [[ -n "$line" ]] || continue
561 FOUND=true
562 echo "$line"
563 done < <(export LC_ALL=C.UTF-8; echo; find "$RESULTS_DIR" -type f -printf $'%T@ %p\n' | sort -n | cut -d' ' -f2- | xargs -r cat)
564 $FOUND || echo
565 }
566 FUZZEL_RES=$(prev | fuzzel --dmenu --prompt "qalc> ") || exit $?
567 if [[ "$FUZZEL_RES" =~ .*\ =\ .* ]]; then
568 QALC_RES="$FUZZEL_RES"
569 QALC_RET=0
570 else
571 QALC_RES=$(qalc "$FUZZEL_RES" 2>&1)
572 QALC_RET=$?
573 fi
574 [[ -n "$QALC_RES" ]] || exit 1
575 EXISTING=false
576 set +o pipefail
577 grep -Fxrl "$QALC_RES" "$RESULTS_DIR" | xargs -r touch
578 [[ ''${PIPESTATUS[0]} -eq 0 ]] && EXISTING=true
579 set -o pipefail
580 if [[ $QALC_RET -eq 0 ]] && ! $EXISTING; then
581 set +o pipefail
582 RES_FILE="$RESULTS_DIR"/$(date -uIs).$(tr -Cd 'a-zA-Z0-9' </dev/random | head -c 10)
583 set -o pipefail
584 cat >"$RES_FILE" <<<"$QALC_RES"
585 fi
586 [[ "$QALC_RES" =~ .*\ =\ (.*) ]] && QALC_RES="''${BASH_REMATCH[1]}"
587 [[ $QALC_RET -eq 0 ]] && wl-copy "$QALC_RES"
588 notify-send "$QALC_RES"
589 '';
590 }));
591 "Mod+E".action = spawn (lib.getExe (pkgs.writeShellApplication {
592 name = "emoji-fuzzel";
593 runtimeInputs = with pkgs; [ config.programs.fuzzel.package wtype wl-clipboard-rs ];
594 text = ''
595 FUZZEL_RES=$(fuzzel --dmenu --prompt "emoji> " <"$HOME"/.local/share/emoji-data/list.txt) || exit $?
596 [[ -n "$FUZZEL_RES" ]] || exit 1
597 wl-copy "$(cut -d ':' -f 1 <<<"$FUZZEL_RES" | tr -d '\n')" && wtype -k XF86Paste
598 '';
599 }));
600 "Print".action = spawn (lib.getExe (pkgs.writeShellApplication {
601 name = "screenshot";
602 runtimeInputs = with pkgs; [ grim slurp wl-clipboard-rs coreutils ];
603 text = ''
604 grim -g "$(slurp -b 00000080 -c FFFFFFFF -s 00000000 -w 1)" - \
605 | tee "$HOME/screenshots/$(date +"%Y-%m-%dT%H:%M:%S").png" \
606 | wl-copy --type image/png
607 '';
608 }));
609 "Shift+Print".action = spawn (lib.getExe (pkgs.writeShellApplication {
610 name = "screenshot";
611 runtimeInputs = with pkgs; [ grim niri gojq wl-clipboard-rs coreutils ];
612 text = ''
613 grim -o "$(niri msg -j workspaces | jq -r '.[] | select(.is_focused) | .output')" - \
614 | tee "$HOME/screenshots/$(date +"%Y-%m-%dT%H:%M:%S").png" \
615 | wl-copy --type image/png
616 '';
617 }));
618 "Mod+B".action = with-select-window-action ".workspace_id == ($active_workspace | tonumber)" "{\"Action\":{\"FocusWindow\":{\"id\": .id}}}";
619 "Mod+Shift+B".action = with-select-window-action "true" "{\"Action\":{\"FocusWindow\":{\"id\": .id}}}";
620
621 "Mod+H".action = focus-column-left;
622 "Mod+T".action = focus-window-down;
623 "Mod+N".action = focus-window-up;
624 "Mod+S".action = focus-column-right;
625
626 "Mod+Shift+H".action = move-column-left;
627 "Mod+Shift+T".action = move-window-down;
628 "Mod+Shift+N".action = move-window-up;
629 "Mod+Shift+S".action = move-column-right;
630
631 "Mod+Control+H".action = focus-monitor-left;
632 "Mod+Control+T".action = focus-monitor-down;
633 "Mod+Control+N".action = focus-monitor-up;
634 "Mod+Control+S".action = focus-monitor-right;
635
636 "Mod+Shift+Control+H".action = move-workspace-to-monitor-left;
637 "Mod+Shift+Control+T".action = move-workspace-to-monitor-down;
638 "Mod+Shift+Control+N".action = move-workspace-to-monitor-up;
639 "Mod+Shift+Control+S".action = move-workspace-to-monitor-right;
640
641 "Mod+G".action = focus-adjacent-workspace "down";
642 "Mod+C".action = focus-adjacent-workspace "up";
643
644 "Mod+Shift+G".action = move-column-to-adjacent-workspace "down";
645 "Mod+Shift+C".action = move-column-to-adjacent-workspace "up";
646
647 "Mod+Shift+Control+G".action = move-workspace-down;
648 "Mod+Shift+Control+C".action = move-workspace-up;
649
650 "Mod+ParenLeft".action = focus-workspace "comm";
651 "Mod+Shift+ParenLeft".action = move-column-to-workspace "comm";
652
653 "Mod+ParenRight".action = focus-workspace "web";
654 "Mod+Shift+ParenRight".action = move-column-to-workspace "web";
655
656 "Mod+BraceRight".action = focus-workspace "read";
657 "Mod+Shift+BraceRight".action = move-column-to-workspace "read";
658
659 "Mod+BraceLeft".action = focus-workspace "mon";
660 "Mod+Shift+BraceLeft".action = move-column-to-workspace "mon";
661
662 "Mod+Asterisk".action = focus-workspace "vid";
663 "Mod+Shift+Asterisk".action = move-column-to-workspace "vid";
664
665 "Mod+Plus".action = with-unnamed-workspace-action ''{"Action":{"FocusWorkspace":{"reference":{"Id": .id}}}}'';
666 "Mod+Shift+Plus".action = with-unnamed-workspace-action ''{"Action":{"MoveColumnToWorkspace":{"reference":{"Id": .id}}}}'';
667
668 "Mod+M".action = consume-or-expel-window-left;
669 "Mod+W".action = consume-or-expel-window-right;
670
671 "Mod+R".action = switch-preset-column-width;
672 "Mod+Shift+R".action = switch-preset-window-height;
673 "Mod+F".action = center-column;
674 "Mod+Shift+F".action = maximize-column;
675 "Mod+Shift+Ctrl+F".action = fullscreen-window;
676
677 "Mod+V".action = switch-focus-between-floating-and-tiling;
678 "Mod+Shift+V".action = toggle-window-floating;
679
680 "Mod+Left".action = set-column-width "-10%";
681 "Mod+Down".action = set-window-height "-10%";
682 "Mod+Up".action = set-window-height "+10%";
683 "Mod+Right".action = set-column-width "+10%";
684
685 "Mod+Shift+Z" = {
686 action = spawn (lib.getExe niri) "msg" "action" "power-off-monitors";
687 allow-when-locked = true;
688 };
689 "Mod+Shift+L".action = spawn loginctl "lock-session";
690 "Mod+Shift+E".action = quit;
691 "Mod+Shift+Minus" = {
692 action = spawn systemctl "suspend";
693 allow-when-locked = true;
694 };
695 "Mod+Shift+Control+Minus" = {
696 action = spawn systemctl "hibernate";
697 allow-when-locked = true;
698 };
699 "Mod+Shift+P" = {
700 action = spawn (lib.getExe pkgs.playerctl) "-a" "pause";
701 allow-when-locked = true;
702 };
703
704 "XF86MonBrightnessUp" = {
705 action = spawn swayosd-client "--brightness" "raise";
706 allow-when-locked = true;
707 };
708 "XF86MonBrightnessDown" = {
709 action = spawn swayosd-client "--brightness" "lower";
710 allow-when-locked = true;
711 };
712 "XF86AudioRaiseVolume" = {
713 action = spawn swayosd-client "--output-volume" "raise";
714 allow-when-locked = true;
715 };
716 "XF86AudioLowerVolume" = {
717 action = spawn swayosd-client "--output-volume" "lower";
718 allow-when-locked = true;
719 };
720 "XF86AudioMute" = {
721 action = spawn swayosd-client "--output-volume" "mute-toggle";
722 allow-when-locked = true;
723 };
724 "XF86AudioMicMute" = {
725 action = spawn swayosd-client "--input-volume" "mute-toggle";
726 allow-when-locked = true;
727 };
728
729 "Mod+Semicolon".action = spawn makoctl "dismiss" "--group";
730 "Mod+Shift+Semicolon".action = spawn makoctl "dismiss" "--all";
731 "Mod+Period".action = spawn makoctl "menu" (lib.getExe config.programs.fuzzel.package) "--dmenu";
732 "Mod+Comma".action = spawn makoctl "restore";
733
734 "Mod+Control+A".action = focus-or-spawn-action-app_id "com.saivert.pwvucontrol" "pwctl" "pwvucontrol";
735 "Mod+Control+O".action = focus-or-spawn-action-app_id "com.github.wwmm.easyeffects" "eff" "easyeffects";
736 "Mod+Control+P".action = focus-or-spawn-action-app_id "org.keepassxc.KeePassXC" "kpxc" "keepassxc";
737 "Mod+Control+B".action = focus-or-spawn-action-app_id ".blueman-manager-wrapped" "bmgr" "blueman-manager";
738 "Mod+Control+Return".action = focus-or-spawn-action-app_id "kitty-scratch" "term" "kitty" "--app-id" "kitty-scratch";
739 "Mod+Control+E".action = focus-or-spawn-action "select(.app_id == \"emacs\" and .title == \"scratch\")" "edit" "emacsclient" "-c" "--frame-parameters=(quote (name . \"scratch\"))";
740 };
741 };
742 }; 813 };
743} 814}
diff --git a/accounts/gkleen@sif/niri/waybar.nix b/accounts/gkleen@sif/niri/waybar.nix
index 3f1f8119..bae818f6 100644
--- a/accounts/gkleen@sif/niri/waybar.nix
+++ b/accounts/gkleen@sif/niri/waybar.nix
@@ -131,7 +131,7 @@ in {
131 return-type = "json"; 131 return-type = "json";
132 }; 132 };
133 "niri/workspaces" = { 133 "niri/workspaces" = {
134 ignore = ["eff" "pwctl" "kpxc" "bmgr" "edit" "term"]; 134 ignore = map ({ name, ... }: name) config.programs.niri.scratchspaces;
135 }; 135 };
136 "niri/window" = { 136 "niri/window" = {
137 separate-outputs = true; 137 separate-outputs = true;
@@ -217,7 +217,7 @@ in {
217 modules-right = [ "clock" ]; 217 modules-right = [ "clock" ];
218 218
219 "niri/workspaces" = { 219 "niri/workspaces" = {
220 ignore = ["pwctl" "kpxc" "bmgr" "edit" "term"]; 220 ignore = map ({ name, ... }: name) config.programs.niri.scratchspaces;
221 }; 221 };
222 "niri/window" = { 222 "niri/window" = {
223 separate-outputs = true; 223 separate-outputs = true;
diff --git a/flake.lock b/flake.lock
index 876ebecf..0889ba37 100644
--- a/flake.lock
+++ b/flake.lock
@@ -322,11 +322,11 @@
322 ] 322 ]
323 }, 323 },
324 "locked": { 324 "locked": {
325 "lastModified": 1737831749, 325 "lastModified": 1738691953,
326 "narHash": "sha256-La1xZYZ1yHvT4h5MNl5WC2wxBi2P4vozce2n7V/9+2w=", 326 "narHash": "sha256-JY/w2Xyrj3mhUhLJkSgk8t7MSf3LGZjewPTQ7QtCbHE=",
327 "owner": "gkleen", 327 "owner": "gkleen",
328 "repo": "home-manager", 328 "repo": "home-manager",
329 "rev": "8b16ee252e38acc29ba634ab60672a051ebc9f59", 329 "rev": "c077fc8684289ab1b1c2231bab1566879e099c97",
330 "type": "github" 330 "type": "github"
331 }, 331 },
332 "original": { 332 "original": {
@@ -397,11 +397,11 @@
397 "xwayland-satellite-unstable": "xwayland-satellite-unstable" 397 "xwayland-satellite-unstable": "xwayland-satellite-unstable"
398 }, 398 },
399 "locked": { 399 "locked": {
400 "lastModified": 1737961005, 400 "lastModified": 1738770770,
401 "narHash": "sha256-b4hqJNgyx8lnngz7NFcJ1W+59xQnMQYF0EK5g0IOy7c=", 401 "narHash": "sha256-nfapp7C4BbdvHTRA1HSRVYjD5Fk2FCKoyxQLzcL5X50=",
402 "owner": "sodiboo", 402 "owner": "sodiboo",
403 "repo": "niri-flake", 403 "repo": "niri-flake",
404 "rev": "e98ae62893568dd31e7a7e4e75e1dbbf23f759a0", 404 "rev": "83abbde7c8164ee4b42a8647e4e61015c3f45816",
405 "type": "github" 405 "type": "github"
406 }, 406 },
407 "original": { 407 "original": {
@@ -431,15 +431,15 @@
431 "niri-unstable": { 431 "niri-unstable": {
432 "flake": false, 432 "flake": false,
433 "locked": { 433 "locked": {
434 "lastModified": 1737795105, 434 "lastModified": 1738765557,
435 "narHash": "sha256-OsrjQ8O9t9NjDCwfG/EY8MT+K3lb+A5U6SZZ+4PyKzk=", 435 "narHash": "sha256-Ea/iYsAq0qpBWybbvfJKIvd1On9HhGkBE3oNyJGslUs=",
436 "owner": "gkleen", 436 "owner": "yalter",
437 "repo": "niri", 437 "repo": "niri",
438 "rev": "78697d1cea20e6b53013e820999b0403c45d9f00", 438 "rev": "f4e9732a6b940368af9985b238cc12698b4e38a9",
439 "type": "github" 439 "type": "github"
440 }, 440 },
441 "original": { 441 "original": {
442 "owner": "gkleen", 442 "owner": "YaLTeR",
443 "repo": "niri", 443 "repo": "niri",
444 "type": "github" 444 "type": "github"
445 } 445 }
@@ -472,11 +472,11 @@
472 ] 472 ]
473 }, 473 },
474 "locked": { 474 "locked": {
475 "lastModified": 1737861961, 475 "lastModified": 1738466368,
476 "narHash": "sha256-LIRtMvAwLGb8pBoamzgEF67oKlNPz4LuXiRPVZf+TpE=", 476 "narHash": "sha256-PZhUjtvQZOH3PO0EYdTpQvcqkgkq1NkP2A6w9SPHYsk=",
477 "owner": "Mic92", 477 "owner": "Mic92",
478 "repo": "nix-index-database", 478 "repo": "nix-index-database",
479 "rev": "79b7b8eae3243fc5aa9aad34ba6b9bbb2266f523", 479 "rev": "46a8f5fc9552b776bfc5c5c96ea3bede33f68f52",
480 "type": "github" 480 "type": "github"
481 }, 481 },
482 "original": { 482 "original": {
@@ -508,11 +508,11 @@
508 }, 508 },
509 "nixos-hardware": { 509 "nixos-hardware": {
510 "locked": { 510 "locked": {
511 "lastModified": 1737751639, 511 "lastModified": 1738638143,
512 "narHash": "sha256-ZEbOJ9iT72iwqXsiEMbEa8wWjyFvRA9Ugx8utmYbpz4=", 512 "narHash": "sha256-ZYMe4c4OCtIUBn5hx15PEGr0+B1cNEpl2dsaLxwY2W0=",
513 "owner": "NixOS", 513 "owner": "NixOS",
514 "repo": "nixos-hardware", 514 "repo": "nixos-hardware",
515 "rev": "dfad538f751a5aa5d4436d9781ab27a6128ec9d4", 515 "rev": "9bdd53f5908453e4d03f395eb1615c3e9a351f70",
516 "type": "github" 516 "type": "github"
517 }, 517 },
518 "original": { 518 "original": {
@@ -630,11 +630,11 @@
630 }, 630 },
631 "nixpkgs-stable_2": { 631 "nixpkgs-stable_2": {
632 "locked": { 632 "locked": {
633 "lastModified": 1737885640, 633 "lastModified": 1738702386,
634 "narHash": "sha256-GFzPxJzTd1rPIVD4IW+GwJlyGwBDV1Tj5FLYwDQQ9sM=", 634 "narHash": "sha256-nJj8f78AYAxl/zqLiFGXn5Im1qjFKU8yBPKoWEeZN5M=",
635 "owner": "NixOS", 635 "owner": "NixOS",
636 "repo": "nixpkgs", 636 "repo": "nixpkgs",
637 "rev": "4e96537f163fad24ed9eb317798a79afc85b51b7", 637 "rev": "030ba1976b7c0e1a67d9716b17308ccdab5b381e",
638 "type": "github" 638 "type": "github"
639 }, 639 },
640 "original": { 640 "original": {
@@ -678,11 +678,11 @@
678 }, 678 },
679 "nixpkgs_2": { 679 "nixpkgs_2": {
680 "locked": { 680 "locked": {
681 "lastModified": 1737885589, 681 "lastModified": 1738680400,
682 "narHash": "sha256-Zf0hSrtzaM1DEz8//+Xs51k/wdSajticVrATqDrfQjg=", 682 "narHash": "sha256-ooLh+XW8jfa+91F1nhf9OF7qhuA/y1ChLx6lXDNeY5U=",
683 "owner": "NixOS", 683 "owner": "NixOS",
684 "repo": "nixpkgs", 684 "repo": "nixpkgs",
685 "rev": "852ff1d9e153d8875a83602e03fdef8a63f0ecf8", 685 "rev": "799ba5bffed04ced7067a91798353d360788b30d",
686 "type": "github" 686 "type": "github"
687 }, 687 },
688 "original": { 688 "original": {
@@ -748,11 +748,11 @@
748 "treefmt-nix": "treefmt-nix" 748 "treefmt-nix": "treefmt-nix"
749 }, 749 },
750 "locked": { 750 "locked": {
751 "lastModified": 1736884309, 751 "lastModified": 1738741221,
752 "narHash": "sha256-eiCqmKl0BIRiYk5/ZhZozwn4/7Km9CWTbc15Cv+VX5k=", 752 "narHash": "sha256-UiTOA89yQV5YNlO1ZAp4IqJUGWOnTyBC83netvt8rQE=",
753 "owner": "nix-community", 753 "owner": "nix-community",
754 "repo": "poetry2nix", 754 "repo": "poetry2nix",
755 "rev": "75d0515332b7ca269f6d7abfd2c44c47a7cbca7b", 755 "rev": "be1fe795035d3d36359ca9135b26dcc5321b31fb",
756 "type": "github" 756 "type": "github"
757 }, 757 },
758 "original": { 758 "original": {
@@ -891,11 +891,11 @@
891 ] 891 ]
892 }, 892 },
893 "locked": { 893 "locked": {
894 "lastModified": 1737411508, 894 "lastModified": 1738291974,
895 "narHash": "sha256-j9IdflJwRtqo9WpM0OfAZml47eBblUHGNQTe62OUqTw=", 895 "narHash": "sha256-wkwYJc8cKmmQWUloyS9KwttBnja2ONRuJQDEsmef320=",
896 "owner": "Mic92", 896 "owner": "Mic92",
897 "repo": "sops-nix", 897 "repo": "sops-nix",
898 "rev": "015d461c16678fc02a2f405eb453abb509d4e1d4", 898 "rev": "4c1251904d8a08c86ac6bc0d72cc09975e89aef7",
899 "type": "github" 899 "type": "github"
900 }, 900 },
901 "original": { 901 "original": {
diff --git a/flake.nix b/flake.nix
index 5cc1e298..4e119e98 100644
--- a/flake.nix
+++ b/flake.nix
@@ -191,7 +191,7 @@
191 ref = "main"; 191 ref = "main";
192 inputs = { 192 inputs = {
193 nixpkgs.follows = "nixpkgs"; 193 nixpkgs.follows = "nixpkgs";
194 niri-unstable.url = "github:gkleen/niri"; 194 # niri-unstable.url = "github:gkleen/niri";
195 }; 195 };
196 }; 196 };
197 }; 197 };
diff --git a/hosts/sif/default.nix b/hosts/sif/default.nix
index 32651e14..2a3a6be9 100644
--- a/hosts/sif/default.nix
+++ b/hosts/sif/default.nix
@@ -477,10 +477,10 @@ in {
477 systemd.tmpfiles.settings = { 477 systemd.tmpfiles.settings = {
478 "10-localtime"."/etc/localtime".L.argument = "/.bcachefs/etc/localtime"; 478 "10-localtime"."/etc/localtime".L.argument = "/.bcachefs/etc/localtime";
479 479
480 "10-regreet"."/var/cache/regreet/cache.toml".C.argument = toString ((pkgs.formats.toml {}).generate "cache.toml" { 480 # "10-regreet"."/var/cache/regreet/cache.toml".C.argument = toString ((pkgs.formats.toml {}).generate "cache.toml" {
481 last_user = "gkleen"; 481 # last_user = "gkleen";
482 user_to_last_sess.gkleen = "niri"; 482 # user_to_last_sess.gkleen = "Niri";
483 }); 483 # });
484 }; 484 };
485 485
486 users = { 486 users = {
diff --git a/hosts/sif/greetd/default.nix b/hosts/sif/greetd/default.nix
index f609fc05..37ca13c5 100644
--- a/hosts/sif/greetd/default.nix
+++ b/hosts/sif/greetd/default.nix
@@ -11,6 +11,11 @@
11 # exec ${pkgs.dbus}/bin/dbus-run-session ${lib.getExe pkgs.cage} ${lib.escapeShellArgs cfg.cageArgs} -- ${lib.getExe cfg.package} 11 # exec ${pkgs.dbus}/bin/dbus-run-session ${lib.getExe pkgs.cage} ${lib.escapeShellArgs cfg.cageArgs} -- ${lib.getExe cfg.package}
12 # ''; 12 # '';
13 }; 13 };
14 systemd.services.greetd.environment = {
15 XKB_DEFAULT_LAYOUT = "us,us";
16 XKB_DEFAULT_VARIANT = "dvp,";
17 XKB_DEFAULT_OPTIONS = "compose:caps,grp:win_space_toggle";
18 };
14 programs.regreet = { 19 programs.regreet = {
15 enable = true; 20 enable = true;
16 theme = { 21 theme = {