From 694dd794f79c35932adfc8f51dd875f4f64cd5f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20Schwarz=C3=A4ugl?= Date: Thu, 5 Feb 2026 20:00:07 +0100 Subject: [PATCH] feat: switch to niri+noctalia --- SwarselSystems.org | 3683 +++++++++++------- files/scripts/niri-resize.sh | 11 + files/scripts/swarselcheck-niri.sh | 36 - files/zellij/config-kittyterm.kdl | 565 +++ files/zellij/config.kdl.nix | 341 -- flake.lock | 27 +- flake.nix | 4 + hosts/nixos/x86_64-linux/pyramid/default.nix | 3 +- modules/home/common/anki-tray.nix | 8 +- modules/home/common/autotiling.nix | 2 +- modules/home/common/custom-packages.nix | 1 + modules/home/common/element-tray.nix | 8 +- modules/home/common/firezone-tray.nix | 10 +- modules/home/common/gammastep.nix | 1 + modules/home/common/kanshi.nix | 4 +- modules/home/common/obsidian-tray.nix | 8 +- modules/home/common/sway.nix | 1 + modules/home/common/swayidle.nix | 12 +- modules/home/common/swayosd.nix | 3 +- modules/home/common/vesktop-tray.nix | 8 +- modules/home/common/waybar.nix | 4 +- modules/home/common/zellij.nix | 4 +- modules/home/optional/niri.nix | 414 +- modules/home/optional/noctalia.nix | 605 +++ modules/home/optional/work.nix | 18 +- modules/nixos/client/lowbattery.nix | 32 +- modules/nixos/client/uwsm.nix | 2 +- modules/nixos/client/xdg-portal.nix | 24 +- modules/nixos/optional/niri.nix | 45 +- modules/nixos/optional/noctalia.nix | 17 + modules/nixos/server/firefly-iii.nix | 12 +- modules/nixos/server/freshrss.nix | 12 +- modules/shared/config-lib.nix | 13 + nix/overlays.nix | 1 + pkgs/flake/git-replace/default.nix | 2 +- pkgs/flake/niri-resize/default.nix | 6 + pkgs/flake/swarselcheck-niri/default.nix | 35 +- secrets/repo/pii.nix.enc | 6 +- 38 files changed, 3922 insertions(+), 2066 deletions(-) create mode 100644 files/scripts/niri-resize.sh delete mode 100644 files/scripts/swarselcheck-niri.sh create mode 100644 files/zellij/config-kittyterm.kdl delete mode 100644 files/zellij/config.kdl.nix create mode 100644 modules/home/optional/noctalia.nix create mode 100644 modules/nixos/optional/noctalia.nix create mode 100644 pkgs/flake/niri-resize/default.nix diff --git a/SwarselSystems.org b/SwarselSystems.org index 4b09d47..a18c4a9 100644 --- a/SwarselSystems.org +++ b/SwarselSystems.org @@ -1696,6 +1696,8 @@ A short overview over each input and what it does: This flake introduces a module that allows for more structurized nftables config. - [[#h:c88d569e-70c4-4dd6-a959-be649fdeaa71][topologyPrivate]] This input per default provides a simple output =topologyPrivate = false;=. This is the value that is normally used in the config. When I export my setup to a topology diagram, there are some public IPs and domains that I want to obfuscate. When doing that, I can then override this input. +- [[https://github.com/noctalia-dev/noctalia-shell][noctalia]] + A flake that provides options for the desktop shell =noctalia-shell=. #+begin_src nix :noweb yes :tangle flake.nix { @@ -1758,6 +1760,10 @@ A short overview over each input and what it does: url = "github:nix-community/emacs-overlay"; # inputs.nixpkgs.follows = "nixpkgs"; }; + noctalia = { + url = "github:noctalia-dev/noctalia-shell"; + inputs.nixpkgs.follows = "nixpkgs"; + }; topologyPrivate.url = "./files/topology/public"; @@ -3237,6 +3243,7 @@ On the structure of overlays: as you notice, all of the attributes within overla (additions final prev) // (nixpkgs-stable-versions final prev) // (inputs.niri-flake.overlays.niri final prev) + // (inputs.noctalia.overlays.default final prev) // (inputs.vbc-nix.overlays.default final prev) // (inputs.nur.overlays.default final prev) // (inputs.emacs-overlay.overlay final prev) @@ -3691,7 +3698,8 @@ My work machine. Built for more security, this is the gold standard of my config "${self}/modules/nixos/optional/nswitch-rcm.nix" "${self}/modules/nixos/optional/virtualbox.nix" "${self}/modules/nixos/optional/work.nix" - + "${self}/modules/nixos/optional/niri.nix" + "${self}/modules/nixos/optional/noctalia.nix" ]; topology.self = { @@ -10860,23 +10868,23 @@ This is used to better integrate Sway into the system on NixOS hosts. On the hom This allows me to use screen sharing on Wayland. The implementation is a bit crude and only the whole screen can be shared. However, most of the time that is all I need to do anyways. #+begin_src nix-ts :tangle modules/nixos/client/xdg-portal.nix - { lib, config, pkgs, ... }: + { lib, config, ... }: { options.swarselmodules.xdg-portal = lib.mkEnableOption "xdg portal config"; config = lib.mkIf config.swarselmodules.xdg-portal { xdg.portal = { enable = true; - config = { - common = { - default = "wlr"; - }; - }; - wlr.enable = true; - wlr.settings.screencast = { - output_name = "eDP-1"; - chooser_type = "simple"; - chooser_cmd = "${pkgs.slurp}/bin/slurp -f %o -or"; - }; + # config = { + # common = { + # default = "wlr"; + # }; + # }; + # wlr.enable = true; + # wlr.settings.screencast = { + # output_name = "eDP-1"; + # chooser_type = "simple"; + # chooser_cmd = "${pkgs.slurp}/bin/slurp -f %o -or"; + # }; }; }; } @@ -10983,35 +10991,37 @@ This turns off the display when the lid is closed. Since I hide the waybar completely during normal operation, I run the risk of not noticing when my battery is about to run out. This module sends a notification when the battery level falls below 10%. Written by [[https://gist.github.com/cafkafk][cafkafk]]. #+begin_src nix-ts :tangle modules/nixos/client/lowbattery.nix - { pkgs, lib, config, ... }: - { - options.swarselmodules.lowBattery = lib.mkEnableOption "low battery notification config"; - config = lib.mkIf config.swarselmodules.lowBattery { - systemd.user.services."battery-low" = { - enable = true; - description = "Timer for battery check that alerts at 10% or less"; - partOf = [ "graphical-session.target" ]; - wantedBy = [ "graphical-session.target" ]; - serviceConfig = { - Type = "simple"; - ExecStart = pkgs.writeShellScript "battery-low-notification" - '' - if (( 10 >= $(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%" | ${lib.getExe pkgs.ripgrep} -o "\d+") && $(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%" | ${lib.getExe pkgs.ripgrep} -o "\d+") > 0 )); - then ${lib.getExe pkgs.libnotify} --urgency=critical "low battery" "$(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%")"; - fi; - ''; - }; - }; - systemd.user.timers."battery-low" = { - wantedBy = [ "timers.target" ]; - timerConfig = { - # Every Minute - OnCalendar = "*-*-* *:*:00"; - Unit = "battery-low.service"; - }; - }; - }; - } + { pkgs, lib, config, ... }: + { + options.swarselmodules.lowBattery = lib.mkEnableOption "low battery notification config"; + config = lib.mkIf config.swarselmodules.lowBattery { + systemd.user.services."battery-low" = let + target = "sway-session.target"; + in { + enable = true; + description = "Timer for battery check that alerts at 10% or less"; + partOf = [ target ]; + wantedBy = [ target ]; + serviceConfig = { + Type = "simple"; + ExecStart = pkgs.writeShellScript "battery-low-notification" + '' + if (( 10 >= $(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%" | ${lib.getExe pkgs.ripgrep} -o "\d+") && $(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%" | ${lib.getExe pkgs.ripgrep} -o "\d+") > 0 )); + then ${lib.getExe pkgs.libnotify} --urgency=critical "low battery" "$(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%")"; + fi; + ''; + }; + }; + systemd.user.timers."battery-low" = { + wantedBy = [ "timers.target" ]; + timerConfig = { + # Every Minute + OnCalendar = "*-*-* *:*:00"; + Unit = "battery-low.service"; + }; + }; + }; + } #+end_src **** Auto-login @@ -11061,7 +11071,7 @@ Auto login for the initial session. comment = "Sway compositor managed by UWSM"; binPath = "/run/current-system/sw/bin/sway"; }; - niri = lib.mkIf (config.swarselmodules ? niri) { + niri = lib.mkIf (config.programs ? niri) { prettyName = "Niri"; comment = "Niri compositor managed by UWSM"; binPath = "/run/current-system/sw/bin/niri-session"; @@ -14963,7 +14973,7 @@ I am using this with CapyReader on my phone, set it up as a FreshRSS account wit FreshRSS claims to support HTTP header auth, but at least it does not work with my oauth2-proxy setup. Until this is fixed, I resorted to the "form" login, since I mostly do not use the web version anyways. #+begin_src nix-ts :tangle modules/nixos/server/freshrss.nix - { self, lib, config, globals, dns, confLib, ... }: + { lib, config, globals, dns, confLib, ... }: let inherit (confLib.gen { name = "freshrss"; port = 80; }) servicePort serviceName serviceUser serviceGroup serviceDomain serviceAddress proxyAddress4 proxyAddress6; inherit (confLib.static) isHome webProxy homeWebProxy dnsServer homeServiceAddress nginxAccessRules; @@ -15014,11 +15024,11 @@ FreshRSS claims to support HTTP header auth, but at least it does not work with # }; }; - topology.self.services.${serviceName} = { - name = "FreshRSS"; - info = "https://${serviceDomain}"; - icon = "${self}/files/topology-images/${serviceName}.png"; - }; + # topology.self.services.${serviceName} = { + # name = "FreshRSS"; + # info = "https://${serviceDomain}"; + # icon = "${self}/files/topology-images/${serviceName}.png"; + # }; globals.services.${serviceName} = { domain = serviceDomain; @@ -16034,7 +16044,7 @@ kanidm person credential create-reset-token :END: #+begin_src nix-ts :tangle modules/nixos/server/firefly-iii.nix - { self, lib, config, globals, dns, confLib, ... }: + { lib, config, globals, dns, confLib, ... }: let inherit (confLib.gen { name = "firefly-iii"; port = 80; }) servicePort serviceName serviceUser serviceGroup serviceDomain serviceAddress proxyAddress4 proxyAddress6; inherit (confLib.static) isHome dnsServer webProxy homeWebProxy homeServiceAddress nginxAccessRules; @@ -16066,11 +16076,11 @@ kanidm person credential create-reset-token }; }; - topology.self.services.${serviceName} = { - name = "Firefly-III"; - info = "https://${serviceDomain}"; - icon = "${self}/files/topology-images/${serviceName}.png"; - }; + # topology.self.services.${serviceName} = { + # name = "Firefly-III"; + # info = "https://${serviceDomain}"; + # icon = "${self}/files/topology-images/${serviceName}.png"; + # }; globals.services.${serviceName} = { domain = serviceDomain; @@ -19245,36 +19255,56 @@ TODO: evaluate whether I should keep using this structure. Auto login for the initial session. #+begin_src nix-ts :tangle modules/nixos/optional/niri.nix - { inputs, lib, config, pkgs, ... }: - let - moduleName = "niri"; - in - { - imports = [ - inputs.niri-flake.nixosModules.niri - ]; - options.swarselmodules.${moduleName} = lib.mkEnableOption "${moduleName} settings"; - config = lib.mkIf config.swarselmodules.${moduleName} { - - environment.systemPackages = with pkgs; [ - wl-clipboard - wayland-utils - libsecret - cage - gamescope - xwayland-satellite-unstable + { self, inputs, config, pkgs, ... }: + { + imports = [ + inputs.niri-flake.nixosModules.niri ]; + config = { + + niri-flake.cache.enable = true; + home-manager.users.${config.swarselsystems.mainUser}.imports = [ + "${self}/modules/home/optional/niri.nix" + ]; + + environment.systemPackages = with pkgs; [ + wl-clipboard + wayland-utils + libsecret + cage + gamescope + xwayland-satellite-unstable + ]; - programs.niri = { - enable = true; - package = pkgs.niri-unstable; # the actual niri that will be installed and used + programs = { + niri = { + enable = true; + package = pkgs.niri-stable; # the actual niri that will be installed and used + }; + }; }; - } // { - niri-flake.cache.enable = true; - programs.niri = { - package = null; + } +#+end_src + +**** Noctalia + +#+begin_src nix-ts :tangle modules/nixos/optional/noctalia.nix + { self, inputs, config, ... }: + { + disabledModules = [ "programs/gpu-screen-recorder.nix" ]; + imports = [ + "${inputs.nixpkgs-dev}/nixos/modules/programs/gpu-screen-recorder.nix" + ]; + config = { + home-manager.users.${config.swarselsystems.mainUser}.imports = [ + "${self}/modules/home/optional/noctalia.nix" + ]; + services = { + upower.enable = true; # needed for battery percentage + gnome.evolution-data-server.enable = true; # needed for calendar integration }; + programs.gpu-screen-recorder.enable = true; }; } #+end_src @@ -20737,6 +20767,7 @@ This is just a separate container for derivations defined in [[#h:64a5cc16-6b16- bak timer e + niri-resize swarselcheck swarselcheck-niri waybarupdate @@ -21865,12 +21896,14 @@ Currently I only use it as before with =initExtra= though. programs.zellij = { enable = true; enableZshIntegration = true; + attachExistingSession = false; + exitShellOnExit = true; settings = { pane_frames = false; simplified_ui = false; default_shell = "zsh"; copy_on_select = true; - on_force_close = "detach"; + on_force_close = "quit"; show_startup_tips = false; support_kitty_keyboard_protocol = true; default_layout = "swarsel"; @@ -23616,8 +23649,8 @@ The rest of the related configuration is found here: enable = true; systemd = { enable = false; - # target = "sway-session.target"; - inherit (config.wayland.systemd) target; + target = "sway-session.target"; + # inherit (config.wayland.systemd) target; }; settings = { mainBar = { @@ -24152,17 +24185,18 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi :END: #+begin_src nix-ts :tangle modules/home/common/swayosd.nix - { lib, pkgs, config, ... }: - { - options.swarselmodules.swayosd = lib.mkEnableOption "swayosd settings"; - config = lib.mkIf config.swarselmodules.swayosd { - services.swayosd = { - enable = true; - package = pkgs.dev.swayosd; - topMargin = 0.5; + { lib, pkgs, config, confLib, ... }: + { + options.swarselmodules.swayosd = lib.mkEnableOption "swayosd settings"; + config = lib.mkIf config.swarselmodules.swayosd { + systemd.user.services.swayosd = confLib.overrideTarget "sway-session.target"; + services.swayosd = { + enable = true; + package = pkgs.dev.swayosd; + topMargin = 0.5; + }; }; - }; - } + } #+end_src ***** yubikey-touch-detector @@ -24250,16 +24284,18 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi systemd.user.services.obsidian-applet = { Unit = { Description = "Obsidian applet"; - Requires = [ "tray.target" ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { @@ -24287,16 +24323,18 @@ Sets up a systemd user service for anki that does not stall the shutdown process systemd.user.services.anki-applet = { Unit = { Description = "Anki applet"; - Requires = [ "tray.target" ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { @@ -24331,16 +24369,18 @@ Sets up a systemd user service for anki that does not stall the shutdown process systemd.user.services.element-applet = { Unit = { Description = "Element applet"; - Requires = [ "tray.target" ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { @@ -24366,16 +24406,18 @@ Sets up a systemd user service for anki that does not stall the shutdown process systemd.user.services.vesktop-applet = { Unit = { Description = "Vesktop applet"; - Requires = [ "tray.target" ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { @@ -24393,35 +24435,35 @@ Sets up a systemd user service for anki that does not stall the shutdown process :END: #+begin_src nix-ts :tangle modules/home/common/firezone-tray.nix - { lib, config, pkgs, ... }: - { - options.swarselmodules.firezone-tray = lib.mkEnableOption "enable firezone applet for tray"; - config = lib.mkIf config.swarselmodules.firezone-tray { + { lib, config, pkgs, ... }: + { + options.swarselmodules.firezone-tray = lib.mkEnableOption "enable firezone applet for tray"; + config = lib.mkIf config.swarselmodules.firezone-tray { - systemd.user.services.firezone-applet = { - Unit = { - Description = "Firezone applet"; - Requires = [ - "tray.target" - ]; - After = [ - "graphical-session.target" - "tray.target" - ]; - PartOf = [ "graphical-session.target" ]; - }; + systemd.user.services.firezone-applet = { + Unit = { + Description = "Firezone applet"; + Requires = [ "graphical-session.target" ]; + After = [ + "graphical-session.target" + "tray.target" + ]; + PartOf = [ + "tray.target" + ]; + }; - Install = { - WantedBy = [ "graphical-session.target" ]; - }; + Install = { + WantedBy = [ "tray.target" ]; + }; - Service = { - ExecStart = "${pkgs.firezone-gui-client}/bin/firezone-client-gui"; - }; + Service = { + ExecStart = "${pkgs.firezone-gui-client}/bin/firezone-client-gui"; }; }; + }; - } + } #+end_src ***** syncthing service for tray @@ -24840,6 +24882,7 @@ Currently, I am too lazy to explain every option here, but most of it is very se startup = config.swarselsystems.startup ++ [ { command = "kitty -T kittyterm -o confirm_os_window_close=0 zellij attach --create kittyterm"; } { command = "sleep 60; kitty -T spotifytui -o confirm_os_window_close=0 spotify_player"; } + { command = "mako"; } ]; seat = { "*" = { @@ -25033,7 +25076,7 @@ Currently, I am too lazy to explain every option here, but most of it is very se #+begin_src nix-ts :tangle modules/home/common/kanshi.nix - { self, lib, pkgs, config, ... }: + { self, lib, pkgs, config, confLib, ... }: { options.swarselmodules.kanshi = lib.mkEnableOption "kanshi settings"; config = lib.mkIf config.swarselmodules.kanshi { @@ -25049,6 +25092,8 @@ Currently, I am too lazy to explain every option here, but most of it is very se }; }; }; + + systemd.user.services.kanshi = confLib.overrideTarget "sway-session.target"; services.kanshi = { enable = true; settings = [ @@ -25228,6 +25273,7 @@ This service changes the screen hue at night. I am not sure if that really does { options.swarselmodules.gammastep = lib.mkEnableOption "gammastep settings"; config = lib.mkIf config.swarselmodules.gammastep { + systemd.user.services.gammastep = confLib.overrideTarget "sway-session.target"; services.gammastep = lib.mkIf (config.swarselsystems.isNixos && !config.swarselsystems.isPublic) { enable = true; provider = "manual"; @@ -25748,7 +25794,7 @@ This service changes the screen hue at night. I am not sure if that really does config = lib.mkIf config.swarselmodules.${moduleName} { services.${moduleName} = { enable = true; - systemdTarget = config.wayland.systemd.target; + systemdTarget = "sway-session.target"; }; }; @@ -25773,23 +25819,25 @@ This service changes the screen hue at night. I am not sure if that really does brightnessctl = "${lib.getExe pkgs.brightnessctl}"; swaylock = "${lib.getExe pkgs.swaylock-effects}"; suspend = "${pkgs.systemd}/bin/systemctl suspend"; + noctalia = "/etc/profiles/per-user/${config.swarselsystems.mainUser}/bin/noctalia-shell ipc call"; in { enable = true; - systemdTarget = config.wayland.systemd.target; + # systemdTarget = "sway-session.target"; extraArgs = [ "-w" ]; timeouts = [ { timeout = 60; command = "${brightnessctl} -s; ${brightnessctl} set 80%-"; resumeCommand = "${brightnessctl} -r"; } # { timeout = 300; command = "${lib.getExe pkgs.swaylock-effects} -f --screenshots --clock --effect-blur 7x5 --effect-vignette 0.5:0.5 --fade-in 0.2"; } - { timeout = 300; command = "${swaylock} -f"; } + # { timeout = 300; command = "${swaylock} -f"; } + { timeout = 300; command = "${noctalia} lockScreen lock || ${swaylock} -f"; } # { timeout = 600; command = ''${pkgs.sway}/bin/swaymsg "output * dpms off"; resumeCommand = "${pkgs.sway}/bin/swaymsg output * dpms on''; } - { timeout = 600; command = "${suspend}"; } + { timeout = 600; command = "${noctalia} sessionMenu lockAndSuspend || ${suspend}"; } ]; events = { # { event = "before-sleep"; command = "${lib.getExe pkgs.swaylock-effects} -f --screenshots --clock --effect-blur 7x5 --effect-vignette 0.5:0.5 --fade-in 0.2"; } # { event = "after-resume"; command = "${swaylock} -f "; } - before-sleep = "${swaylock} -f "; - lock = "${swaylock} -f "; + # before-sleep = "${swaylock} -f "; + # lock = "${swaylock} -f "; }; }; }; @@ -25964,219 +26012,835 @@ Akin to the [[#h:f9aa9af0-9b8d-43ff-901d-9ffccdd70589][Optional]] NixOS modules. :END: #+begin_src nix-ts :tangle modules/home/optional/niri.nix - { inputs, config, pkgs, lib, vars, ... }: + { inputs, config, pkgs, lib, vars, type, ... }: { - imports = [ + imports = lib.optionals (type != "nixos") [ inputs.niri-flake.homeModules.niri ]; - options.swarselmodules.niri = lib.mkEnableOption "niri settings"; - config = lib.mkIf config.swarselmodules.niri - { - - programs.niri = { - package = pkgs.niri-unstable; # which package to use for niri validation - settings = { - xwayland-satellite = { - enable = true; - path = "${lib.getExe pkgs.xwayland-satellite-unstable}"; - }; - prefer-no-csd = true; - layer-rules = [ - { matches = [{ namespace = "^notifications$"; }]; block-out-from = "screencast"; } - { matches = [{ namespace = "^wallpaper$"; }]; place-within-backdrop = true; } - ]; - window-rules = [ - { - matches = [{ app-id = ".*"; }]; - opacity = 0.95; - default-column-width = { proportion = 0.5; }; - shadow = { - enable = true; - draw-behind-window = true; - }; - geometry-corner-radius = { top-left = 2.0; top-right = 2.0; bottom-left = 2.0; bottom-right = 2.0; }; - } - { matches = [{ app-id = "at.yrlf.wl_mirror"; }]; opacity = 1.0; } - { matches = [{ app-id = "Gimp"; }]; opacity = 1.0; } - { matches = [{ app-id = "firefox"; }]; opacity = 0.99; } - { matches = [{ app-id = "^special.*"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; } - { matches = [{ app-id = "chromium-browser"; }]; opacity = 0.99; } - { matches = [{ app-id = "^qalculate-gtk$"; }]; open-floating = true; } - { matches = [{ app-id = "^blueman$"; }]; open-floating = true; } - { matches = [{ app-id = "^pavucontrol$"; }]; open-floating = true; } - { matches = [{ app-id = "^syncthingtray$"; }]; open-floating = true; } - { matches = [{ app-id = "^Element$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; block-out-from = "screencast"; } - # { matches = [{ app-id = "^Element$"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; block-out-from = "screencast"; } - { matches = [{ app-id = "^vesktop$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; block-out-from = "screencast"; } - # { matches = [{ app-id = "^vesktop$"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; block-out-from = "screencast"; } - { matches = [{ app-id = "^com.nextcloud.desktopclient.nextcloud$"; }]; open-floating = true; } - { matches = [{ title = ".*1Password.*"; }]; excludes = [{ app-id = "^firefox$"; } { app-id = "^emacs$"; } { app-id = "^kitty$"; }]; open-floating = true; block-out-from = "screencast"; } - { matches = [{ title = "(?:Open|Save) (?:File|Folder|As)"; }]; open-floating = true; } - { matches = [{ title = "^Add$"; }]; open-floating = true; } - { matches = [{ title = "^Picture-in-Picture$"; }]; open-floating = true; } - { matches = [{ title = "Syncthing Tray"; }]; open-floating = true; } - { matches = [{ title = "^Emacs Popup Frame$"; }]; open-floating = true; } - { matches = [{ title = "^Emacs Popup Anchor$"; }]; open-floating = true; } - { matches = [{ app-id = "^spotifytui$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; } - { matches = [{ app-id = "^kittyterm$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; } - ]; - environment = { - DISPLAY = ":0"; - } // vars.waylandSessionVariables; - screenshot-path = "~/Pictures/Screenshots/screenshot_%Y-%m-%d-%H%M%S.png"; - input = { - mod-key = "Super"; - keyboard = { - xkb = { - layout = "us"; - variant = "altgr-intl"; - }; - }; - mouse = { - natural-scroll = false; - }; - touchpad = { - enable = true; - tap = true; - tap-button-map = "left-right-middle"; - natural-scroll = true; - scroll-method = "two-finger"; - click-method = "clickfinger"; - disabled-on-external-mouse = true; - drag = true; - drag-lock = false; - dwt = true; - dwtp = true; - }; - }; - cursor = { - hide-after-inactive-ms = 2000; - hide-when-typing = true; - }; - layout = { - background-color = "transparent"; - border = { - enable = true; - width = 1; - }; - focus-ring = { - enable = false; - }; - gaps = 5; - }; - binds = with config.lib.niri.actions; let - sh = spawn "sh" "-c"; - in + config = { + programs.niri = { + package = pkgs.niri-stable; # which package to use for niri validation + settings = { + debug = { + honor-xdg-activation-with-invalid-serial = []; + }; + xwayland-satellite = { + enable = true; + path = "${lib.getExe pkgs.xwayland-satellite-unstable}"; + }; + prefer-no-csd = true; + layer-rules = [ + { matches = [{ namespace = "^notifications$"; }]; block-out-from = "screen-capture"; } + { matches = [{ namespace = "^wallpaper$"; }]; place-within-backdrop = true; } + { matches = [{ namespace = "^noctalia-overview*"; }]; place-within-backdrop = true; } + ]; + window-rules = [ { - - # "Mod+Super_L" = spawn "killall -SIGUSR1 .waybar-wrapped"; - "Mod+z".action = spawn "killall -SIGUSR1 .waybar-wrapped"; - "Mod+Shift+t".action = toggle-window-rule-opacity; - # "Mod+Escape".action = "mode $exit"; - "Mod+m".action = focus-workspace-previous; - "Mod+Shift+Space".action = toggle-window-floating; - "Mod+Shift+f".action = toggle-windowed-fullscreen; - "Mod+q".action = close-window; - "Mod+f".action = spawn "firefox"; - "Mod+Space".action = spawn "fuzzel"; - "Mod+Shift+c".action = spawn "qalculate-gtk"; - "Mod+Ctrl+p".action = spawn "1password" "--quick-acces"; - "Mod+Shift+Escape".action = spawn "kitty" "-o" "confirm_os_window_close=0" "btm"; - "Mod+h".action = sh ''hyprpicker | wl-copy''; - # "Mod+s".action = spawn "grim" "-g" "\"$(slurp)\"" "-t" "png" "-" "|" "wl-copy" "-t" "image/png"; - # "Mod+s".action = screenshot { show-pointer = false; }; - "Mod+s".action.screenshot = { show-pointer = false; }; - # "Mod+Shift+s".action = spawn "slurp" "|" "grim" "-g" "-" "Pictures/Screenshots/$(date +'screenshot_%Y-%m-%d-%H%M%S.png')"; - # "Mod+Shift+s".action = screenshot-window { write-to-disk = true; }; - "Mod+Shift+s".action.screenshot-window = { write-to-disk = true; }; - # "Mod+Shift+v".action = spawn "wf-recorder" "-g" "'$(slurp -f %o -or)'" "-f" "~/Videos/screenrecord_$(date +%Y-%m-%d-%H%M%S).mkv"; - - "Mod+e".action = sh "emacsclient -nquc -a emacs -e '(dashboard-open)'"; - "Mod+c".action = sh "emacsclient -ce '(org-capture)'"; - "Mod+t".action = sh "emacsclient -ce '(org-agenda)'"; - "Mod+Shift+m".action = sh "emacsclient -ce '(mu4e)'"; - "Mod+Shift+a".action = sh "emacsclient -ce '(swarsel/open-calendar)'"; - - "Mod+a".action = spawn "swarselcheck-niri" "-s"; - "Mod+x".action = spawn "swarselcheck-niri" "-k"; - "Mod+d".action = spawn "swarselcheck-niri" "-d"; - "Mod+w".action = spawn "swarselcheck-niri" "-e"; - - "Mod+p".action = spawn "pass-fuzzel"; - "Mod+o".action = spawn "pass-fuzzel" "--otp"; - "Mod+Shift+p".action = spawn "pass-fuzzel" "--type"; - "Mod+Shift+o".action = spawn "pass-fuzzel" "--otp" "--type"; - - "Mod+Left".action = focus-column-or-monitor-left; - "Mod+Right".action = focus-column-or-monitor-right; - "Mod+Down".action = focus-window-or-workspace-down; - "Mod+Up".action = focus-window-or-workspace-up; - "Mod+Shift+Left".action = move-column-left; - "Mod+Shift+Right".action = move-column-right; - "Mod+Shift+Down".action = move-window-down-or-to-workspace-down; - "Mod+Shift+Up".action = move-window-up-or-to-workspace-up; - # "Mod+Ctrl+Shift+c".action = "reload"; - # "Mod+Ctrl+Shift+r".action = "exec swarsel-displaypower"; - # "Mod+Shift+e".action = "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'"; - # "Mod+r".action = "mode resize"; - # "Mod+Return".action = "exec kitty"; - "Mod+Return".action = spawn "swarselzellij"; - "XF86AudioRaiseVolume".action = spawn "swayosd-client" "--output-volume" "raise"; - "XF86AudioLowerVolume".action = spawn "swayosd-client" "--output-volume" "lower"; - "XF86AudioMute".action = spawn "swayosd-client" "--output-volume" "mute-toggle"; - "XF86MonBrightnessUp".action = spawn "swayosd-client" "--brightness raise"; - "XF86MonBrightnessDown".action = spawn "swayosd-client" "--brightness lower"; - "XF86Display".action = spawn "wl-mirror" "eDP-1"; - "Mod+Escape".action = spawn "wlogout"; - "Mod+Equal".action = set-column-width "+10%"; - "Mod+Minus".action = set-column-width "-10%"; - - "Mod+1".action = focus-workspace 1; - "Mod+2".action = focus-workspace 2; - "Mod+3".action = focus-workspace 3; - "Mod+4".action = focus-workspace 4; - "Mod+5".action = focus-workspace 5; - "Mod+6".action = focus-workspace 6; - "Mod+7".action = focus-workspace 7; - "Mod+8".action = focus-workspace 8; - "Mod+9".action = focus-workspace 9; - "Mod+0".action = focus-workspace 0; - - "Mod+Shift+1".action = move-column-to-index 1; - "Mod+Shift+2".action = move-column-to-index 2; - "Mod+Shift+3".action = move-column-to-index 3; - "Mod+Shift+4".action = move-column-to-index 4; - "Mod+Shift+5".action = move-column-to-index 5; - "Mod+Shift+6".action = move-column-to-index 6; - "Mod+Shift+7".action = move-column-to-index 7; - "Mod+Shift+8".action = move-column-to-index 8; - "Mod+Shift+9".action = move-column-to-index 9; - "Mod+Shift+0".action = move-column-to-index 0; + matches = [{ app-id = ".*"; }]; + opacity = 0.95; + default-column-width = { proportion = 0.5; }; + shadow = { + enable = true; + draw-behind-window = true; + }; + clip-to-geometry = true; + geometry-corner-radius = { top-left = 5.0; top-right = 5.0; bottom-left = 5.0; bottom-right = 5.0; }; + } + { matches = [{ app-id = "at.yrlf.wl_mirror"; }]; opacity = 1.0; } + { matches = [{ app-id = "Gimp"; }]; opacity = 1.0; } + { matches = [{ app-id = "^firefox$"; }]; opacity = 0.95; } + { matches = [{ app-id = "^special.*"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; } + { matches = [{ app-id = "chromium-browser"; }]; opacity = 0.99; } + { matches = [{ app-id = "^qalculate-gtk$"; }]; open-floating = true; } + { matches = [{ app-id = "^blueman$"; }]; open-floating = true; } + { matches = [{ app-id = "^pavucontrol$"; }]; open-floating = true; } + { matches = [{ app-id = "^syncthingtray$"; }]; open-floating = true; } + { matches = [{ app-id = "^Element$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; block-out-from = "screen-capture"; } + # { matches = [{ app-id = "^Element$"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; block-out-from = "screencast"; } + { matches = [{ app-id = "^vesktop$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; block-out-from = "screen-capture"; } + # { matches = [{ app-id = "^vesktop$"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; block-out-from = "screencast"; } + { matches = [{ app-id = "^com.nextcloud.desktopclient.nextcloud$"; }]; open-floating = true; } + { matches = [{ title = ".*1Password.*"; }]; excludes = [{ app-id = "^firefox$"; } { app-id = "^emacs$"; } { app-id = "^kitty$"; }]; open-floating = true; block-out-from = "screen-capture"; } + { matches = [{ title = "(?:Open|Save) (?:File|Folder|As)"; }]; open-floating = true; } + { matches = [{ title = "^Add$"; }]; open-floating = true; } + { matches = [{ title = "^Picture-in-Picture$"; }]; open-floating = true; } + { matches = [{ title = "Syncthing Tray"; }]; open-floating = true; } + { matches = [{ title = "^Emacs Popup Frame$"; }]; open-floating = true; } + { matches = [{ title = "^Emacs Popup Anchor$"; }]; open-floating = true; } + { matches = [{ app-id = "^spotifytui$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; } + { matches = [{ app-id = "^kittyterm$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; } + ]; + environment = { + DISPLAY = ":0"; + QT_QPA_PLATFORM = lib.mkForce "wayland"; + EDITOR = "emacsclient -c"; + } // vars.waylandSessionVariables; + screenshot-path = "~/Pictures/Screenshots/screenshot_%Y-%m-%d-%H%M%S.png"; + input = { + mod-key = "Super"; + keyboard = { + xkb = { + layout = "us"; + variant = "altgr-intl"; + }; }; - spawn-at-startup = [ - # { command = [ "vesktop" "--start-minimized" "--enable-speech-dispatcher" "--ozone-platform-hint=auto" "--enable-features=WaylandWindowDecorations" "--enable-wayland-ime" ]; } - # { command = [ "element-desktop" "--hidden" "--enable-features=UseOzonePlatform" "--ozone-platform=wayland" "--disable-gpu-driver-bug-workarounds" ]; } - # { command = [ "anki" ]; } - # { command = [ "obsidian" ]; } - # { command = [ "nm-applet" ]; } - { command = [ "niri" "msg" "action" "focus-workspace" "2" ]; } + mouse = { + natural-scroll = false; + }; + touchpad = { + enable = true; + tap = true; + tap-button-map = "left-right-middle"; + natural-scroll = true; + scroll-method = "two-finger"; + click-method = "clickfinger"; + disabled-on-external-mouse = true; + drag = true; + drag-lock = false; + dwt = true; + dwtp = true; + }; + }; + cursor = { + hide-after-inactive-ms = 2000; + hide-when-typing = true; + }; + layout = { + background-color = "transparent"; + border = { + enable = true; + width = 1; + }; + focus-ring = { + enable = false; + }; + gaps = 5; + }; + binds = with config.lib.niri.actions; let + sh = spawn "sh" "-c"; + resizer = "niri-resize"; + in + { + "Mod+Shift+t".action = toggle-window-rule-opacity; + "Mod+m".action = focus-workspace-previous; + "Mod+Shift+Space".action = toggle-window-floating; + "Mod+Shift+f".action = fullscreen-window; + "Mod+q".action = sh "niri msg action close-window & ${resizer}"; + "Mod+f".action = sh "${resizer} & firefox"; + # "Mod+Space".action = spawn "noctalia-shell" "ipc" "call" "launcher" "toggle"; + "Mod+Space".action = sh "${resizer} & fuzzel"; + "Mod+z".action = spawn "noctalia-shell" "ipc" "call" "bar" "toggle"; + "Mod+Shift+c".action = spawn "qalculate-gtk"; + "Mod+Ctrl+p".action = spawn "1password" "--quick-acces"; + "Mod+Shift+Escape".action = spawn "kitty" "-o" "confirm_os_window_close=0" "btm"; + "Mod+h".action = sh ''hyprpicker | wl-copy''; + # "Mod+s".action = spawn "grim" "-g" "\"$(slurp)\"" "-t" "png" "-" "|" "wl-copy" "-t" "image/png"; + # "Mod+s".action = screenshot { show-pointer = false; }; + "Mod+s".action.screenshot = { show-pointer = false; }; + # "Mod+Shift+s".action = spawn "slurp" "|" "grim" "-g" "-" "Pictures/Screenshots/$(date +'screenshot_%Y-%m-%d-%H%M%S.png')"; + # "Mod+Shift+s".action = screenshot-window { write-to-disk = true; }; + "Mod+Shift+s".action.screenshot-window = { write-to-disk = true; }; + # "Mod+Shift+v".action = spawn "wf-recorder" "-g" "'$(slurp -f %o -or)'" "-f" "~/Videos/screenrecord_$(date +%Y-%m-%d-%H%M%S).mkv"; + + "Mod+e".action = sh "${resizer} & emacsclient -nquc -a emacs -e '(dashboard-open)'"; + "Mod+c".action = sh "${resizer} & emacsclient -ce '(org-capture)'"; + "Mod+t".action = sh "${resizer} & emacsclient -ce '(org-agenda)'"; + "Mod+Shift+m".action = sh "${resizer} & emacsclient -ce '(mu4e)'"; + "Mod+Shift+a".action = sh "${resizer} & emacsclient -ce '(swarsel/open-calendar)'"; + + "Mod+a".action = spawn "swarselcheck-niri" "-s"; + "Mod+x".action = spawn "swarselcheck-niri" "-k"; + "Mod+d".action = spawn "swarselcheck-niri" "-d"; + "Mod+w".action = spawn "swarselcheck-niri" "-e"; + + "Mod+p".action = spawn "pass-fuzzel"; + "Mod+o".action = spawn "pass-fuzzel" "--otp"; + "Mod+Shift+p".action = spawn "pass-fuzzel" "--type"; + "Mod+Shift+o".action = spawn "pass-fuzzel" "--otp" "--type"; + + "Mod+Left".action = focus-column-or-monitor-left; + "Mod+Right".action = focus-column-or-monitor-right; + "Mod+Down".action = focus-window-or-workspace-down; + "Mod+Up".action = focus-window-or-workspace-up; + "Mod+Shift+Left".action = move-column-left; + "Mod+Shift+Right".action = move-column-right; + "Mod+Shift+Down".action = move-window-down-or-to-workspace-down; + "Mod+Shift+Up".action = move-window-up-or-to-workspace-up; + # "Mod+Ctrl+Shift+c".action = "reload"; + # "Mod+Ctrl+Shift+r".action = "exec swarsel-displaypower"; + # "Mod+Shift+e".action = "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'"; + # "Mod+r".action = "mode resize"; + # "Mod+Return".action = "exec kitty"; + "Mod+Return".action = sh "${resizer} & exec kitty -o confirm_os_window_close=0"; + "XF86AudioRaiseVolume".action = spawn "noctalia-shell" "ipc" "call" "volume" "increase"; + "XF86AudioLowerVolume".action = spawn "noctalia-shell" "ipc" "call" "volume" "decrease"; + "XF86AudioMute".action = spawn "noctalia-shell" "ipc" "call" "volume" "muteOutput"; + "XF86AudioPrev".action = spawn "noctalia-shell" "ipc" "call" "media" "previous"; + "XF86AudioPlay".action = spawn "noctalia-shell" "ipc" "call" "media" "playPause"; + "XF86AudioNext".action = spawn "noctalia-shell" "ipc" "call" "media" "next"; + "XF86MonBrightnessUp".action = spawn "noctalia-shell" "ipc" "call" "brightness" "increase"; + "XF86MonBrightnessDown".action = spawn "noctalia-shell" "ipc" "call" "brightness" "decrease"; + "XF86Display".action = spawn "wl-mirror" "eDP-1"; + "Mod+Escape".action = spawn "noctalia-shell" "ipc" "call" "sessionMenu" "toggle"; + "Mod+i".action = spawn "noctalia-shell" "ipc" "call" "launcher" "emoji"; + "Mod+Equal".action = set-column-width "+10%"; + "Mod+Minus".action = set-column-width "-10%"; + + "Mod+1".action = focus-workspace 1; + "Mod+2".action = focus-workspace 2; + "Mod+3".action = focus-workspace 3; + "Mod+4".action = focus-workspace 4; + "Mod+5".action = focus-workspace 5; + "Mod+6".action = focus-workspace 6; + "Mod+7".action = focus-workspace 7; + "Mod+8".action = focus-workspace 8; + "Mod+9".action = focus-workspace 9; + "Mod+0".action = focus-workspace 0; + + "Mod+Shift+1".action = move-column-to-index 1; + "Mod+Shift+2".action = move-column-to-index 2; + "Mod+Shift+3".action = move-column-to-index 3; + "Mod+Shift+4".action = move-column-to-index 4; + "Mod+Shift+5".action = move-column-to-index 5; + "Mod+Shift+6".action = move-column-to-index 6; + "Mod+Shift+7".action = move-column-to-index 7; + "Mod+Shift+8".action = move-column-to-index 8; + "Mod+Shift+9".action = move-column-to-index 9; + "Mod+Shift+0".action = move-column-to-index 0; + }; + spawn-at-startup = [ + # { command = [ "vesktop" "--start-minimized" "--enable-speech-dispatcher" "--ozone-platform-hint=auto" "--enable-features=WaylandWindowDecorations" "--enable-wayland-ime" ]; } + # { command = [ "element-desktop" "--hidden" "--enable-features=UseOzonePlatform" "--ozone-platform=wayland" "--disable-gpu-driver-bug-workarounds" ]; } + # { command = [ "anki" ]; } + # { command = [ "obsidian" ]; } + # { command = [ "nm-applet" ]; } + # { command = [ "niri" "msg" "action" "focus-workspace" "2" ]; } + # { command = [ "noctalia-shell" ]; } + { command = [ "pkill mako" ]; } + { command = [ "systemctl" "--user" "start" "noctalia-shell.target" ]; } + ]; + # workspaces = { + # "01-Main" = { + # name = "Scratchpad"; + # }; + # "99-Scratchpad" = { + # name = ""; + # }; + # }; + }; + }; + + }; + } +#+end_src + +**** Noctalia + +Apart from configuring Noctalia, I here also add some systemd chains to make sure the Noctalia tray is actually ready to receive tray icons. For this I add another target =noctalia-tray-pre.target= that simply waits 5 seconds, which should be sufficient. + +#+begin_src nix-ts :tangle modules/home/optional/noctalia.nix + { self, inputs, config, pkgs, lib, confLib, ... }: + { + imports = [ + inputs.noctalia.homeModules.default + ]; + config = { + systemd.user = { + targets = { + noctalia-shell.Unit = { + After = [ "graphical-session.target" ]; + Wants = [ + "tray.target" + "noctalia-tray-pre.target" ]; - workspaces = { - # "01-Main" = { - # name = "Scratchpad"; - # }; - "99-Scratchpad" = { - name = ""; + }; + tray = { + Unit = { + After = [ "noctalia-tray-pre.target" ]; + PartOf = [ "noctalia-shell.service" ]; + }; + Install.WantedBy = [ "noctalia-shell.target" ]; + }; + noctalia-tray-pre = { + Unit = { + After = [ + "noctalia-init.service" + ]; + }; + Install.WantedBy = [ "noctalia-shell.target" ]; + }; + }; + services = { + noctalia-shell = confLib.overrideTarget "noctalia-shell.target"; + noctalia-init = { + Unit = { + PartOf = [ "noctalia-tray-pre.target" ]; + }; + + Service = { + Type = "oneshot"; + ExecStartPre = "${pkgs.coreutils}/bin/sleep 5"; + ExecStart = "-${pkgs.busybox}/bin/pkill mako"; + RemainAfterExit = true; + }; + + Install = { + WantedBy = [ "noctalia-tray-pre.target" ]; + }; + }; + }; + }; + + programs = { + fastfetch.enable = true; + noctalia-shell = { + enable = true; + package = pkgs.noctalia-shell.override { calendarSupport = true; }; + systemd.enable = true; + settings = { + bar = { + barType = "simple"; + position = "top"; + monitors = [ ]; + density = "default"; + showCapsule = false; + showOutline = false; + capsuleOpacity = lib.mkForce 1; + backgroundOpacity = lib.mkForce 0.5; + useSeparateOpacity = true; + floating = false; + marginVertical = 4; + marginHorizontal = 0; + frameThickness = 8; + frameRadius = 12; + outerCorners = true; + hideOnOverview = false; + displayMode = "auto_hide"; + autoHideDelay = 100; + autoShowDelay = 300; + screenOverrides = [ ]; + widgets = { + left = [ + { + characterCount = 2; + colorizeIcons = false; + emptyColor = "primary"; + enableScrollWheel = false; + focusedColor = "secondary"; + followFocusedScreen = false; + groupedBorderOpacity = 1; + hideUnoccupied = true; + iconScale = 0.5; + id = "Workspace"; + labelMode = "none"; + occupiedColor = "primary"; + pillSize = 0.4; + reverseScroll = false; + showApplications = true; + showBadge = true; + showLabelsOnlyWhenOccupied = true; + unfocusedIconsOpacity = 0.25; + } + ]; + center = [ + { + colorizeIcons = false; + hideMode = "hidden"; + id = "ActiveWindow"; + maxWidth = 145; + scrollingMode = "hover"; + showIcon = true; + useFixedWidth = false; + } + { + id = "plugin:privacy-indicator"; + } + { + id = "plugin:screen-recorder"; + } + ]; + right = [ + { + blacklist = [ + "bluetooth*" + ]; + colorizeIcons = false; + drawerEnabled = true; + hidePassive = true; + id = "Tray"; + pinned = [ ]; + } + { + displayMode = "alwaysShow"; + id = "Volume"; + middleClickCommand = "pavucontrol"; + } + { + displayMode = "onhover"; + id = "Network"; + } + { + displayMode = "onhover"; + id = "Bluetooth"; + } + { + displayMode = "onhover"; + id = "VPN"; + } + { + deviceNativePath = "__default__"; + hideIfIdle = true; + hideIfNotDetected = true; + id = "Battery"; + showNoctaliaPerformance = false; + showPowerProfiles = true; + } + { + id = "plugin:ba7043:github-feed"; + } + { + id = "plugin:clipper"; + } + { + colorName = "primary"; + id = "SessionMenu"; + } + { + customFont = "FiraCode Nerd Font Mono"; + formatHorizontal = "ddd dd. MMM HH:mm:ss"; + formatVertical = ""; + id = "Clock"; + tooltipFormat = "ddd dd. MMM HH:mm:ss"; + useCustomFont = true; + usePrimaryColor = true; + } + { + colorizeDistroLogo = false; + colorizeSystemIcon = "primary"; + customIconPath = ""; + enableColorization = true; + icon = "noctalia"; + id = "ControlCenter"; + useDistroLogo = true; + } + ]; + }; + }; + general = { + avatarImage = "${self}/files/wallpaper/swarsel.png"; + dimmerOpacity = 0.2; + showScreenCorners = false; + forceBlackScreenCorners = false; + scaleRatio = 1; + radiusRatio = 0.2; + iRadiusRatio = 1; + boxRadiusRatio = 1; + screenRadiusRatio = 1; + animationSpeed = 1; + animationDisabled = false; + compactLockScreen = true; + lockOnSuspend = true; + showSessionButtonsOnLockScreen = true; + showHibernateOnLockScreen = false; + enableShadows = true; + shadowDirection = "bottom_right"; + shadowOffsetX = 2; + shadowOffsetY = 3; + language = ""; + allowPanelsOnScreenWithoutBar = true; + showChangelogOnStartup = true; + telemetryEnabled = false; + enableLockScreenCountdown = true; + lockScreenCountdownDuration = 10000; + autoStartAuth = true; + allowPasswordWithFprintd = true; + }; + ui = { + fontDefaultScale = 1; + fontFixedScale = 1; + tooltipsEnabled = true; + panelBackgroundOpacity = lib.mkForce 1; + panelsAttachedToBar = true; + settingsPanelMode = "centered"; + wifiDetailsViewMode = "grid"; + bluetoothDetailsViewMode = "grid"; + networkPanelView = "wifi"; + bluetoothHideUnnamedDevices = false; + boxBorderEnabled = false; + }; + location = { + name = confLib.getConfig.repo.secrets.common.location.timezoneSpecific; + weatherEnabled = true; + weatherShowEffects = false; + useFahrenheit = false; + use12hourFormat = false; + showWeekNumberInCalendar = true; + showCalendarEvents = true; + showCalendarWeather = true; + analogClockInCalendar = false; + firstDayOfWeek = 1; + hideWeatherTimezone = false; + hideWeatherCityName = false; + }; + calendar = { + cards = [ + { + enabled = true; + id = "calendar-header-card"; + } + { + enabled = true; + id = "calendar-month-card"; + } + { + enabled = true; + id = "weather-card"; + } + ]; + }; + wallpaper = { + enabled = true; + overviewEnabled = true; + directory = "${self}/files/wallpaper"; + monitorDirectories = [ ]; + enableMultiMonitorDirectories = true; + showHiddenFiles = false; + viewMode = "single"; + setWallpaperOnAllMonitors = true; + fillMode = "crop"; + fillColor = "#000000"; + useSolidColor = false; + solidColor = "#1a1a2e"; + automationEnabled = false; + wallpaperChangeMode = "random"; + randomIntervalSec = 300; + transitionDuration = 500; + transitionType = "random"; + transitionEdgeSmoothness = 0.05; + panelPosition = "follow_bar"; + hideWallpaperFilenames = false; + useWallhaven = false; + wallhavenQuery = ""; + wallhavenSorting = "relevance"; + wallhavenOrder = "desc"; + wallhavenCategories = "111"; + wallhavenPurity = "100"; + wallhavenRatios = ""; + wallhavenApiKey = ""; + wallhavenResolutionMode = "atleast"; + wallhavenResolutionWidth = ""; + wallhavenResolutionHeight = ""; + sortOrder = "name"; + }; + appLauncher = { + enableClipboardHistory = false; + autoPasteClipboard = false; + enableClipPreview = true; + clipboardWrapText = true; + clipboardWatchTextCommand = "wl-paste --type text --watch cliphist store"; + clipboardWatchImageCommand = "wl-paste --type image --watch cliphist store"; + position = "center"; + pinnedApps = [ ]; + useApp2Unit = false; + sortByMostUsed = true; + terminalCommand = "kitty -e"; + customLaunchPrefixEnabled = false; + customLaunchPrefix = ""; + viewMode = "list"; + showCategories = false; + iconMode = "native"; + showIconBackground = false; + enableSettingsSearch = false; + enableWindowsSearch = false; + ignoreMouseInput = true; + screenshotAnnotationTool = ""; + }; + controlCenter = { + position = "close_to_bar_button"; + diskPath = "/"; + shortcuts = { + left = [ + { + id = "Network"; + } + { + id = "Bluetooth"; + } + ]; + right = [ + { + id = "Notifications"; + } + { + id = "PowerProfile"; + } + { + id = "KeepAwake"; + } + { + id = "plugin:screen-recorder"; + } + ]; + }; + cards = [ + { + enabled = true; + id = "profile-card"; + } + { + enabled = true; + id = "shortcuts-card"; + } + { + enabled = true; + id = "audio-card"; + } + { + enabled = true; + id = "brightness-card"; + } + { + enabled = true; + id = "weather-card"; + } + { + enabled = true; + id = "media-sysmon-card"; + } + ]; + }; + systemMonitor = { + cpuWarningThreshold = 80; + cpuCriticalThreshold = 90; + tempWarningThreshold = 80; + tempCriticalThreshold = 90; + gpuWarningThreshold = 80; + gpuCriticalThreshold = 90; + memWarningThreshold = 80; + memCriticalThreshold = 90; + swapWarningThreshold = 80; + swapCriticalThreshold = 90; + diskWarningThreshold = 80; + diskCriticalThreshold = 90; + diskAvailWarningThreshold = 20; + diskAvailCriticalThreshold = 10; + cpuPollingInterval = 1000; + gpuPollingInterval = 3000; + enableDgpuMonitoring = false; + memPollingInterval = 1000; + diskPollingInterval = 30000; + networkPollingInterval = 1000; + loadAvgPollingInterval = 3000; + useCustomColors = true; + warningColor = "#5ec4ff"; + criticalColor = "#d95468"; + externalMonitor = "btm"; + }; + dock = { + enabled = false; + }; + network = { + wifiEnabled = true; + bluetoothRssiPollingEnabled = false; + bluetoothRssiPollIntervalMs = 10000; + wifiDetailsViewMode = "grid"; + bluetoothDetailsViewMode = "grid"; + bluetoothHideUnnamedDevices = false; + }; + sessionMenu = { + enableCountdown = true; + countdownDuration = 3000; + position = "center"; + showHeader = true; + largeButtonsStyle = true; + largeButtonsLayout = "grid"; + showNumberLabels = true; + powerOptions = [ + { + action = "lock"; + command = ""; + countdownEnabled = true; + enabled = true; + } + { + action = "suspend"; + command = ""; + countdownEnabled = true; + enabled = true; + } + { + action = "hibernate"; + command = ""; + countdownEnabled = true; + enabled = true; + } + { + action = "reboot"; + command = ""; + countdownEnabled = true; + enabled = true; + } + { + action = "logout"; + command = ""; + countdownEnabled = true; + enabled = true; + } + { + action = "shutdown"; + command = ""; + countdownEnabled = true; + enabled = true; + } + ]; + }; + notifications = { + enabled = true; + monitors = [ ]; + location = "top_right"; + overlayLayer = true; + backgroundOpacity = 0.5; + respectExpireTimeout = true; + lowUrgencyDuration = 3; + normalUrgencyDuration = 8; + criticalUrgencyDuration = 15; + enableMediaToast = false; + enableKeyboardLayoutToast = true; + batteryWarningThreshold = 20; + batteryCriticalThreshold = 5; + saveToHistory = { + low = true; + normal = true; + critical = true; + }; + sounds.enabled = false; + }; + osd = { + enabled = true; + location = "right"; + autoHideMs = 2000; + overlayLayer = true; + backgroundOpacity = 0.5; + monitors = [ ]; + enabledTypes = [ 0 1 2 3 ]; + }; + audio = { + volumeStep = 5; + volumeOverdrive = false; + cavaFrameRate = 30; + visualizerType = "linear"; + mprisBlacklist = [ ]; + preferredPlayer = ""; + volumeFeedback = false; + }; + brightness = { + brightnessStep = 5; + enforceMinimum = true; + enableDdcSupport = false; + }; + nightLight = { + enabled = true; + autoSchedule = true; + nightTemp = "3700"; + dayTemp = "5500"; + manualSunrise = "06:30"; + manualSunset = "18:30"; + }; + hooks.enabled = false; + desktopWidgets.enabled = false; + + plugins = { + sources = [ + { + enabled = true; + name = "Official Noctalia Plugins"; + url = "https://github.com/noctalia-dev/noctalia-plugins"; + } + { + enabled = true; + name = "Dev"; + url = "https://github.com/Swarsel/noctalia-plugins"; + } + ]; + states = lib.listToAttrs + (map + (plugin: + lib.nameValuePair plugin { + enabled = true; + sourceUrl = "https://github.com/noctalia-dev/noctalia-plugins"; + }) + [ + "clipper" + "github-feed" + "privacy-indicator" + "kaomoji-provider" + "unicode-picker" + "screen-recorder" + ]) // { + github-feed = { + enabled = true; + sourceUrl = "https://github.com/Swarsel/noctalia-plugins"; + }; + }; + }; + pluginSettings = { + clipper = { + enableTodoIntegration = false; + }; + + privacy-indicator = { + hideInactive = true; + iconSpacing = 4; + removeMargins = true; + }; + + screen-recorder = { + hideInactive = true; + directory = ""; + filenamePattern = "recording_yyyyMMdd_HHmmss"; + frameRate = "60"; + audioCodec = "opus"; + videoCodec = "h264"; + quality = "very_high"; + colorRange = "limited"; + showCursor = true; + copyToClipboard = true; + audioSource = "default_output"; + videoSource = "portal"; + resolution = "original"; + }; + + github-feed = { + username = lib.toUpper config.swarselsystems.mainUser; + token = confLib.getConfig.repo.secrets.common.noctaliaGithubToken; + refreshInterval = 300; + maxEvents = 50; + showStars = false; + showForks = false; + showPRs = false; + showRepoCreations = false; + showMyRepoStars = true; + showMyRepoForks = true; + openInBrowser = true; + # my fork: + showNotificationBadge = true; + colorizationEnabled = true; + colorizationIcon = "Primary"; + colorizationBadge = "Tertiary"; + colorizationBadgeText = "Primary"; + defaultTab = 1; + enableSystemNotifications = true; + notifyGitHubNotifications = true; + notifyStars = true; + notifyForks = true; + notifyPRs = true; + notifyRepoCreations = true; + notifyMyRepoStars = true; + notifyMyRepoForks = true; }; }; }; }; - - } // { - programs.niri = lib.mkIf (!config.swarselmodules.niri) { - package = null; - config = null; - settings = null; }; }; } @@ -26267,690 +26931,694 @@ When setting up a new machine: #+begin_src nix-ts :tangle modules/home/optional/work.nix :noweb yes { self, config, pkgs, lib, vars, confLib, type, ... }: - let - inherit (config.swarselsystems) homeDir mainUser; - inherit (confLib.getConfig.repo.secrets.local.mail) allMailAddresses; - inherit (confLib.getConfig.repo.secrets.local.work) mailAddress; + let + inherit (config.swarselsystems) homeDir mainUser; + inherit (confLib.getConfig.repo.secrets.local.mail) allMailAddresses; + inherit (confLib.getConfig.repo.secrets.local.work) mailAddress; - certsSopsFile = self + /secrets/repo/certs.yaml; - in - { - options.swarselmodules.optional-work = lib.swarselsystems.mkTrueOption; - config = { - home = { - packages = with pkgs; [ - stable.teams-for-linux - shellcheck - dig - docker - postman - # rclone - libguestfs-with-appliance - prometheus.cli - tigervnc - # openstackclient + certsSopsFile = self + /secrets/repo/certs.yaml; + in + { + options.swarselmodules.optional-work = lib.swarselsystems.mkTrueOption; + config = { + home = { + packages = with pkgs; [ + stable.teams-for-linux + shellcheck + dig + docker + postman + # rclone + libguestfs-with-appliance + prometheus.cli + tigervnc + # openstackclient - vscode - dev.antigravity + vscode + dev.antigravity - rustdesk-vbc - ]; - sessionVariables = { - AWS_CA_BUNDLE = confLib.getConfig.sops.secrets.harica-root-ca.path; - }; - }; - systemd.user.sessionVariables = { - DOCUMENT_DIR_WORK = lib.mkForce "${homeDir}/Documents/Work"; - } // lib.optionalAttrs (!config.swarselsystems.isPublic) { - SWARSEL_MAIL_ALL = lib.mkForce allMailAddresses; - SWARSEL_MAIL_WORK = lib.mkForce mailAddress; - }; - - accounts.email.accounts.work = - let - inherit (confLib.getConfig.repo.secrets.local.work) mailName; - in - { - primary = false; - address = mailAddress; - userName = mailAddress; - realName = mailName; - passwordCommand = "pizauth show work"; - imap = { - host = "outlook.office365.com"; - port = 993; - tls.enable = true; # SSL/TLS - }; - smtp = { - host = "outlook.office365.com"; - port = 587; - tls = { - enable = true; # SSL/TLS - useStartTls = true; - }; - }; - thunderbird = { - enable = true; - profiles = [ "default" ]; - settings = id: { - "mail.smtpserver.smtp_${id}.authMethod" = 10; # oauth - "mail.server.server_${id}.authMethod" = 10; # oauth - # "toolkit.telemetry.enabled" = false; - # "toolkit.telemetry.rejected" = true; - # "toolkit.telemetry.prompted" = 2; - }; - }; - msmtp = { - enable = true; - extraConfig = { - auth = "xoauth2"; - host = "outlook.office365.com"; - protocol = "smtp"; - port = "587"; - tls = "on"; - tls_starttls = "on"; - from = "${mailAddress}"; - user = "${mailAddress}"; - passwordeval = "pizauth show work"; - }; - }; - mu.enable = true; - mbsync = { - enable = true; - expunge = "both"; - patterns = [ "INBOX" ]; - extraConfig = { - account = { - AuthMechs = "XOAUTH2"; - }; - }; - }; - }; - - # wayland.windowManager.sway.config = { - # output = { - # "Applied Creative Technology Transmitter QUATTRO201811" = { - # bg = "${self}/files/wallpaper/navidrome.png ${config.stylix.imageScalingMode}"; - # }; - # "Hewlett Packard HP Z24i CN44250RDT" = { - # bg = "${self}/files/wallpaper/op6wp.png ${config.stylix.imageScalingMode}"; - # }; - # "HP Inc. HP 732pk CNC4080YL5" = { - # bg = "${self}/files/wallpaper/botanicswp.png ${config.stylix.imageScalingMode}"; - # }; - # }; - # }; - - wayland.windowManager.sway = - let - inherit (confLib.getConfig.repo.secrets.local.work) user1 user1Long domain1 mailAddress; - in - { - config = { - keybindings = - let - inherit (config.wayland.windowManager.sway.config) modifier; - in - { - "${modifier}+Shift+d" = "exec ${pkgs.quickpass}/bin/quickpass work/adm/${user1}/${user1Long}@${domain1}"; - "${modifier}+Shift+i" = "exec ${pkgs.quickpass}/bin/quickpass work/${mailAddress}"; - }; - }; - }; - - stylix = { - targets.firefox.profileNames = - let - inherit (confLib.getConfig.repo.secrets.local.work) user1 user2 user3; - in - [ - "${user1}" - "${user2}" - "${user3}" - "work" - ]; - }; - - programs = - let - inherit (confLib.getConfig.repo.secrets.local.work) user1 user1Long user2 user2Long user3 user3Long user4 path1 loc1 loc2 site1 site2 site3 site4 site5 site6 site7 lifecycle1 lifecycle2 domain1 domain2 gitMail clouds; - in - { - openstackclient = { - enable = true; - inherit clouds; - }; - awscli = { - enable = true; - package = pkgs.stable24_05.awscli2; - # settings = { - # "default" = { }; - # "profile s3-imagebuilder-prod" = { }; - # }; - # credentials = { - # "s3-imagebuilder-prod" = { - # aws_access_key_id = "5OYXY4879EJG9I91K1B6"; - # credential_process = "${pkgs.pass}/bin/pass show work/awscli/s3-imagebuilder-prod/secret-key"; - # }; - # }; - }; - git.settings.user.email = lib.mkForce gitMail; - - zsh = { - shellAliases = { - dssh = "ssh -l ${user1Long}"; - cssh = "ssh -l ${user2Long}"; - wssh = "ssh -l ${user3Long}"; - }; - cdpath = [ - "~/Documents/Work" + rustdesk-vbc ]; - dirHashes = { - d = "$HOME/.dotfiles"; - w = "$HOME/Documents/Work"; - s = "$HOME/.dotfiles/secrets"; - pr = "$HOME/Documents/Private"; - ac = path1; - }; - sessionVariables = { - VSPHERE_USER = "$(cat ${confLib.getConfig.sops.secrets.vcuser.path})"; - VSPHERE_PW = "$(cat ${confLib.getConfig.sops.secrets.vcpw.path})"; - GOVC_USERNAME = "$(cat ${confLib.getConfig.sops.secrets.govcuser.path})"; - GOVC_PASSWORD = "$(cat ${confLib.getConfig.sops.secrets.govcpw.path})"; - GOVC_URL = "$(cat ${confLib.getConfig.sops.secrets.govcurl.path})"; - GOVC_DATACENTER = "$(cat ${confLib.getConfig.sops.secrets.govcdc.path})"; - GOVC_DATASTORE = "$(cat ${confLib.getConfig.sops.secrets.govcds.path})"; - GOVC_HOST = "$(cat ${confLib.getConfig.sops.secrets.govchost.path})"; - GOVC_RESOURCE_POOL = "$(cat ${confLib.getConfig.sops.secrets.govcpool.path})"; - GOVC_NETWORK = "$(cat ${confLib.getConfig.sops.secrets.govcnetwork.path})"; + AWS_CA_BUNDLE = confLib.getConfig.sops.secrets.harica-root-ca.path; }; }; - - ssh = { - matchBlocks = { - "${loc1}" = { - hostname = "${loc1}.${domain2}"; - user = user4; - }; - "${loc1}.stg" = { - hostname = "${loc1}.${lifecycle1}.${domain2}"; - user = user4; - }; - "${loc1}.staging" = { - hostname = "${loc1}.${lifecycle1}.${domain2}"; - user = user4; - }; - "${loc1}.dev" = { - hostname = "${loc1}.${lifecycle2}.${domain2}"; - user = user4; - }; - "${loc2}" = { - hostname = "${loc2}.${domain1}"; - user = user1Long; - }; - "${loc2}.stg" = { - hostname = "${loc2}.${lifecycle1}.${domain2}"; - user = user1Long; - }; - "${loc2}.staging" = { - hostname = "${loc2}.${lifecycle1}.${domain2}"; - user = user1Long; - }; - "*.${domain1}" = { - user = user1Long; - }; - }; + systemd.user.sessionVariables = { + DOCUMENT_DIR_WORK = lib.mkForce "${homeDir}/Documents/Work"; + } // lib.optionalAttrs (!config.swarselsystems.isPublic) { + SWARSEL_MAIL_ALL = lib.mkForce allMailAddresses; + SWARSEL_MAIL_WORK = lib.mkForce mailAddress; }; - firefox = { - profiles = - let - isDefault = false; - in + accounts.email.accounts.work = + let + inherit (confLib.getConfig.repo.secrets.local.work) mailName; + in { - "${user1}" = lib.recursiveUpdate - { - inherit isDefault; - id = 1; - settings = { - "browser.startup.homepage" = "${site1}|${site2}"; + primary = false; + address = mailAddress; + userName = mailAddress; + realName = mailName; + passwordCommand = "pizauth show work"; + imap = { + host = "outlook.office365.com"; + port = 993; + tls.enable = true; # SSL/TLS + }; + smtp = { + host = "outlook.office365.com"; + port = 587; + tls = { + enable = true; # SSL/TLS + useStartTls = true; + }; + }; + thunderbird = { + enable = true; + profiles = [ "default" ]; + settings = id: { + "mail.smtpserver.smtp_${id}.authMethod" = 10; # oauth + "mail.server.server_${id}.authMethod" = 10; # oauth + # "toolkit.telemetry.enabled" = false; + # "toolkit.telemetry.rejected" = true; + # "toolkit.telemetry.prompted" = 2; + }; + }; + msmtp = { + enable = true; + extraConfig = { + auth = "xoauth2"; + host = "outlook.office365.com"; + protocol = "smtp"; + port = "587"; + tls = "on"; + tls_starttls = "on"; + from = "${mailAddress}"; + user = "${mailAddress}"; + passwordeval = "pizauth show work"; + }; + }; + mu.enable = true; + mbsync = { + enable = true; + expunge = "both"; + patterns = [ "INBOX" ]; + extraConfig = { + account = { + AuthMechs = "XOAUTH2"; }; - } - vars.firefox; - "${user2}" = lib.recursiveUpdate - { - inherit isDefault; - id = 2; - settings = { - "browser.startup.homepage" = "${site3}"; - }; - } - vars.firefox; - "${user3}" = lib.recursiveUpdate - { - inherit isDefault; - id = 3; - } - vars.firefox; - work = lib.recursiveUpdate - { - inherit isDefault; - id = 4; - settings = { - "browser.startup.homepage" = "${site4}|${site5}|${site6}|${site7}"; - }; - } - vars.firefox; + }; + }; }; + + # wayland.windowManager.sway.config = { + # output = { + # "Applied Creative Technology Transmitter QUATTRO201811" = { + # bg = "${self}/files/wallpaper/navidrome.png ${config.stylix.imageScalingMode}"; + # }; + # "Hewlett Packard HP Z24i CN44250RDT" = { + # bg = "${self}/files/wallpaper/op6wp.png ${config.stylix.imageScalingMode}"; + # }; + # "HP Inc. HP 732pk CNC4080YL5" = { + # bg = "${self}/files/wallpaper/botanicswp.png ${config.stylix.imageScalingMode}"; + # }; + # }; + # }; + + wayland.windowManager.sway = + let + inherit (confLib.getConfig.repo.secrets.local.work) user1 user1Long domain1 mailAddress; + in + { + config = { + keybindings = + let + inherit (config.wayland.windowManager.sway.config) modifier; + in + { + "${modifier}+Shift+d" = "exec ${pkgs.quickpass}/bin/quickpass work/adm/${user1}/${user1Long}@${domain1}"; + "${modifier}+Shift+i" = "exec ${pkgs.quickpass}/bin/quickpass work/${mailAddress}"; + }; + }; + }; + + stylix = { + targets.firefox.profileNames = + let + inherit (confLib.getConfig.repo.secrets.local.work) user1 user2 user3; + in + [ + "${user1}" + "${user2}" + "${user3}" + "work" + ]; }; - chromium = { + programs = + let + inherit (confLib.getConfig.repo.secrets.local.work) user1 user1Long user2 user2Long user3 user3Long user4 path1 loc1 loc2 site1 site2 site3 site4 site5 site6 site7 lifecycle1 lifecycle2 domain1 domain2 gitMail clouds; + in + { + openstackclient = { + enable = true; + inherit clouds; + }; + awscli = { + enable = true; + package = pkgs.stable24_05.awscli2; + # settings = { + # "default" = { }; + # "profile s3-imagebuilder-prod" = { }; + # }; + # credentials = { + # "s3-imagebuilder-prod" = { + # aws_access_key_id = "5OYXY4879EJG9I91K1B6"; + # credential_process = "${pkgs.pass}/bin/pass show work/awscli/s3-imagebuilder-prod/secret-key"; + # }; + # }; + }; + git.settings.user.email = lib.mkForce gitMail; + + zsh = { + shellAliases = { + dssh = "ssh -l ${user1Long}"; + cssh = "ssh -l ${user2Long}"; + wssh = "ssh -l ${user3Long}"; + }; + cdpath = [ + "~/Documents/Work" + ]; + dirHashes = { + d = "$HOME/.dotfiles"; + w = "$HOME/Documents/Work"; + s = "$HOME/.dotfiles/secrets"; + pr = "$HOME/Documents/Private"; + ac = path1; + }; + + sessionVariables = { + VSPHERE_USER = "$(cat ${confLib.getConfig.sops.secrets.vcuser.path})"; + VSPHERE_PW = "$(cat ${confLib.getConfig.sops.secrets.vcpw.path})"; + GOVC_USERNAME = "$(cat ${confLib.getConfig.sops.secrets.govcuser.path})"; + GOVC_PASSWORD = "$(cat ${confLib.getConfig.sops.secrets.govcpw.path})"; + GOVC_URL = "$(cat ${confLib.getConfig.sops.secrets.govcurl.path})"; + GOVC_DATACENTER = "$(cat ${confLib.getConfig.sops.secrets.govcdc.path})"; + GOVC_DATASTORE = "$(cat ${confLib.getConfig.sops.secrets.govcds.path})"; + GOVC_HOST = "$(cat ${confLib.getConfig.sops.secrets.govchost.path})"; + GOVC_RESOURCE_POOL = "$(cat ${confLib.getConfig.sops.secrets.govcpool.path})"; + GOVC_NETWORK = "$(cat ${confLib.getConfig.sops.secrets.govcnetwork.path})"; + }; + }; + + ssh = { + matchBlocks = { + "${loc1}" = { + hostname = "${loc1}.${domain2}"; + user = user4; + }; + "${loc1}.stg" = { + hostname = "${loc1}.${lifecycle1}.${domain2}"; + user = user4; + }; + "${loc1}.staging" = { + hostname = "${loc1}.${lifecycle1}.${domain2}"; + user = user4; + }; + "${loc1}.dev" = { + hostname = "${loc1}.${lifecycle2}.${domain2}"; + user = user4; + }; + "${loc2}" = { + hostname = "${loc2}.${domain1}"; + user = user1Long; + }; + "${loc2}.stg" = { + hostname = "${loc2}.${lifecycle1}.${domain2}"; + user = user1Long; + }; + "${loc2}.staging" = { + hostname = "${loc2}.${lifecycle1}.${domain2}"; + user = user1Long; + }; + "*.${domain1}" = { + user = user1Long; + }; + }; + }; + + firefox = { + profiles = + let + isDefault = false; + in + { + "${user1}" = lib.recursiveUpdate + { + inherit isDefault; + id = 1; + settings = { + "browser.startup.homepage" = "${site1}|${site2}"; + }; + } + vars.firefox; + "${user2}" = lib.recursiveUpdate + { + inherit isDefault; + id = 2; + settings = { + "browser.startup.homepage" = "${site3}"; + }; + } + vars.firefox; + "${user3}" = lib.recursiveUpdate + { + inherit isDefault; + id = 3; + } + vars.firefox; + work = lib.recursiveUpdate + { + inherit isDefault; + id = 4; + settings = { + "browser.startup.homepage" = "${site4}|${site5}|${site6}|${site7}"; + }; + } + vars.firefox; + }; + }; + + chromium = { + enable = true; + package = pkgs.chromium; + + extensions = [ + # 1password + "gejiddohjgogedgjnonbofjigllpkmbf" + # dark reader + "eimadpbcbfnmbkopoojfekhnkhdbieeh" + # ublock origin + "cjpalhdlnbpafiamejdnhcphjbkeiagm" + # i still dont care about cookies + "edibdbjcniadpccecjdfdjjppcpchdlm" + # browserpass + "naepdomgkenhinolocfifgehidddafch" + ]; + }; + }; + + services = { + kanshi = { + settings = [ + { + # seminary room + output = { + criteria = "Applied Creative Technology Transmitter QUATTRO201811"; + scale = 1.0; + mode = "1280x720"; + }; + } + { + # work side screen + output = { + criteria = "HP Inc. HP 732pk CNC4080YL5"; + scale = 1.0; + mode = "3840x2160"; + transform = "270"; + }; + } + # { + # # work side screen + # output = { + # criteria = "Hewlett Packard HP Z24i CN44250RDT"; + # scale = 1.0; + # mode = "1920x1200"; + # transform = "270"; + # }; + # } + { + # work main screen + output = { + criteria = "HP Inc. HP Z32 CN41212T55"; + scale = 1.0; + mode = "3840x2160"; + }; + } + { + profile = { + name = "lidopen"; + exec = [ + "${pkgs.swaybg}/bin/swaybg --output '${config.swarselsystems.sharescreen}' --image ${config.swarselsystems.wallpaper} --mode ${config.stylix.imageScalingMode}" + "${pkgs.swaybg}/bin/swaybg --output 'HP Inc. HP Z32 CN41212T55' --image ${self}/files/wallpaper/botanicswp.png --mode ${config.stylix.imageScalingMode}" + "${pkgs.swaybg}/bin/swaybg --output 'HP Inc. HP 732pk CNC4080YL5' --image ${self}/files/wallpaper/op6wp.png --mode ${config.stylix.imageScalingMode}" + ]; + outputs = [ + { + criteria = config.swarselsystems.sharescreen; + status = "enable"; + scale = 1.5; + position = "2560,0"; + } + { + criteria = "HP Inc. HP 732pk CNC4080YL5"; + scale = 1.0; + mode = "3840x2160"; + position = "-3440,-1050"; + transform = "270"; + } + { + criteria = "HP Inc. HP Z32 CN41212T55"; + scale = 1.0; + mode = "3840x2160"; + position = "-1280,0"; + } + ]; + }; + } + { + profile = + let + monitor = "Applied Creative Technology Transmitter QUATTRO201811"; + in + { + name = "lidopen"; + exec = [ + "${pkgs.swaybg}/bin/swaybg --output '${config.swarselsystems.sharescreen}' --image ${config.swarselsystems.wallpaper} --mode ${config.stylix.imageScalingMode}" + "${pkgs.swaybg}/bin/swaybg --output '${monitor}' --image ${self}/files/wallpaper/navidrome.png --mode ${config.stylix.imageScalingMode}" + "${pkgs.kanshare}/bin/kanshare ${config.swarselsystems.sharescreen} '${monitor}'" + ]; + outputs = [ + { + criteria = config.swarselsystems.sharescreen; + status = "enable"; + scale = 1.7; + position = "2560,0"; + } + { + criteria = "Applied Creative Technology Transmitter QUATTRO201811"; + scale = 1.0; + mode = "1280x720"; + position = "10000,10000"; + } + ]; + }; + } + { + profile = { + name = "lidclosed"; + exec = [ + "${pkgs.swaybg}/bin/swaybg --output 'HP Inc. HP Z32 CN41212T55' --image ${self}/files/wallpaper/botanicswp.png --mode ${config.stylix.imageScalingMode}" + "${pkgs.swaybg}/bin/swaybg --output 'HP Inc. HP 732pk CNC4080YL5' --image ${self}/files/wallpaper/op6wp.png --mode ${config.stylix.imageScalingMode}" + ]; + outputs = [ + { + criteria = config.swarselsystems.sharescreen; + status = "disable"; + } + { + criteria = "HP Inc. HP 732pk CNC4080YL5"; + scale = 1.0; + mode = "3840x2160"; + position = "-3440,-1050"; + transform = "270"; + } + { + criteria = "HP Inc. HP Z32 CN41212T55"; + scale = 1.0; + mode = "3840x2160"; + position = "-1280,0"; + } + ]; + }; + } + { + profile = + let + monitor = "Applied Creative Technology Transmitter QUATTRO201811"; + in + { + name = "lidclosed"; + exec = [ + "${pkgs.swaybg}/bin/swaybg --output '${monitor}' --image ${self}/files/wallpaper/navidrome.png --mode ${config.stylix.imageScalingMode}" + ]; + outputs = [ + { + criteria = config.swarselsystems.sharescreen; + status = "disable"; + } + { + criteria = "Applied Creative Technology Transmitter QUATTRO201811"; + scale = 1.0; + mode = "1280x720"; + position = "10000,10000"; + } + ]; + }; + } + ]; + }; + }; + + systemd.user.services = { + pizauth.Service = { + ExecStartPost = [ + "${pkgs.toybox}/bin/sleep 1" + "//bin/sh -c '${lib.getExe pkgs.pizauth} restore < ${homeDir}/.pizauth.state'" + ]; + }; + + teams-applet = { + Unit = { + Description = "teams applet"; + Requires = [ "graphical-session.target" ]; + After = [ + "graphical-session.target" + "tray.target" + ]; + PartOf = [ + "tray.target" + ]; + }; + + Install = { + WantedBy = [ "tray.target" ]; + }; + + Service = { + ExecStart = "${pkgs.stable.teams-for-linux}/bin/teams-for-linux --disableGpu=true --minimized=true --trayIconEnabled=true"; + }; + }; + + onepassword-applet = { + Unit = { + Description = "1password applet"; + Requires = [ "graphical-session.target" ]; + After = [ + "graphical-session.target" + "tray.target" + ]; + PartOf = [ + "tray.target" + ]; + }; + + Install = { + WantedBy = [ "tray.target" ]; + }; + + Service = { + ExecStart = "${pkgs._1password-gui-beta}/bin/1password"; + }; + }; + + }; + + services.pizauth = { enable = true; - package = pkgs.chromium; - - extensions = [ - # 1password - "gejiddohjgogedgjnonbofjigllpkmbf" - # dark reader - "eimadpbcbfnmbkopoojfekhnkhdbieeh" - # ublock origin - "cjpalhdlnbpafiamejdnhcphjbkeiagm" - # i still dont care about cookies - "edibdbjcniadpccecjdfdjjppcpchdlm" - # browserpass - "naepdomgkenhinolocfifgehidddafch" - ]; - }; - }; - - services = { - kanshi = { - settings = [ - { - # seminary room - output = { - criteria = "Applied Creative Technology Transmitter QUATTRO201811"; - scale = 1.0; - mode = "1280x720"; + extraConfig = '' + auth_notify_cmd = "if [[ \"$(notify-send -A \"Open $PIZAUTH_ACCOUNT\" -t 30000 'pizauth authorisation')\" == \"0\" ]]; then open \"$PIZAUTH_URL\"; fi"; + error_notify_cmd = "notify-send -t 90000 \"pizauth error for $PIZAUTH_ACCOUNT\" \"$PIZAUTH_MSG\""; + token_event_cmd = "pizauth dump > ${homeDir}/.pizauth.state"; + ''; + accounts = { + work = { + authUri = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize"; + tokenUri = "https://login.microsoftonline.com/common/oauth2/v2.0/token"; + clientId = "08162f7c-0fd2-4200-a84a-f25a4db0b584"; + clientSecret = "TxRBilcHdC6WGBee]fs?QR:SJ8nI[g82"; + scopes = [ + "https://outlook.office365.com/IMAP.AccessAsUser.All" + "https://outlook.office365.com/SMTP.Send" + "offline_access" + ]; + loginHint = "${confLib.getConfig.repo.secrets.local.work.mailAddress}"; }; - } - { - # work side screen - output = { - criteria = "HP Inc. HP 732pk CNC4080YL5"; - scale = 1.0; + }; + + }; + + xdg = + let + inherit (confLib.getConfig.repo.secrets.local.work) user1 user2 user3; + in + { + mimeApps = { + defaultApplications = { + "x-scheme-handler/msteams" = [ "teams-for-linux.desktop" ]; + }; + }; + desktopEntries = + let + terminal = false; + categories = [ "Application" ]; + icon = "firefox"; + in + { + firefox_work = { + name = "Firefox (work)"; + genericName = "Firefox work"; + exec = "firefox -p work"; + inherit terminal categories icon; + }; + "firefox_${user1}" = { + name = "Firefox (${user1})"; + genericName = "Firefox ${user1}"; + exec = "firefox -p ${user1}"; + inherit terminal categories icon; + }; + + "firefox_${user2}" = { + name = "Firefox (${user2})"; + genericName = "Firefox ${user2}"; + exec = "firefox -p ${user2}"; + inherit terminal categories icon; + }; + + "firefox_${user3}" = { + name = "Firefox (${user3})"; + genericName = "Firefox ${user3}"; + exec = "firefox -p ${user3}"; + inherit terminal categories icon; + }; + + + }; + }; + swarselsystems = { + startup = [ + # { command = "nextcloud --background"; } + # { command = "vesktop --start-minimized --enable-speech-dispatcher --ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime"; } + # { command = "element-desktop --hidden --enable-features=UseOzonePlatform --ozone-platform=wayland --disable-gpu-driver-bug-workarounds"; } + # { command = "anki"; } + # { command = "obsidian"; } + # { command = "nm-applet"; } + # { command = "feishin"; } + # { command = "teams-for-linux --disableGpu=true --minimized=true --trayIconEnabled=true"; } + # { command = "1password"; } + ]; + monitors = { + work_back_middle = rec { + name = "LG Electronics LG Ultra HD 0x000305A6"; + mode = "2560x1440"; + scale = "1"; + position = "5120,0"; + workspace = "1:一"; + # output = "DP-10"; + output = name; + }; + work_front_left = rec { + name = "LG Electronics LG Ultra HD 0x0007AB45"; + mode = "3840x2160"; + scale = "1"; + position = "5120,0"; + workspace = "1:一"; + # output = "DP-7"; + output = name; + }; + work_middle_middle_main = rec { + name = "HP Inc. HP Z32 CN41212T55"; + mode = "3840x2160"; + scale = "1"; + position = "-1280,0"; + workspace = "1:一"; + # output = "DP-3"; + output = name; + }; + # work_middle_middle_main = rec { + # name = "HP Inc. HP 732pk CNC4080YL5"; + # mode = "3840x2160"; + # scale = "1"; + # position = "-1280,0"; + # workspace = "11:M"; + # # output = "DP-8"; + # output = name; + # }; + work_middle_middle_side = rec { + name = "HP Inc. HP 732pk CNC4080YL5"; mode = "3840x2160"; transform = "270"; + scale = "1"; + position = "-3440,-1050"; + workspace = "12:S"; + # output = "DP-8"; + output = name; }; - } - # { - # # work side screen - # output = { - # criteria = "Hewlett Packard HP Z24i CN44250RDT"; - # scale = 1.0; - # mode = "1920x1200"; - # transform = "270"; - # }; - # } - { - # work main screen - output = { - criteria = "HP Inc. HP Z32 CN41212T55"; - scale = 1.0; - mode = "3840x2160"; + work_middle_middle_old = rec { + name = "Hewlett Packard HP Z24i CN44250RDT"; + mode = "1920x1200"; + transform = "270"; + scale = "1"; + position = "-2480,0"; + workspace = "12:S"; + # output = "DP-9"; + output = name; }; - } - { - profile = { - name = "lidopen"; - exec = [ - "${pkgs.swaybg}/bin/swaybg --output '${config.swarselsystems.sharescreen}' --image ${config.swarselsystems.wallpaper} --mode ${config.stylix.imageScalingMode}" - "${pkgs.swaybg}/bin/swaybg --output 'HP Inc. HP Z32 CN41212T55' --image ${self}/files/wallpaper/botanicswp.png --mode ${config.stylix.imageScalingMode}" - "${pkgs.swaybg}/bin/swaybg --output 'HP Inc. HP 732pk CNC4080YL5' --image ${self}/files/wallpaper/op6wp.png --mode ${config.stylix.imageScalingMode}" - ]; - outputs = [ - { - criteria = config.swarselsystems.sharescreen; - status = "enable"; - scale = 1.5; - position = "2560,0"; - } - { - criteria = "HP Inc. HP 732pk CNC4080YL5"; - scale = 1.0; - mode = "3840x2160"; - position = "-3440,-1050"; - transform = "270"; - } - { - criteria = "HP Inc. HP Z32 CN41212T55"; - scale = 1.0; - mode = "3840x2160"; - position = "-1280,0"; - } - ]; + work_seminary = rec { + name = "Applied Creative Technology Transmitter QUATTRO201811"; + mode = "1280x720"; + scale = "1"; + position = "10000,10000"; # i.e. this screen is inaccessible by moving the mouse + workspace = "14:T"; + # output = "DP-4"; + output = name; }; - } - { - profile = - let - monitor = "Applied Creative Technology Transmitter QUATTRO201811"; - in - { - name = "lidopen"; - exec = [ - "${pkgs.swaybg}/bin/swaybg --output '${config.swarselsystems.sharescreen}' --image ${config.swarselsystems.wallpaper} --mode ${config.stylix.imageScalingMode}" - "${pkgs.swaybg}/bin/swaybg --output '${monitor}' --image ${self}/files/wallpaper/navidrome.png --mode ${config.stylix.imageScalingMode}" - "${pkgs.kanshare}/bin/kanshare ${config.swarselsystems.sharescreen} '${monitor}'" - ]; - outputs = [ - { - criteria = config.swarselsystems.sharescreen; - status = "enable"; - scale = 1.7; - position = "2560,0"; - } - { - criteria = "Applied Creative Technology Transmitter QUATTRO201811"; - scale = 1.0; - mode = "1280x720"; - position = "10000,10000"; - } - ]; - }; - } - { - profile = { - name = "lidclosed"; - exec = [ - "${pkgs.swaybg}/bin/swaybg --output 'HP Inc. HP Z32 CN41212T55' --image ${self}/files/wallpaper/botanicswp.png --mode ${config.stylix.imageScalingMode}" - "${pkgs.swaybg}/bin/swaybg --output 'HP Inc. HP 732pk CNC4080YL5' --image ${self}/files/wallpaper/op6wp.png --mode ${config.stylix.imageScalingMode}" - ]; - outputs = [ - { - criteria = config.swarselsystems.sharescreen; - status = "disable"; - } - { - criteria = "HP Inc. HP 732pk CNC4080YL5"; - scale = 1.0; - mode = "3840x2160"; - position = "-3440,-1050"; - transform = "270"; - } - { - criteria = "HP Inc. HP Z32 CN41212T55"; - scale = 1.0; - mode = "3840x2160"; - position = "-1280,0"; - } - ]; + }; + inputs = { + "1133:45081:MX_Master_2S_Keyboard" = { + xkb_layout = "us"; + xkb_variant = "altgr-intl"; }; - } - { - profile = - let - monitor = "Applied Creative Technology Transmitter QUATTRO201811"; - in - { - name = "lidclosed"; - exec = [ - "${pkgs.swaybg}/bin/swaybg --output '${monitor}' --image ${self}/files/wallpaper/navidrome.png --mode ${config.stylix.imageScalingMode}" - ]; - outputs = [ - { - criteria = config.swarselsystems.sharescreen; - status = "disable"; - } - { - criteria = "Applied Creative Technology Transmitter QUATTRO201811"; - scale = 1.0; - mode = "1280x720"; - position = "10000,10000"; - } - ]; - }; - } - ]; - }; - }; + # "2362:628:PIXA3854:00_093A:0274_Touchpad" = { + # dwt = "enabled"; + # tap = "enabled"; + # natural_scroll = "enabled"; + # middle_emulation = "enabled"; + # drag_lock = "disabled"; + # }; + "1133:50504:Logitech_USB_Receiver" = { + xkb_layout = "us"; + xkb_variant = "altgr-intl"; + }; + "1133:45944:MX_KEYS_S" = { + xkb_layout = "us"; + xkb_variant = "altgr-intl"; + }; + }; - systemd.user.services = { - pizauth.Service = { - ExecStartPost = [ - "${pkgs.toybox}/bin/sleep 1" - "//bin/sh -c '${lib.getExe pkgs.pizauth} restore < ${homeDir}/.pizauth.state'" - ]; - }; - - teams-applet = { - Unit = { - Description = "teams applet"; - Requires = [ "tray.target" ]; - After = [ - "graphical-session.target" - "tray.target" - ]; - PartOf = [ "graphical-session.target" ]; }; - - Install = { - WantedBy = [ "graphical-session.target" ]; - }; - - Service = { - ExecStart = "${pkgs.stable.teams-for-linux}/bin/teams-for-linux --disableGpu=true --minimized=true --trayIconEnabled=true"; - }; - }; - - onepassword-applet = { - Unit = { - Description = "1password applet"; - Requires = [ "tray.target" ]; - After = [ - "graphical-session.target" - "tray.target" - ]; - PartOf = [ "graphical-session.target" ]; - }; - - Install = { - WantedBy = [ "graphical-session.target" ]; - }; - - Service = { - ExecStart = "${pkgs._1password-gui-beta}/bin/1password"; - }; - }; - - }; - - services.pizauth = { - enable = true; - extraConfig = '' - auth_notify_cmd = "if [[ \"$(notify-send -A \"Open $PIZAUTH_ACCOUNT\" -t 30000 'pizauth authorisation')\" == \"0\" ]]; then open \"$PIZAUTH_URL\"; fi"; - error_notify_cmd = "notify-send -t 90000 \"pizauth error for $PIZAUTH_ACCOUNT\" \"$PIZAUTH_MSG\""; - token_event_cmd = "pizauth dump > ${homeDir}/.pizauth.state"; - ''; - accounts = { - work = { - authUri = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize"; - tokenUri = "https://login.microsoftonline.com/common/oauth2/v2.0/token"; - clientId = "08162f7c-0fd2-4200-a84a-f25a4db0b584"; - clientSecret = "TxRBilcHdC6WGBee]fs?QR:SJ8nI[g82"; - scopes = [ - "https://outlook.office365.com/IMAP.AccessAsUser.All" - "https://outlook.office365.com/SMTP.Send" - "offline_access" - ]; - loginHint = "${confLib.getConfig.repo.secrets.local.work.mailAddress}"; - }; - }; - - }; - - xdg = - let - inherit (confLib.getConfig.repo.secrets.local.work) user1 user2 user3; - in - { - mimeApps = { - defaultApplications = { - "x-scheme-handler/msteams" = [ "teams-for-linux.desktop" ]; + } // lib.optionalAttrs (type != "nixos") { + sops.secrets = lib.mkIf (!config.swarselsystems.isPublic && !config.swarselsystems.isNixos) { + harica-root-ca = { + sopsFile = certsSopsFile; + path = "${homeDir}/.aws/certs/harica-root.pem"; + owner = mainUser; }; }; - desktopEntries = - let - terminal = false; - categories = [ "Application" ]; - icon = "firefox"; - in - { - firefox_work = { - name = "Firefox (work)"; - genericName = "Firefox work"; - exec = "firefox -p work"; - inherit terminal categories icon; - }; - "firefox_${user1}" = { - name = "Firefox (${user1})"; - genericName = "Firefox ${user1}"; - exec = "firefox -p ${user1}"; - inherit terminal categories icon; - }; - "firefox_${user2}" = { - name = "Firefox (${user2})"; - genericName = "Firefox ${user2}"; - exec = "firefox -p ${user2}"; - inherit terminal categories icon; - }; - - "firefox_${user3}" = { - name = "Firefox (${user3})"; - genericName = "Firefox ${user3}"; - exec = "firefox -p ${user3}"; - inherit terminal categories icon; - }; - - - }; - }; - swarselsystems = { - startup = [ - # { command = "nextcloud --background"; } - # { command = "vesktop --start-minimized --enable-speech-dispatcher --ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime"; } - # { command = "element-desktop --hidden --enable-features=UseOzonePlatform --ozone-platform=wayland --disable-gpu-driver-bug-workarounds"; } - # { command = "anki"; } - # { command = "obsidian"; } - # { command = "nm-applet"; } - # { command = "feishin"; } - # { command = "teams-for-linux --disableGpu=true --minimized=true --trayIconEnabled=true"; } - # { command = "1password"; } - ]; - monitors = { - work_back_middle = rec { - name = "LG Electronics LG Ultra HD 0x000305A6"; - mode = "2560x1440"; - scale = "1"; - position = "5120,0"; - workspace = "1:一"; - # output = "DP-10"; - output = name; - }; - work_front_left = rec { - name = "LG Electronics LG Ultra HD 0x0007AB45"; - mode = "3840x2160"; - scale = "1"; - position = "5120,0"; - workspace = "1:一"; - # output = "DP-7"; - output = name; - }; - work_middle_middle_main = rec { - name = "HP Inc. HP Z32 CN41212T55"; - mode = "3840x2160"; - scale = "1"; - position = "-1280,0"; - workspace = "1:一"; - # output = "DP-3"; - output = name; - }; - # work_middle_middle_main = rec { - # name = "HP Inc. HP 732pk CNC4080YL5"; - # mode = "3840x2160"; - # scale = "1"; - # position = "-1280,0"; - # workspace = "11:M"; - # # output = "DP-8"; - # output = name; - # }; - work_middle_middle_side = rec { - name = "HP Inc. HP 732pk CNC4080YL5"; - mode = "3840x2160"; - transform = "270"; - scale = "1"; - position = "-3440,-1050"; - workspace = "12:S"; - # output = "DP-8"; - output = name; - }; - work_middle_middle_old = rec { - name = "Hewlett Packard HP Z24i CN44250RDT"; - mode = "1920x1200"; - transform = "270"; - scale = "1"; - position = "-2480,0"; - workspace = "12:S"; - # output = "DP-9"; - output = name; - }; - work_seminary = rec { - name = "Applied Creative Technology Transmitter QUATTRO201811"; - mode = "1280x720"; - scale = "1"; - position = "10000,10000"; # i.e. this screen is inaccessible by moving the mouse - workspace = "14:T"; - # output = "DP-4"; - output = name; - }; - }; - inputs = { - "1133:45081:MX_Master_2S_Keyboard" = { - xkb_layout = "us"; - xkb_variant = "altgr-intl"; - }; - # "2362:628:PIXA3854:00_093A:0274_Touchpad" = { - # dwt = "enabled"; - # tap = "enabled"; - # natural_scroll = "enabled"; - # middle_emulation = "enabled"; - # drag_lock = "disabled"; - # }; - "1133:50504:Logitech_USB_Receiver" = { - xkb_layout = "us"; - xkb_variant = "altgr-intl"; - }; - "1133:45944:MX_KEYS_S" = { - xkb_layout = "us"; - xkb_variant = "altgr-intl"; - }; }; - }; - } // lib.optionalAttrs (type != "nixos") { - sops.secrets = lib.mkIf (!config.swarselsystems.isPublic && !config.swarselsystems.isNixos) { - harica-root-ca = { - sopsFile = certsSopsFile; - path = "${homeDir}/.aws/certs/harica-root.pem"; - owner = mainUser; - }; - }; - - }; - - } + } #+end_src @@ -27596,6 +28264,17 @@ In short, the options defined here are passed to the modules systems using =_mod _ = { }; }); + overrideTarget = target: let + inherit target; + in { + Unit = { + PartOf = lib.mkForce [ target ]; + After = lib.mkForce [ target ]; + Requires = lib.mkForce [ target ]; + }; + Install.WantedBy = lib.mkForce [ target ]; + }; + genNginx = { serviceAddress , serviceName @@ -28034,6 +28713,38 @@ The normal =command-not-found.sh= uses the outdated =nix-shell= commands as sugg } #+end_src +***** niri-resize +:PROPERTIES: +:CUSTOM_ID: h:82f4f414-749b-4d5a-aaaa-6e3ec15fbc3d +:END: + + +#+begin_src shell :tangle files/scripts/niri-resize.sh + WORKSPACE=$(niri msg -j workspaces | jq -r '.[] | select(.is_active == true) | .id') + + COUNT=$(niri msg -j windows | jq --argjson ws "$WORKSPACE" -r '.[] | select(.workspace_id == $ws and .is_floating == false) | .app_id' | wc -l) + + while [[ $COUNT == "0" || $COUNT == "2" ]]; do + COUNT=$(niri msg -j windows | jq --argjson ws "$WORKSPACE" -r '.[] | select(.workspace_id == $ws and .is_floating == false) | .app_id' | wc -l) + done + + if [[ $COUNT == "1" ]]; then + niri msg action maximize-column + fi +#+end_src + +#+RESULTS: + +#+begin_src nix-ts :tangle pkgs/flake/niri-resize/default.nix + { self, name, writeShellApplication, jq }: + writeShellApplication { + inherit name; + runtimeInputs = [ jq ]; + text = builtins.readFile "${self}/files/scripts/${name}.sh"; + } + +#+end_src + ***** swarselcheck :PROPERTIES: :CUSTOM_ID: h:82f4f414-749b-4d5a-aaaa-6e3ec15fbc3d @@ -28121,51 +28832,45 @@ This app checks for different apps that I keep around in the scratchpad for quic :CUSTOM_ID: h:96da8360-2d23-4e86-9602-415fbdb972af :END: -#+begin_src shell :tangle files/scripts/swarselcheck-niri.sh - while :; do - case ${1:-} in - -k | --kitty) - cmd=(sh -c 'kitty --app-id kittyterm -T kittyterm -o confirm_os_window_close=0 zellij attach --create kittyterm' '&') - searchapp="kittyterm" - ;; - -e | --element) - cmd=(element-desktop) - searchapp="Element" - ;; - -d | --vesktop) - cmd=(vesktop) - searchapp="vesktop" - ;; - -s | --spotifyplayer) - cmd=(sh -c 'kitty --add-id spotifytui -T spotifytui -o confirm_os_window_close=0 spotify_player' '&') - searchapp="spotifytui" - ;; - ,*) break ;; - esac - shift - done - - WIN_INFO=$(niri msg -j windows | jq --arg search "$searchapp" '.[] | select (.app_id | test($search)) | { id, is_focused, workspace_id }') - ID=$(echo "$WIN_INFO" | jq -r '.id // empty') - IS_FOCUSED=$(echo "$WIN_INFO" | jq -r '.is_focused // empty') - TARGET_MONITOR=$(niri msg -j workspaces | jq --arg search "" '.[] | select (.name != null and (.name | test($search))) | { output }' | jq -r '.output // empty') - CURRENT_WORKSPACE=$(niri msg -j workspaces | jq -r '.[] | select (.is_active == true) | .output // empty') - - if [ -z "$ID" ]; then - niri msg action spawn -- "${cmd[@]}" - elif [ "$IS_FOCUSED" ]; then - niri msg action move-window-to-workspace "" --window-id "$ID" --focus false - else - niri msg action focus-monitor "$TARGET_MONITOR" && niri msg action move-window-to-workspace "$CURRENT_WORKSPACE" --window-id "$ID" && niri msg action focus-floating - fi -#+end_src - #+begin_src nix-ts :tangle pkgs/flake/swarselcheck-niri/default.nix { self, name, writeShellApplication, kitty, element-desktop, vesktop, spotify-player, jq }: writeShellApplication { inherit name; runtimeInputs = [ kitty element-desktop vesktop spotify-player jq ]; - text = builtins.readFile "${self}/files/scripts/${name}.sh"; + text = '' + while :; do + case ''${1:-} in + -k | --kitty) + cmd=(sh -c 'kitty --app-id kittyterm -T kittyterm -o confirm_os_window_close=0 zellij --config ${self}/files/zellij/config-kittyterm.kdl attach --create kittyterm' '&') + searchapp="kittyterm" + ;; + -e | --element) + cmd=(element-desktop) + searchapp="Element" + ;; + -d | --vesktop) + cmd=(vesktop) + searchapp="vesktop" + ;; + -s | --spotifyplayer) + cmd=(sh -c 'kitty --add-id spotifytui -T spotifytui -o confirm_os_window_close=0 spotify_player' '&') + searchapp="spotifytui" + ;; + ,*) break ;; + esac + shift + done + + WIN_INFO=$(niri msg -j windows | jq --arg search "$searchapp" '.[] | select (.app_id | test($search)) | { id, is_focused, workspace_id }') + ID=$(echo "$WIN_INFO" | jq -r '.id // empty') + + if [ -z "$ID" ]; then + niri msg action spawn -- "''${cmd[@]}" + else + niri msg action close-window --id "$ID" + fi + + ''; } #+end_src @@ -29720,7 +30425,7 @@ This script allows for quick git replace of a string. ;; -r | --repo) shift - target_repo=rue + target_repo=true ;; -d | --directory) shift @@ -36156,353 +36861,577 @@ in '' #+end_src -** Zellij config.kdl.nix +** Zellij kittyterm config.kdl :PROPERTIES: :CUSTOM_ID: h:ae07e867-fc17-4dd7-bd21-5886265308ee :END: -#+begin_src nix-ts :tangle files/zellij/config.kdl.nix - { config }: - '' - pane_frames false - simplified_ui false - default_shell "zsh" - copy_on_select true - on_force_close "detach" - show_startup_tips false - - default_layout "default" - layout_dir "${config.home.homeDirectory}/.config/zellij/layouts" - theme_dir "${config.home.homeDirectory}/.config/zellij/themes" - - keybinds clear-defaults=true { - locked { - bind "Ctrl g" { SwitchToMode "normal"; } - } - pane { - bind "left" { MoveFocus "left"; } - bind "down" { MoveFocus "down"; } - bind "up" { MoveFocus "up"; } - bind "right" { MoveFocus "right"; } - bind "c" { SwitchToMode "renamepane"; PaneNameInput 0; } - bind "d" { NewPane "down"; SwitchToMode "normal"; } - bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "normal"; } - bind "f" { ToggleFocusFullscreen; SwitchToMode "normal"; } - bind "h" { MoveFocus "left"; } - bind "j" { MoveFocus "down"; } - bind "k" { MoveFocus "up"; } - bind "l" { MoveFocus "right"; } - bind "n" { NewPane; SwitchToMode "normal"; } - bind "p" { SwitchFocus; } - bind "Ctrl p" { SwitchToMode "normal"; } - bind "r" { NewPane "right"; SwitchToMode "normal"; } - bind "w" { ToggleFloatingPanes; SwitchToMode "normal"; } - bind "z" { TogglePaneFrames; SwitchToMode "normal"; } - } - tab { - bind "left" { GoToPreviousTab; } - bind "down" { GoToNextTab; } - bind "up" { GoToPreviousTab; } - bind "right" { GoToNextTab; } - bind "1" { GoToTab 1; SwitchToMode "normal"; } - bind "2" { GoToTab 2; SwitchToMode "normal"; } - bind "3" { GoToTab 3; SwitchToMode "normal"; } - bind "4" { GoToTab 4; SwitchToMode "normal"; } - bind "5" { GoToTab 5; SwitchToMode "normal"; } - bind "6" { GoToTab 6; SwitchToMode "normal"; } - bind "7" { GoToTab 7; SwitchToMode "normal"; } - bind "8" { GoToTab 8; SwitchToMode "normal"; } - bind "9" { GoToTab 9; SwitchToMode "normal"; } - bind "[" { BreakPaneLeft; SwitchToMode "normal"; } - bind "]" { BreakPaneRight; SwitchToMode "normal"; } - bind "b" { BreakPane; SwitchToMode "normal"; } - bind "h" { GoToPreviousTab; } - bind "j" { GoToNextTab; } - bind "k" { GoToPreviousTab; } - bind "l" { GoToNextTab; } - bind "n" { NewTab; SwitchToMode "normal"; } - bind "r" { SwitchToMode "renametab"; TabNameInput 0; } - bind "s" { ToggleActiveSyncTab; SwitchToMode "normal"; } - bind "Ctrl t" { SwitchToMode "normal"; } - bind "x" { CloseTab; SwitchToMode "normal"; } - bind "tab" { ToggleTab; } - } - resize { - bind "left" { Resize "Increase left"; } - bind "down" { Resize "Increase down"; } - bind "up" { Resize "Increase up"; } - bind "right" { Resize "Increase right"; } - bind "+" { Resize "Increase"; } - bind "-" { Resize "Decrease"; } - bind "=" { Resize "Increase"; } - bind "H" { Resize "Decrease left"; } - bind "J" { Resize "Decrease down"; } - bind "K" { Resize "Decrease up"; } - bind "L" { Resize "Decrease right"; } - bind "h" { Resize "Increase left"; } - bind "j" { Resize "Increase down"; } - bind "k" { Resize "Increase up"; } - bind "l" { Resize "Increase right"; } - bind "Ctrl n" { SwitchToMode "normal"; } - } - move { - bind "left" { MovePane "left"; } - bind "down" { MovePane "down"; } - bind "up" { MovePane "up"; } - bind "right" { MovePane "right"; } - bind "h" { MovePane "left"; } - bind "Ctrl h" { SwitchToMode "normal"; } - bind "j" { MovePane "down"; } - bind "k" { MovePane "up"; } - bind "l" { MovePane "right"; } - bind "n" { MovePane; } - bind "p" { MovePaneBackwards; } - bind "tab" { MovePane; } - } - scroll { - bind "e" { EditScrollback; SwitchToMode "normal"; } - bind "s" { SwitchToMode "entersearch"; SearchInput 0; } - } - search { - bind "c" { SearchToggleOption "CaseSensitivity"; } - bind "n" { Search "down"; } - bind "o" { SearchToggleOption "WholeWord"; } - bind "p" { Search "up"; } - bind "w" { SearchToggleOption "Wrap"; } - } - session { - bind "c" { - LaunchOrFocusPlugin "configuration" { - floating true - move_to_focused_tab true - } - SwitchToMode "normal" - } - bind "Ctrl o" { SwitchToMode "normal"; } - bind "p" { - LaunchOrFocusPlugin "plugin-manager" { - floating true - move_to_focused_tab true - } - SwitchToMode "normal" - } - bind "w" { - LaunchOrFocusPlugin "session-manager" { - floating true - move_to_focused_tab true - } - SwitchToMode "normal" - } - } - shared_except "locked" { - bind "Alt left" { MoveFocusOrTab "left"; } - bind "Alt down" { MoveFocus "down"; } - bind "Alt up" { MoveFocus "up"; } - bind "Alt right" { MoveFocusOrTab "right"; } - bind "Alt +" { Resize "Increase"; } - bind "Alt -" { Resize "Decrease"; } - bind "Alt =" { Resize "Increase"; } - bind "Alt [" { PreviousSwapLayout; } - bind "Alt ]" { NextSwapLayout; } - bind "Alt f" { ToggleFloatingPanes; } - bind "Ctrl g" { SwitchToMode "locked"; } - bind "Alt h" { MoveFocusOrTab "left"; } - bind "Alt i" { MoveTab "left"; } - bind "Alt j" { MoveFocus "down"; } - bind "Alt k" { MoveFocus "up"; } - bind "Alt l" { MoveFocusOrTab "right"; } - bind "Alt n" { NewPane; } - bind "Alt o" { MoveTab "right"; } - bind "Ctrl q" { Quit; } - } - shared_except "locked" "move" { - bind "Ctrl h" { SwitchToMode "move"; } - } - shared_except "locked" "session" { - bind "Ctrl o" { SwitchToMode "session"; } - } - shared_except "locked" "scroll" "search" "tmux" { - bind "Ctrl b" { SwitchToMode "tmux"; } - } - shared_except "locked" "scroll" "search" { - bind "Ctrl s" { SwitchToMode "scroll"; } - } - shared_except "locked" "tab" { - bind "Ctrl t" { SwitchToMode "tab"; } - } - shared_except "locked" "pane" { - bind "Ctrl p" { SwitchToMode "pane"; } - } - shared_except "locked" "resize" { - bind "Ctrl n" { SwitchToMode "resize"; } - } - shared_except "normal" "locked" "entersearch" { - bind "enter" { SwitchToMode "normal"; } - } - shared_except "normal" "locked" "entersearch" "renametab" "renamepane" { - bind "esc" { SwitchToMode "normal"; } - } - shared_among "pane" "tmux" { - bind "x" { CloseFocus; SwitchToMode "normal"; } - } - shared_among "scroll" "search" { - bind "PageDown" { PageScrollDown; } - bind "PageUp" { PageScrollUp; } - bind "left" { PageScrollUp; } - bind "down" { ScrollDown; } - bind "up" { ScrollUp; } - bind "right" { PageScrollDown; } - bind "Ctrl b" { PageScrollUp; } - bind "Ctrl c" { ScrollToBottom; SwitchToMode "normal"; } - bind "d" { HalfPageScrollDown; } - bind "Ctrl f" { PageScrollDown; } - bind "h" { PageScrollUp; } - bind "j" { ScrollDown; } - bind "k" { ScrollUp; } - bind "l" { PageScrollDown; } - bind "Ctrl s" { SwitchToMode "normal"; } - bind "u" { HalfPageScrollUp; } - } - entersearch { - bind "Ctrl c" { SwitchToMode "scroll"; } - bind "esc" { SwitchToMode "scroll"; } - bind "enter" { SwitchToMode "search"; } - } - renametab { - bind "esc" { UndoRenameTab; SwitchToMode "tab"; } - } - shared_among "renametab" "renamepane" { - bind "Ctrl c" { SwitchToMode "normal"; } - } - renamepane { - bind "esc" { UndoRenamePane; SwitchToMode "pane"; } - } - shared_among "session" "tmux" { - bind "d" { Detach; } - } - tmux { - bind "left" { MoveFocus "left"; SwitchToMode "normal"; } - bind "down" { MoveFocus "down"; SwitchToMode "normal"; } - bind "up" { MoveFocus "up"; SwitchToMode "normal"; } - bind "right" { MoveFocus "right"; SwitchToMode "normal"; } - bind "space" { NextSwapLayout; } - bind "\"" { NewPane "down"; SwitchToMode "normal"; } - bind "%" { NewPane "right"; SwitchToMode "normal"; } - bind "," { SwitchToMode "renametab"; } - bind "[" { SwitchToMode "scroll"; } - bind "Ctrl b" { Write 2; SwitchToMode "normal"; } - bind "c" { NewTab; SwitchToMode "normal"; } - bind "h" { MoveFocus "left"; SwitchToMode "normal"; } - bind "j" { MoveFocus "down"; SwitchToMode "normal"; } - bind "k" { MoveFocus "up"; SwitchToMode "normal"; } - bind "l" { MoveFocus "right"; SwitchToMode "normal"; } - bind "n" { GoToNextTab; SwitchToMode "normal"; } - bind "o" { FocusNextPane; } - bind "p" { GoToPreviousTab; SwitchToMode "normal"; } - bind "z" { ToggleFocusFullscreen; SwitchToMode "normal"; } - } - } - - // Plugin aliases - can be used to change the implementation of Zellij - // changing these requires a restart to take effect - plugins { - compact-bar location="zellij:compact-bar" - configuration location="zellij:configuration" - filepicker location="zellij:strider" { - cwd "/" - } - plugin-manager location="zellij:plugin-manager" - session-manager location="zellij:session-manager" - status-bar location="zellij:status-bar" - strider location="zellij:strider" - tab-bar location="zellij:tab-bar" - welcome-screen location="zellij:session-manager" { - welcome_screen true - } - } - - // Plugins to load in the background when a new session starts - // eg. "file:/path/to/my-plugin.wasm" - // eg. "https://example.com/my-plugin.wasm" - load_plugins { - } - - // Provide a command to execute when copying text. The text will be piped to - // the stdin of the program to perform the copy. This can be used with - // terminal emulators which do not support the OSC 52 ANSI control sequence - // that will be used by default if this option is not set. - // Examples: - // - // copy_command "xclip -selection clipboard" // x11 - // copy_command "wl-copy" // wayland - // copy_command "pbcopy" // osx - // - // copy_command "pbcopy" - - // Choose the destination for copied text - // Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. - // Does not apply when using copy_command. - // Options: - // - system (default) - // - primary - // - // copy_clipboard "primary" - - // Path to the default editor to use to edit pane scrollbuffer - // Default: $EDITOR or $VISUAL - // scrollback_editor "/usr/bin/vim" - - // Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible - // Options: - // - true (default) - // - false - // - // auto_layout false - - // Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected - // Options: - // - true (default) - // - false - // - // session_serialization false - - // Whether pane viewports are serialized along with the session, default is false - // Options: - // - true - // - false (default) - // - // serialize_pane_viewport false - - // Scrollback lines to serialize along with the pane viewport when serializing sessions, 0 - // defaults to the scrollback size. If this number is higher than the scrollback size, it will - // also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true. - // - // scrollback_lines_to_serialize 10000 - - // Enable or disable the rendering of styled and colored underlines (undercurl). - // May need to be disabled for certain unsupported terminals - // (Requires restart) - // Default: true - // - // styled_underlines false - - // How often in seconds sessions are serialized - // - // serialization_interval 10000 - - // Enable or disable writing of session metadata to disk (if disabled, other sessions might not know - // metadata info on this session) - // (Requires restart) - // Default: false - // - // disable_session_metadata false - - // Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it) - // (Requires restart) - // Default: true (if the host terminal supports it) - // - // support_kitty_keyboard_protocol false - '' +#+begin_src nix-ts :tangle files/zellij/config-kittyterm.kdl +copy_command "wl-copy" +copy_on_select true +default_layout "swarsel" +default_shell "zsh" +keybinds clear-defaults=true { + entersearch { + bind "Ctrl c" { + SwitchToMode "scroll" + } + bind "esc" { + SwitchToMode "scroll" + } + bind "enter" { + SwitchToMode "search" + } + } + locked { + bind "Ctrl g" { + SwitchToMode "normal" + } + } + move { + bind "Ctrl h" { + SwitchToMode "normal" + } + bind "left" { + MovePane "left" + } + bind "down" { + MovePane "down" + } + bind "up" { + MovePane "up" + } + bind "right" { + MovePane "right" + } + bind "h" { + MovePane "left" + } + bind "j" { + MovePane "down" + } + bind "k" { + MovePane "up" + } + bind "l" { + MovePane "right" + } + } + pane { + bind "Ctrl p" { + SwitchToMode "normal" + } + bind "left" { + MoveFocus "left" + } + bind "down" { + MoveFocus "down" + } + bind "up" { + MoveFocus "up" + } + bind "right" { + MoveFocus "right" + } + bind "h" { + MoveFocus "left" + } + bind "j" { + MoveFocus "down" + } + bind "k" { + MoveFocus "up" + } + bind "l" { + MoveFocus "right" + } + bind "d" { + NewPane "down" + SwitchToMode "normal" + } + bind "e" { + TogglePaneEmbedOrFloating + SwitchToMode "normal" + } + bind "f" { + ToggleFocusFullscreen + SwitchToMode "normal" + } + bind "n" { + NewPane + SwitchToMode "normal" + } + bind "p" { + SwitchFocus + } + bind "f12" { + ToggleFloatingPanes + SwitchToMode "normal" + } + } + renamepane { + bind "esc" { + UndoRenamePane + SwitchToMode "pane" + } + } + renametab { + bind "esc" { + UndoRenameTab + SwitchToMode "tab" + } + } + resize { + bind "Ctrl n" { + SwitchToMode "normal" + } + bind "left" { + Resize "Increase left" + } + bind "down" { + Resize "Increase down" + } + bind "up" { + Resize "Increase up" + } + bind "right" { + Resize "Increase right" + } + bind "+" { + Resize "Increase" + } + bind "-" { + Resize "Decrease" + } + bind "=" { + Resize "Increase" + } + bind "H" { + Resize "Decrease left" + } + bind "J" { + Resize "Decrease down" + } + bind "K" { + Resize "Decrease up" + } + bind "L" { + Resize "Decrease right" + } + bind "h" { + Resize "Increase left" + } + bind "j" { + Resize "Increase down" + } + bind "k" { + Resize "Increase up" + } + bind "l" { + Resize "Increase right" + } + } + scroll { + bind "e" { + EditScrollback + SwitchToMode "normal" + } + bind "s" { + SwitchToMode "entersearch" + SearchInput 0 + } + } + search { + bind "c" { + SearchToggleOption "CaseSensitivity" + } + bind "n" { + Search "down" + } + bind "o" { + SearchToggleOption "WholeWord" + } + bind "p" { + Search "up" + } + bind "w" { + SearchToggleOption "Wrap" + } + } + session { + bind "Ctrl o" { + SwitchToMode "normal" + } + bind "c" { + LaunchOrFocusPlugin "configuration" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + bind "p" { + LaunchOrFocusPlugin "plugin-manager" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + bind "w" { + LaunchOrFocusPlugin "session-manager" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + } + shared_among "pane" "tmux" { + bind "x" { + CloseFocus + SwitchToMode "normal" + } + } + shared_among "renametab" "renamepane" { + bind "Ctrl c" { + SwitchToMode "normal" + } + } + shared_among "scroll" "search" { + bind "PageDown" { + PageScrollDown + } + bind "PageUp" { + PageScrollUp + } + bind "left" { + PageScrollUp + } + bind "down" { + ScrollDown + } + bind "up" { + ScrollUp + } + bind "right" { + PageScrollDown + } + bind "Ctrl b" { + PageScrollUp + } + bind "Ctrl c" { + ScrollToBottom + SwitchToMode "normal" + } + bind "d" { + HalfPageScrollDown + } + bind "Ctrl f" { + PageScrollDown + } + bind "h" { + PageScrollUp + } + bind "j" { + ScrollDown + } + bind "k" { + ScrollUp + } + bind "l" { + PageScrollDown + } + bind "Ctrl s" { + SwitchToMode "normal" + } + bind "u" { + HalfPageScrollUp + } + } + shared_among "session" "tmux" { + bind "d" { + Detach + } + } + shared_except "locked" { + bind "Alt left" { + MoveFocusOrTab "left" + } + bind "Alt down" { + MoveFocus "down" + } + bind "Alt up" { + MoveFocus "up" + } + bind "Alt right" { + MoveFocusOrTab "right" + } + bind "Alt +" { + Resize "Increase" + } + bind "Alt -" { + Resize "Decrease" + } + bind "Alt =" { + Resize "Increase" + } + bind "Alt r" { + WriteChars "source cdr" + WriteChars "\n" + } + bind "Alt f" { + ToggleFloatingPanes + } + bind "Ctrl g" { + SwitchToMode "locked" + } + bind "Alt h" { + MoveFocusOrTab "left" + } + bind "Alt i" { + MoveTab "left" + } + bind "Alt j" { + MoveFocus "down" + } + bind "Alt k" { + MoveFocus "up" + } + bind "Alt p" { + NewPane + } + bind "Alt n" { + NewTab + } + } + shared_except "locked" "move" { + bind "Ctrl h" { + SwitchToMode "move" + } + } + shared_except "locked" "pane" { + bind "Ctrl p" { + SwitchToMode "pane" + } + } + shared_except "locked" "resize" { + bind "Ctrl n" { + SwitchToMode "resize" + } + } + shared_except "locked" "scroll" "search" { + bind "Ctrl s" { + SwitchToMode "scroll" + } + } + shared_except "locked" "scroll" "search" "tmux" { + bind "Ctrl b" { + SwitchToMode "tmux" + } + } + shared_except "locked" "session" { + bind "Ctrl o" { + SwitchToMode "session" + } + } + shared_except "locked" "tab" { + bind "Ctrl t" { + SwitchToMode "tab" + } + } + shared_except "normal" "locked" "entersearch" { + bind "enter" { + SwitchToMode "normal" + } + } + shared_except "normal" "locked" "entersearch" "renametab" "renamepane" { + bind "esc" { + SwitchToMode "normal" + } + } + tab { + bind "Ctrl t" { + SwitchToMode "normal" + } + bind "left" { + GoToPreviousTab + } + bind "down" { + GoToNextTab + } + bind "up" { + GoToPreviousTab + } + bind "right" { + GoToNextTab + } + bind "1" { + GoToTab 1 + SwitchToMode "normal" + } + bind "2" { + GoToTab 2 + SwitchToMode "normal" + } + bind "3" { + GoToTab 3 + SwitchToMode "normal" + } + bind "4" { + GoToTab 4 + SwitchToMode "normal" + } + bind "5" { + GoToTab 5 + SwitchToMode "normal" + } + bind "6" { + GoToTab 6 + SwitchToMode "normal" + } + bind "7" { + GoToTab 7 + SwitchToMode "normal" + } + bind "8" { + GoToTab 8 + SwitchToMode "normal" + } + bind "9" { + GoToTab 9 + SwitchToMode "normal" + } + bind "h" { + GoToPreviousTab + } + bind "j" { + GoToNextTab + } + bind "k" { + GoToPreviousTab + } + bind "l" { + GoToNextTab + } + bind "n" { + NewTab + SwitchToMode "normal" + } + bind "r" { + SwitchToMode "renametab" + TabNameInput 0 + } + bind "s" { + ToggleActiveSyncTab + SwitchToMode "normal" + } + bind "x" { + CloseTab + SwitchToMode "normal" + } + } + tmux { + bind "left" { + MoveFocus "left" + SwitchToMode "normal" + } + bind "down" { + MoveFocus "down" + SwitchToMode "normal" + } + bind "up" { + MoveFocus "up" + SwitchToMode "normal" + } + bind "right" { + MoveFocus "right" + SwitchToMode "normal" + } + bind "space" { + NextSwapLayout + } + bind "\"" { + NewPane "down" + SwitchToMode "normal" + } + bind "%" { + NewPane "right" + SwitchToMode "normal" + } + bind "," { + SwitchToMode "renametab" + } + bind "[" { + SwitchToMode "scroll" + } + bind "Ctrl b" { + Write 2 + SwitchToMode "normal" + } + bind "c" { + NewTab + SwitchToMode "normal" + } + bind "h" { + MoveFocus "left" + SwitchToMode "normal" + } + bind "j" { + MoveFocus "down" + SwitchToMode "normal" + } + bind "k" { + MoveFocus "up" + SwitchToMode "normal" + } + bind "l" { + MoveFocus "right" + SwitchToMode "normal" + } + bind "n" { + GoToNextTab + SwitchToMode "normal" + } + bind "o" { + FocusNextPane + } + bind "p" { + GoToPreviousTab + SwitchToMode "normal" + } + bind "z" { + ToggleFocusFullscreen + SwitchToMode "normal" + } + } +} +layout_dir "/home/swarsel/.config/zellij/layouts" +on_force_close "detach" +pane_frames false +plugins { + compact-bar { + path "compact-bar" + } + status-bar { + path "status-bar" + } + strider { + path "strider" + } + tab-bar { + path "tab-bar" + } +} +scrollback_lines_to_serialize 100000 +session_serialization true +show_startup_tips false +simplified_ui false +support_kitty_keyboard_protocol true +theme_dir "/home/swarsel/.config/zellij/themes" +ui { + pane_frames { + hide_session_name true + rounded_corners true + } +} #+end_src ** Vieb config diff --git a/files/scripts/niri-resize.sh b/files/scripts/niri-resize.sh new file mode 100644 index 0000000..e8dbdbc --- /dev/null +++ b/files/scripts/niri-resize.sh @@ -0,0 +1,11 @@ +WORKSPACE=$(niri msg -j workspaces | jq -r '.[] | select(.is_active == true) | .id') + +COUNT=$(niri msg -j windows | jq --argjson ws "$WORKSPACE" -r '.[] | select(.workspace_id == $ws and .is_floating == false) | .app_id' | wc -l) + +while [[ $COUNT == "0" || $COUNT == "2" ]]; do + COUNT=$(niri msg -j windows | jq --argjson ws "$WORKSPACE" -r '.[] | select(.workspace_id == $ws and .is_floating == false) | .app_id' | wc -l) +done + +if [[ $COUNT == "1" ]]; then + niri msg action maximize-column +fi diff --git a/files/scripts/swarselcheck-niri.sh b/files/scripts/swarselcheck-niri.sh deleted file mode 100644 index 6bfb966..0000000 --- a/files/scripts/swarselcheck-niri.sh +++ /dev/null @@ -1,36 +0,0 @@ -while :; do - case ${1:-} in - -k | --kitty) - cmd=(sh -c 'kitty --app-id kittyterm -T kittyterm -o confirm_os_window_close=0 zellij attach --create kittyterm' '&') - searchapp="kittyterm" - ;; - -e | --element) - cmd=(element-desktop) - searchapp="Element" - ;; - -d | --vesktop) - cmd=(vesktop) - searchapp="vesktop" - ;; - -s | --spotifyplayer) - cmd=(sh -c 'kitty --add-id spotifytui -T spotifytui -o confirm_os_window_close=0 spotify_player' '&') - searchapp="spotifytui" - ;; - *) break ;; - esac - shift -done - -WIN_INFO=$(niri msg -j windows | jq --arg search "$searchapp" '.[] | select (.app_id | test($search)) | { id, is_focused, workspace_id }') -ID=$(echo "$WIN_INFO" | jq -r '.id // empty') -IS_FOCUSED=$(echo "$WIN_INFO" | jq -r '.is_focused // empty') -TARGET_MONITOR=$(niri msg -j workspaces | jq --arg search "" '.[] | select (.name != null and (.name | test($search))) | { output }' | jq -r '.output // empty') -CURRENT_WORKSPACE=$(niri msg -j workspaces | jq -r '.[] | select (.is_active == true) | .output // empty') - -if [ -z "$ID" ]; then - niri msg action spawn -- "${cmd[@]}" -elif [ "$IS_FOCUSED" ]; then - niri msg action move-window-to-workspace "" --window-id "$ID" --focus false -else - niri msg action focus-monitor "$TARGET_MONITOR" && niri msg action move-window-to-workspace "$CURRENT_WORKSPACE" --window-id "$ID" && niri msg action focus-floating -fi diff --git a/files/zellij/config-kittyterm.kdl b/files/zellij/config-kittyterm.kdl new file mode 100644 index 0000000..1ebb1af --- /dev/null +++ b/files/zellij/config-kittyterm.kdl @@ -0,0 +1,565 @@ +copy_command "wl-copy" +copy_on_select true +default_layout "swarsel" +default_shell "zsh" +keybinds clear-defaults=true { + entersearch { + bind "Ctrl c" { + SwitchToMode "scroll" + } + bind "esc" { + SwitchToMode "scroll" + } + bind "enter" { + SwitchToMode "search" + } + } + locked { + bind "Ctrl g" { + SwitchToMode "normal" + } + } + move { + bind "Ctrl h" { + SwitchToMode "normal" + } + bind "left" { + MovePane "left" + } + bind "down" { + MovePane "down" + } + bind "up" { + MovePane "up" + } + bind "right" { + MovePane "right" + } + bind "h" { + MovePane "left" + } + bind "j" { + MovePane "down" + } + bind "k" { + MovePane "up" + } + bind "l" { + MovePane "right" + } + } + pane { + bind "Ctrl p" { + SwitchToMode "normal" + } + bind "left" { + MoveFocus "left" + } + bind "down" { + MoveFocus "down" + } + bind "up" { + MoveFocus "up" + } + bind "right" { + MoveFocus "right" + } + bind "h" { + MoveFocus "left" + } + bind "j" { + MoveFocus "down" + } + bind "k" { + MoveFocus "up" + } + bind "l" { + MoveFocus "right" + } + bind "d" { + NewPane "down" + SwitchToMode "normal" + } + bind "e" { + TogglePaneEmbedOrFloating + SwitchToMode "normal" + } + bind "f" { + ToggleFocusFullscreen + SwitchToMode "normal" + } + bind "n" { + NewPane + SwitchToMode "normal" + } + bind "p" { + SwitchFocus + } + bind "f12" { + ToggleFloatingPanes + SwitchToMode "normal" + } + } + renamepane { + bind "esc" { + UndoRenamePane + SwitchToMode "pane" + } + } + renametab { + bind "esc" { + UndoRenameTab + SwitchToMode "tab" + } + } + resize { + bind "Ctrl n" { + SwitchToMode "normal" + } + bind "left" { + Resize "Increase left" + } + bind "down" { + Resize "Increase down" + } + bind "up" { + Resize "Increase up" + } + bind "right" { + Resize "Increase right" + } + bind "+" { + Resize "Increase" + } + bind "-" { + Resize "Decrease" + } + bind "=" { + Resize "Increase" + } + bind "H" { + Resize "Decrease left" + } + bind "J" { + Resize "Decrease down" + } + bind "K" { + Resize "Decrease up" + } + bind "L" { + Resize "Decrease right" + } + bind "h" { + Resize "Increase left" + } + bind "j" { + Resize "Increase down" + } + bind "k" { + Resize "Increase up" + } + bind "l" { + Resize "Increase right" + } + } + scroll { + bind "e" { + EditScrollback + SwitchToMode "normal" + } + bind "s" { + SwitchToMode "entersearch" + SearchInput 0 + } + } + search { + bind "c" { + SearchToggleOption "CaseSensitivity" + } + bind "n" { + Search "down" + } + bind "o" { + SearchToggleOption "WholeWord" + } + bind "p" { + Search "up" + } + bind "w" { + SearchToggleOption "Wrap" + } + } + session { + bind "Ctrl o" { + SwitchToMode "normal" + } + bind "c" { + LaunchOrFocusPlugin "configuration" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + bind "p" { + LaunchOrFocusPlugin "plugin-manager" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + bind "w" { + LaunchOrFocusPlugin "session-manager" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } + } + shared_among "pane" "tmux" { + bind "x" { + CloseFocus + SwitchToMode "normal" + } + } + shared_among "renametab" "renamepane" { + bind "Ctrl c" { + SwitchToMode "normal" + } + } + shared_among "scroll" "search" { + bind "PageDown" { + PageScrollDown + } + bind "PageUp" { + PageScrollUp + } + bind "left" { + PageScrollUp + } + bind "down" { + ScrollDown + } + bind "up" { + ScrollUp + } + bind "right" { + PageScrollDown + } + bind "Ctrl b" { + PageScrollUp + } + bind "Ctrl c" { + ScrollToBottom + SwitchToMode "normal" + } + bind "d" { + HalfPageScrollDown + } + bind "Ctrl f" { + PageScrollDown + } + bind "h" { + PageScrollUp + } + bind "j" { + ScrollDown + } + bind "k" { + ScrollUp + } + bind "l" { + PageScrollDown + } + bind "Ctrl s" { + SwitchToMode "normal" + } + bind "u" { + HalfPageScrollUp + } + } + shared_among "session" "tmux" { + bind "d" { + Detach + } + } + shared_except "locked" { + bind "Alt left" { + MoveFocusOrTab "left" + } + bind "Alt down" { + MoveFocus "down" + } + bind "Alt up" { + MoveFocus "up" + } + bind "Alt right" { + MoveFocusOrTab "right" + } + bind "Alt +" { + Resize "Increase" + } + bind "Alt -" { + Resize "Decrease" + } + bind "Alt =" { + Resize "Increase" + } + bind "Alt r" { + WriteChars "source cdr" + WriteChars "\n" + } + bind "Alt f" { + ToggleFloatingPanes + } + bind "Ctrl g" { + SwitchToMode "locked" + } + bind "Alt h" { + MoveFocusOrTab "left" + } + bind "Alt i" { + MoveTab "left" + } + bind "Alt j" { + MoveFocus "down" + } + bind "Alt k" { + MoveFocus "up" + } + bind "Alt p" { + NewPane + } + bind "Alt n" { + NewTab + } + } + shared_except "locked" "move" { + bind "Ctrl h" { + SwitchToMode "move" + } + } + shared_except "locked" "pane" { + bind "Ctrl p" { + SwitchToMode "pane" + } + } + shared_except "locked" "resize" { + bind "Ctrl n" { + SwitchToMode "resize" + } + } + shared_except "locked" "scroll" "search" { + bind "Ctrl s" { + SwitchToMode "scroll" + } + } + shared_except "locked" "scroll" "search" "tmux" { + bind "Ctrl b" { + SwitchToMode "tmux" + } + } + shared_except "locked" "session" { + bind "Ctrl o" { + SwitchToMode "session" + } + } + shared_except "locked" "tab" { + bind "Ctrl t" { + SwitchToMode "tab" + } + } + shared_except "normal" "locked" "entersearch" { + bind "enter" { + SwitchToMode "normal" + } + } + shared_except "normal" "locked" "entersearch" "renametab" "renamepane" { + bind "esc" { + SwitchToMode "normal" + } + } + tab { + bind "Ctrl t" { + SwitchToMode "normal" + } + bind "left" { + GoToPreviousTab + } + bind "down" { + GoToNextTab + } + bind "up" { + GoToPreviousTab + } + bind "right" { + GoToNextTab + } + bind "1" { + GoToTab 1 + SwitchToMode "normal" + } + bind "2" { + GoToTab 2 + SwitchToMode "normal" + } + bind "3" { + GoToTab 3 + SwitchToMode "normal" + } + bind "4" { + GoToTab 4 + SwitchToMode "normal" + } + bind "5" { + GoToTab 5 + SwitchToMode "normal" + } + bind "6" { + GoToTab 6 + SwitchToMode "normal" + } + bind "7" { + GoToTab 7 + SwitchToMode "normal" + } + bind "8" { + GoToTab 8 + SwitchToMode "normal" + } + bind "9" { + GoToTab 9 + SwitchToMode "normal" + } + bind "h" { + GoToPreviousTab + } + bind "j" { + GoToNextTab + } + bind "k" { + GoToPreviousTab + } + bind "l" { + GoToNextTab + } + bind "n" { + NewTab + SwitchToMode "normal" + } + bind "r" { + SwitchToMode "renametab" + TabNameInput 0 + } + bind "s" { + ToggleActiveSyncTab + SwitchToMode "normal" + } + bind "x" { + CloseTab + SwitchToMode "normal" + } + } + tmux { + bind "left" { + MoveFocus "left" + SwitchToMode "normal" + } + bind "down" { + MoveFocus "down" + SwitchToMode "normal" + } + bind "up" { + MoveFocus "up" + SwitchToMode "normal" + } + bind "right" { + MoveFocus "right" + SwitchToMode "normal" + } + bind "space" { + NextSwapLayout + } + bind "\"" { + NewPane "down" + SwitchToMode "normal" + } + bind "%" { + NewPane "right" + SwitchToMode "normal" + } + bind "," { + SwitchToMode "renametab" + } + bind "[" { + SwitchToMode "scroll" + } + bind "Ctrl b" { + Write 2 + SwitchToMode "normal" + } + bind "c" { + NewTab + SwitchToMode "normal" + } + bind "h" { + MoveFocus "left" + SwitchToMode "normal" + } + bind "j" { + MoveFocus "down" + SwitchToMode "normal" + } + bind "k" { + MoveFocus "up" + SwitchToMode "normal" + } + bind "l" { + MoveFocus "right" + SwitchToMode "normal" + } + bind "n" { + GoToNextTab + SwitchToMode "normal" + } + bind "o" { + FocusNextPane + } + bind "p" { + GoToPreviousTab + SwitchToMode "normal" + } + bind "z" { + ToggleFocusFullscreen + SwitchToMode "normal" + } + } +} +layout_dir "/home/swarsel/.config/zellij/layouts" +on_force_close "detach" +pane_frames false +plugins { + compact-bar { + path "compact-bar" + } + status-bar { + path "status-bar" + } + strider { + path "strider" + } + tab-bar { + path "tab-bar" + } +} +scrollback_lines_to_serialize 100000 +session_serialization true +show_startup_tips false +simplified_ui false +support_kitty_keyboard_protocol true +theme_dir "/home/swarsel/.config/zellij/themes" +ui { + pane_frames { + hide_session_name true + rounded_corners true + } +} diff --git a/files/zellij/config.kdl.nix b/files/zellij/config.kdl.nix deleted file mode 100644 index e835d39..0000000 --- a/files/zellij/config.kdl.nix +++ /dev/null @@ -1,341 +0,0 @@ -{ config }: -'' - pane_frames false - simplified_ui false - default_shell "zsh" - copy_on_select true - on_force_close "detach" - show_startup_tips false - - default_layout "default" - layout_dir "${config.home.homeDirectory}/.config/zellij/layouts" - theme_dir "${config.home.homeDirectory}/.config/zellij/themes" - - keybinds clear-defaults=true { - locked { - bind "Ctrl g" { SwitchToMode "normal"; } - } - pane { - bind "left" { MoveFocus "left"; } - bind "down" { MoveFocus "down"; } - bind "up" { MoveFocus "up"; } - bind "right" { MoveFocus "right"; } - bind "c" { SwitchToMode "renamepane"; PaneNameInput 0; } - bind "d" { NewPane "down"; SwitchToMode "normal"; } - bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "normal"; } - bind "f" { ToggleFocusFullscreen; SwitchToMode "normal"; } - bind "h" { MoveFocus "left"; } - bind "j" { MoveFocus "down"; } - bind "k" { MoveFocus "up"; } - bind "l" { MoveFocus "right"; } - bind "n" { NewPane; SwitchToMode "normal"; } - bind "p" { SwitchFocus; } - bind "Ctrl p" { SwitchToMode "normal"; } - bind "r" { NewPane "right"; SwitchToMode "normal"; } - bind "w" { ToggleFloatingPanes; SwitchToMode "normal"; } - bind "z" { TogglePaneFrames; SwitchToMode "normal"; } - } - tab { - bind "left" { GoToPreviousTab; } - bind "down" { GoToNextTab; } - bind "up" { GoToPreviousTab; } - bind "right" { GoToNextTab; } - bind "1" { GoToTab 1; SwitchToMode "normal"; } - bind "2" { GoToTab 2; SwitchToMode "normal"; } - bind "3" { GoToTab 3; SwitchToMode "normal"; } - bind "4" { GoToTab 4; SwitchToMode "normal"; } - bind "5" { GoToTab 5; SwitchToMode "normal"; } - bind "6" { GoToTab 6; SwitchToMode "normal"; } - bind "7" { GoToTab 7; SwitchToMode "normal"; } - bind "8" { GoToTab 8; SwitchToMode "normal"; } - bind "9" { GoToTab 9; SwitchToMode "normal"; } - bind "[" { BreakPaneLeft; SwitchToMode "normal"; } - bind "]" { BreakPaneRight; SwitchToMode "normal"; } - bind "b" { BreakPane; SwitchToMode "normal"; } - bind "h" { GoToPreviousTab; } - bind "j" { GoToNextTab; } - bind "k" { GoToPreviousTab; } - bind "l" { GoToNextTab; } - bind "n" { NewTab; SwitchToMode "normal"; } - bind "r" { SwitchToMode "renametab"; TabNameInput 0; } - bind "s" { ToggleActiveSyncTab; SwitchToMode "normal"; } - bind "Ctrl t" { SwitchToMode "normal"; } - bind "x" { CloseTab; SwitchToMode "normal"; } - bind "tab" { ToggleTab; } - } - resize { - bind "left" { Resize "Increase left"; } - bind "down" { Resize "Increase down"; } - bind "up" { Resize "Increase up"; } - bind "right" { Resize "Increase right"; } - bind "+" { Resize "Increase"; } - bind "-" { Resize "Decrease"; } - bind "=" { Resize "Increase"; } - bind "H" { Resize "Decrease left"; } - bind "J" { Resize "Decrease down"; } - bind "K" { Resize "Decrease up"; } - bind "L" { Resize "Decrease right"; } - bind "h" { Resize "Increase left"; } - bind "j" { Resize "Increase down"; } - bind "k" { Resize "Increase up"; } - bind "l" { Resize "Increase right"; } - bind "Ctrl n" { SwitchToMode "normal"; } - } - move { - bind "left" { MovePane "left"; } - bind "down" { MovePane "down"; } - bind "up" { MovePane "up"; } - bind "right" { MovePane "right"; } - bind "h" { MovePane "left"; } - bind "Ctrl h" { SwitchToMode "normal"; } - bind "j" { MovePane "down"; } - bind "k" { MovePane "up"; } - bind "l" { MovePane "right"; } - bind "n" { MovePane; } - bind "p" { MovePaneBackwards; } - bind "tab" { MovePane; } - } - scroll { - bind "e" { EditScrollback; SwitchToMode "normal"; } - bind "s" { SwitchToMode "entersearch"; SearchInput 0; } - } - search { - bind "c" { SearchToggleOption "CaseSensitivity"; } - bind "n" { Search "down"; } - bind "o" { SearchToggleOption "WholeWord"; } - bind "p" { Search "up"; } - bind "w" { SearchToggleOption "Wrap"; } - } - session { - bind "c" { - LaunchOrFocusPlugin "configuration" { - floating true - move_to_focused_tab true - } - SwitchToMode "normal" - } - bind "Ctrl o" { SwitchToMode "normal"; } - bind "p" { - LaunchOrFocusPlugin "plugin-manager" { - floating true - move_to_focused_tab true - } - SwitchToMode "normal" - } - bind "w" { - LaunchOrFocusPlugin "session-manager" { - floating true - move_to_focused_tab true - } - SwitchToMode "normal" - } - } - shared_except "locked" { - bind "Alt left" { MoveFocusOrTab "left"; } - bind "Alt down" { MoveFocus "down"; } - bind "Alt up" { MoveFocus "up"; } - bind "Alt right" { MoveFocusOrTab "right"; } - bind "Alt +" { Resize "Increase"; } - bind "Alt -" { Resize "Decrease"; } - bind "Alt =" { Resize "Increase"; } - bind "Alt [" { PreviousSwapLayout; } - bind "Alt ]" { NextSwapLayout; } - bind "Alt f" { ToggleFloatingPanes; } - bind "Ctrl g" { SwitchToMode "locked"; } - bind "Alt h" { MoveFocusOrTab "left"; } - bind "Alt i" { MoveTab "left"; } - bind "Alt j" { MoveFocus "down"; } - bind "Alt k" { MoveFocus "up"; } - bind "Alt l" { MoveFocusOrTab "right"; } - bind "Alt n" { NewPane; } - bind "Alt o" { MoveTab "right"; } - bind "Ctrl q" { Quit; } - } - shared_except "locked" "move" { - bind "Ctrl h" { SwitchToMode "move"; } - } - shared_except "locked" "session" { - bind "Ctrl o" { SwitchToMode "session"; } - } - shared_except "locked" "scroll" "search" "tmux" { - bind "Ctrl b" { SwitchToMode "tmux"; } - } - shared_except "locked" "scroll" "search" { - bind "Ctrl s" { SwitchToMode "scroll"; } - } - shared_except "locked" "tab" { - bind "Ctrl t" { SwitchToMode "tab"; } - } - shared_except "locked" "pane" { - bind "Ctrl p" { SwitchToMode "pane"; } - } - shared_except "locked" "resize" { - bind "Ctrl n" { SwitchToMode "resize"; } - } - shared_except "normal" "locked" "entersearch" { - bind "enter" { SwitchToMode "normal"; } - } - shared_except "normal" "locked" "entersearch" "renametab" "renamepane" { - bind "esc" { SwitchToMode "normal"; } - } - shared_among "pane" "tmux" { - bind "x" { CloseFocus; SwitchToMode "normal"; } - } - shared_among "scroll" "search" { - bind "PageDown" { PageScrollDown; } - bind "PageUp" { PageScrollUp; } - bind "left" { PageScrollUp; } - bind "down" { ScrollDown; } - bind "up" { ScrollUp; } - bind "right" { PageScrollDown; } - bind "Ctrl b" { PageScrollUp; } - bind "Ctrl c" { ScrollToBottom; SwitchToMode "normal"; } - bind "d" { HalfPageScrollDown; } - bind "Ctrl f" { PageScrollDown; } - bind "h" { PageScrollUp; } - bind "j" { ScrollDown; } - bind "k" { ScrollUp; } - bind "l" { PageScrollDown; } - bind "Ctrl s" { SwitchToMode "normal"; } - bind "u" { HalfPageScrollUp; } - } - entersearch { - bind "Ctrl c" { SwitchToMode "scroll"; } - bind "esc" { SwitchToMode "scroll"; } - bind "enter" { SwitchToMode "search"; } - } - renametab { - bind "esc" { UndoRenameTab; SwitchToMode "tab"; } - } - shared_among "renametab" "renamepane" { - bind "Ctrl c" { SwitchToMode "normal"; } - } - renamepane { - bind "esc" { UndoRenamePane; SwitchToMode "pane"; } - } - shared_among "session" "tmux" { - bind "d" { Detach; } - } - tmux { - bind "left" { MoveFocus "left"; SwitchToMode "normal"; } - bind "down" { MoveFocus "down"; SwitchToMode "normal"; } - bind "up" { MoveFocus "up"; SwitchToMode "normal"; } - bind "right" { MoveFocus "right"; SwitchToMode "normal"; } - bind "space" { NextSwapLayout; } - bind "\"" { NewPane "down"; SwitchToMode "normal"; } - bind "%" { NewPane "right"; SwitchToMode "normal"; } - bind "," { SwitchToMode "renametab"; } - bind "[" { SwitchToMode "scroll"; } - bind "Ctrl b" { Write 2; SwitchToMode "normal"; } - bind "c" { NewTab; SwitchToMode "normal"; } - bind "h" { MoveFocus "left"; SwitchToMode "normal"; } - bind "j" { MoveFocus "down"; SwitchToMode "normal"; } - bind "k" { MoveFocus "up"; SwitchToMode "normal"; } - bind "l" { MoveFocus "right"; SwitchToMode "normal"; } - bind "n" { GoToNextTab; SwitchToMode "normal"; } - bind "o" { FocusNextPane; } - bind "p" { GoToPreviousTab; SwitchToMode "normal"; } - bind "z" { ToggleFocusFullscreen; SwitchToMode "normal"; } - } - } - - // Plugin aliases - can be used to change the implementation of Zellij - // changing these requires a restart to take effect - plugins { - compact-bar location="zellij:compact-bar" - configuration location="zellij:configuration" - filepicker location="zellij:strider" { - cwd "/" - } - plugin-manager location="zellij:plugin-manager" - session-manager location="zellij:session-manager" - status-bar location="zellij:status-bar" - strider location="zellij:strider" - tab-bar location="zellij:tab-bar" - welcome-screen location="zellij:session-manager" { - welcome_screen true - } - } - - // Plugins to load in the background when a new session starts - // eg. "file:/path/to/my-plugin.wasm" - // eg. "https://example.com/my-plugin.wasm" - load_plugins { - } - - // Provide a command to execute when copying text. The text will be piped to - // the stdin of the program to perform the copy. This can be used with - // terminal emulators which do not support the OSC 52 ANSI control sequence - // that will be used by default if this option is not set. - // Examples: - // - // copy_command "xclip -selection clipboard" // x11 - // copy_command "wl-copy" // wayland - // copy_command "pbcopy" // osx - // - // copy_command "pbcopy" - - // Choose the destination for copied text - // Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. - // Does not apply when using copy_command. - // Options: - // - system (default) - // - primary - // - // copy_clipboard "primary" - - // Path to the default editor to use to edit pane scrollbuffer - // Default: $EDITOR or $VISUAL - // scrollback_editor "/usr/bin/vim" - - // Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible - // Options: - // - true (default) - // - false - // - // auto_layout false - - // Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected - // Options: - // - true (default) - // - false - // - // session_serialization false - - // Whether pane viewports are serialized along with the session, default is false - // Options: - // - true - // - false (default) - // - // serialize_pane_viewport false - - // Scrollback lines to serialize along with the pane viewport when serializing sessions, 0 - // defaults to the scrollback size. If this number is higher than the scrollback size, it will - // also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true. - // - // scrollback_lines_to_serialize 10000 - - // Enable or disable the rendering of styled and colored underlines (undercurl). - // May need to be disabled for certain unsupported terminals - // (Requires restart) - // Default: true - // - // styled_underlines false - - // How often in seconds sessions are serialized - // - // serialization_interval 10000 - - // Enable or disable writing of session metadata to disk (if disabled, other sessions might not know - // metadata info on this session) - // (Requires restart) - // Default: false - // - // disable_session_metadata false - - // Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it) - // (Requires restart) - // Default: true (if the host terminal supports it) - // - // support_kitty_keyboard_protocol false -'' diff --git a/flake.lock b/flake.lock index 6390319..48c0b34 100644 --- a/flake.lock +++ b/flake.lock @@ -1562,11 +1562,11 @@ }, "nixpkgs-dev": { "locked": { - "lastModified": 1769996711, - "narHash": "sha256-rzB5MFIyk0gec3/0LjlevvMGkWN7H3TrZ1p7AmKtik8=", + "lastModified": 1770317794, + "narHash": "sha256-C2pjgjp63uBXa+7JYG7PqYSZadjanr2ye/+QpdFjIGc=", "owner": "Swarsel", "repo": "nixpkgs", - "rev": "11da4ed1369bfbde772f2a0fda761b759e621f20", + "rev": "bf4809db44ba271f1f147e1f966775b2e6ea673d", "type": "github" }, "original": { @@ -2346,6 +2346,26 @@ "type": "gitlab" } }, + "noctalia": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770217681, + "narHash": "sha256-gMJRIJiZFBe7Bwrwo2cz7YAxV0OiAVQMcmp8fY/YDPg=", + "owner": "noctalia-dev", + "repo": "noctalia-shell", + "rev": "91d07e9279aa9394427289f4b5dff959fbf779fb", + "type": "github" + }, + "original": { + "owner": "noctalia-dev", + "repo": "noctalia-shell", + "type": "github" + } + }, "nosys": { "locked": { "lastModified": 1668010795, @@ -2659,6 +2679,7 @@ "nixpkgs-stable24_11": "nixpkgs-stable24_11", "nixpkgs-stable25_05": "nixpkgs-stable25_05", "nixpkgs-stable25_11": "nixpkgs-stable25_11", + "noctalia": "noctalia", "nswitch-rcm-nix": "nswitch-rcm-nix", "nur": "nur", "pia": "pia", diff --git a/flake.nix b/flake.nix index b2ae4e5..5edec40 100644 --- a/flake.nix +++ b/flake.nix @@ -58,6 +58,10 @@ url = "github:nix-community/emacs-overlay"; # inputs.nixpkgs.follows = "nixpkgs"; }; + noctalia = { + url = "github:noctalia-dev/noctalia-shell"; + inputs.nixpkgs.follows = "nixpkgs"; + }; topologyPrivate.url = "./files/topology/public"; diff --git a/hosts/nixos/x86_64-linux/pyramid/default.nix b/hosts/nixos/x86_64-linux/pyramid/default.nix index 54b80c5..f1f3e1c 100644 --- a/hosts/nixos/x86_64-linux/pyramid/default.nix +++ b/hosts/nixos/x86_64-linux/pyramid/default.nix @@ -18,7 +18,8 @@ in "${self}/modules/nixos/optional/nswitch-rcm.nix" "${self}/modules/nixos/optional/virtualbox.nix" "${self}/modules/nixos/optional/work.nix" - + "${self}/modules/nixos/optional/niri.nix" + "${self}/modules/nixos/optional/noctalia.nix" ]; topology.self = { diff --git a/modules/home/common/anki-tray.nix b/modules/home/common/anki-tray.nix index 0019bb6..60ae9a4 100644 --- a/modules/home/common/anki-tray.nix +++ b/modules/home/common/anki-tray.nix @@ -6,16 +6,18 @@ systemd.user.services.anki-applet = { Unit = { Description = "Anki applet"; - Requires = [ "tray.target" ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { diff --git a/modules/home/common/autotiling.nix b/modules/home/common/autotiling.nix index fdefa19..bcb4508 100644 --- a/modules/home/common/autotiling.nix +++ b/modules/home/common/autotiling.nix @@ -7,7 +7,7 @@ in config = lib.mkIf config.swarselmodules.${moduleName} { services.${moduleName} = { enable = true; - systemdTarget = config.wayland.systemd.target; + systemdTarget = "sway-session.target"; }; }; diff --git a/modules/home/common/custom-packages.nix b/modules/home/common/custom-packages.nix index 3951d86..7cb8ea7 100644 --- a/modules/home/common/custom-packages.nix +++ b/modules/home/common/custom-packages.nix @@ -11,6 +11,7 @@ bak timer e + niri-resize swarselcheck swarselcheck-niri waybarupdate diff --git a/modules/home/common/element-tray.nix b/modules/home/common/element-tray.nix index 8f8ba76..fdcba33 100644 --- a/modules/home/common/element-tray.nix +++ b/modules/home/common/element-tray.nix @@ -6,16 +6,18 @@ systemd.user.services.element-applet = { Unit = { Description = "Element applet"; - Requires = [ "tray.target" ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { diff --git a/modules/home/common/firezone-tray.nix b/modules/home/common/firezone-tray.nix index 042e690..b669901 100644 --- a/modules/home/common/firezone-tray.nix +++ b/modules/home/common/firezone-tray.nix @@ -6,18 +6,18 @@ systemd.user.services.firezone-applet = { Unit = { Description = "Firezone applet"; - Requires = [ - "tray.target" - ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { diff --git a/modules/home/common/gammastep.nix b/modules/home/common/gammastep.nix index 07d6644..7c7480a 100644 --- a/modules/home/common/gammastep.nix +++ b/modules/home/common/gammastep.nix @@ -5,6 +5,7 @@ in { options.swarselmodules.gammastep = lib.mkEnableOption "gammastep settings"; config = lib.mkIf config.swarselmodules.gammastep { + systemd.user.services.gammastep = confLib.overrideTarget "sway-session.target"; services.gammastep = lib.mkIf (config.swarselsystems.isNixos && !config.swarselsystems.isPublic) { enable = true; provider = "manual"; diff --git a/modules/home/common/kanshi.nix b/modules/home/common/kanshi.nix index 770d95a..a81da51 100644 --- a/modules/home/common/kanshi.nix +++ b/modules/home/common/kanshi.nix @@ -1,4 +1,4 @@ -{ self, lib, pkgs, config, ... }: +{ self, lib, pkgs, config, confLib, ... }: { options.swarselmodules.kanshi = lib.mkEnableOption "kanshi settings"; config = lib.mkIf config.swarselmodules.kanshi { @@ -14,6 +14,8 @@ }; }; }; + + systemd.user.services.kanshi = confLib.overrideTarget "sway-session.target"; services.kanshi = { enable = true; settings = [ diff --git a/modules/home/common/obsidian-tray.nix b/modules/home/common/obsidian-tray.nix index f9605b4..98fe0e1 100644 --- a/modules/home/common/obsidian-tray.nix +++ b/modules/home/common/obsidian-tray.nix @@ -6,16 +6,18 @@ systemd.user.services.obsidian-applet = { Unit = { Description = "Obsidian applet"; - Requires = [ "tray.target" ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { diff --git a/modules/home/common/sway.nix b/modules/home/common/sway.nix index 83f894a..cfb6c73 100644 --- a/modules/home/common/sway.nix +++ b/modules/home/common/sway.nix @@ -242,6 +242,7 @@ in startup = config.swarselsystems.startup ++ [ { command = "kitty -T kittyterm -o confirm_os_window_close=0 zellij attach --create kittyterm"; } { command = "sleep 60; kitty -T spotifytui -o confirm_os_window_close=0 spotify_player"; } + { command = "mako"; } ]; seat = { "*" = { diff --git a/modules/home/common/swayidle.nix b/modules/home/common/swayidle.nix index a7f7fcd..9d4acae 100644 --- a/modules/home/common/swayidle.nix +++ b/modules/home/common/swayidle.nix @@ -10,23 +10,25 @@ in brightnessctl = "${lib.getExe pkgs.brightnessctl}"; swaylock = "${lib.getExe pkgs.swaylock-effects}"; suspend = "${pkgs.systemd}/bin/systemctl suspend"; + noctalia = "/etc/profiles/per-user/${config.swarselsystems.mainUser}/bin/noctalia-shell ipc call"; in { enable = true; - systemdTarget = config.wayland.systemd.target; + # systemdTarget = "sway-session.target"; extraArgs = [ "-w" ]; timeouts = [ { timeout = 60; command = "${brightnessctl} -s; ${brightnessctl} set 80%-"; resumeCommand = "${brightnessctl} -r"; } # { timeout = 300; command = "${lib.getExe pkgs.swaylock-effects} -f --screenshots --clock --effect-blur 7x5 --effect-vignette 0.5:0.5 --fade-in 0.2"; } - { timeout = 300; command = "${swaylock} -f"; } + # { timeout = 300; command = "${swaylock} -f"; } + { timeout = 300; command = "${noctalia} lockScreen lock || ${swaylock} -f"; } # { timeout = 600; command = ''${pkgs.sway}/bin/swaymsg "output * dpms off"; resumeCommand = "${pkgs.sway}/bin/swaymsg output * dpms on''; } - { timeout = 600; command = "${suspend}"; } + { timeout = 600; command = "${noctalia} sessionMenu lockAndSuspend || ${suspend}"; } ]; events = { # { event = "before-sleep"; command = "${lib.getExe pkgs.swaylock-effects} -f --screenshots --clock --effect-blur 7x5 --effect-vignette 0.5:0.5 --fade-in 0.2"; } # { event = "after-resume"; command = "${swaylock} -f "; } - before-sleep = "${swaylock} -f "; - lock = "${swaylock} -f "; + # before-sleep = "${swaylock} -f "; + # lock = "${swaylock} -f "; }; }; }; diff --git a/modules/home/common/swayosd.nix b/modules/home/common/swayosd.nix index 706aa25..b425eb5 100644 --- a/modules/home/common/swayosd.nix +++ b/modules/home/common/swayosd.nix @@ -1,7 +1,8 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, confLib, ... }: { options.swarselmodules.swayosd = lib.mkEnableOption "swayosd settings"; config = lib.mkIf config.swarselmodules.swayosd { + systemd.user.services.swayosd = confLib.overrideTarget "sway-session.target"; services.swayosd = { enable = true; package = pkgs.dev.swayosd; diff --git a/modules/home/common/vesktop-tray.nix b/modules/home/common/vesktop-tray.nix index 8f6e281..55bae7c 100644 --- a/modules/home/common/vesktop-tray.nix +++ b/modules/home/common/vesktop-tray.nix @@ -6,16 +6,18 @@ systemd.user.services.vesktop-applet = { Unit = { Description = "Vesktop applet"; - Requires = [ "tray.target" ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { diff --git a/modules/home/common/waybar.nix b/modules/home/common/waybar.nix index 4978ffd..2b052c6 100644 --- a/modules/home/common/waybar.nix +++ b/modules/home/common/waybar.nix @@ -66,8 +66,8 @@ in enable = true; systemd = { enable = false; - # target = "sway-session.target"; - inherit (config.wayland.systemd) target; + target = "sway-session.target"; + # inherit (config.wayland.systemd) target; }; settings = { mainBar = { diff --git a/modules/home/common/zellij.nix b/modules/home/common/zellij.nix index a33a646..9f00748 100644 --- a/modules/home/common/zellij.nix +++ b/modules/home/common/zellij.nix @@ -5,12 +5,14 @@ programs.zellij = { enable = true; enableZshIntegration = true; + attachExistingSession = false; + exitShellOnExit = true; settings = { pane_frames = false; simplified_ui = false; default_shell = "zsh"; copy_on_select = true; - on_force_close = "detach"; + on_force_close = "quit"; show_startup_tips = false; support_kitty_keyboard_protocol = true; default_layout = "swarsel"; diff --git a/modules/home/optional/niri.nix b/modules/home/optional/niri.nix index 5873b62..0b0b51b 100644 --- a/modules/home/optional/niri.nix +++ b/modules/home/optional/niri.nix @@ -1,216 +1,220 @@ -{ inputs, config, pkgs, lib, vars, ... }: +{ inputs, config, pkgs, lib, vars, type, ... }: { - imports = [ + imports = lib.optionals (type != "nixos") [ inputs.niri-flake.homeModules.niri ]; - options.swarselmodules.niri = lib.mkEnableOption "niri settings"; - config = lib.mkIf config.swarselmodules.niri - { - - programs.niri = { - package = pkgs.niri-unstable; # which package to use for niri validation - settings = { - xwayland-satellite = { - enable = true; - path = "${lib.getExe pkgs.xwayland-satellite-unstable}"; - }; - prefer-no-csd = true; - layer-rules = [ - { matches = [{ namespace = "^notifications$"; }]; block-out-from = "screencast"; } - { matches = [{ namespace = "^wallpaper$"; }]; place-within-backdrop = true; } - ]; - window-rules = [ - { - matches = [{ app-id = ".*"; }]; - opacity = 0.95; - default-column-width = { proportion = 0.5; }; - shadow = { - enable = true; - draw-behind-window = true; - }; - geometry-corner-radius = { top-left = 2.0; top-right = 2.0; bottom-left = 2.0; bottom-right = 2.0; }; - } - { matches = [{ app-id = "at.yrlf.wl_mirror"; }]; opacity = 1.0; } - { matches = [{ app-id = "Gimp"; }]; opacity = 1.0; } - { matches = [{ app-id = "firefox"; }]; opacity = 0.99; } - { matches = [{ app-id = "^special.*"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; } - { matches = [{ app-id = "chromium-browser"; }]; opacity = 0.99; } - { matches = [{ app-id = "^qalculate-gtk$"; }]; open-floating = true; } - { matches = [{ app-id = "^blueman$"; }]; open-floating = true; } - { matches = [{ app-id = "^pavucontrol$"; }]; open-floating = true; } - { matches = [{ app-id = "^syncthingtray$"; }]; open-floating = true; } - { matches = [{ app-id = "^Element$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; block-out-from = "screencast"; } - # { matches = [{ app-id = "^Element$"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; block-out-from = "screencast"; } - { matches = [{ app-id = "^vesktop$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; block-out-from = "screencast"; } - # { matches = [{ app-id = "^vesktop$"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; block-out-from = "screencast"; } - { matches = [{ app-id = "^com.nextcloud.desktopclient.nextcloud$"; }]; open-floating = true; } - { matches = [{ title = ".*1Password.*"; }]; excludes = [{ app-id = "^firefox$"; } { app-id = "^emacs$"; } { app-id = "^kitty$"; }]; open-floating = true; block-out-from = "screencast"; } - { matches = [{ title = "(?:Open|Save) (?:File|Folder|As)"; }]; open-floating = true; } - { matches = [{ title = "^Add$"; }]; open-floating = true; } - { matches = [{ title = "^Picture-in-Picture$"; }]; open-floating = true; } - { matches = [{ title = "Syncthing Tray"; }]; open-floating = true; } - { matches = [{ title = "^Emacs Popup Frame$"; }]; open-floating = true; } - { matches = [{ title = "^Emacs Popup Anchor$"; }]; open-floating = true; } - { matches = [{ app-id = "^spotifytui$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; } - { matches = [{ app-id = "^kittyterm$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; } - ]; - environment = { - DISPLAY = ":0"; - } // vars.waylandSessionVariables; - screenshot-path = "~/Pictures/Screenshots/screenshot_%Y-%m-%d-%H%M%S.png"; - input = { - mod-key = "Super"; - keyboard = { - xkb = { - layout = "us"; - variant = "altgr-intl"; - }; - }; - mouse = { - natural-scroll = false; - }; - touchpad = { - enable = true; - tap = true; - tap-button-map = "left-right-middle"; - natural-scroll = true; - scroll-method = "two-finger"; - click-method = "clickfinger"; - disabled-on-external-mouse = true; - drag = true; - drag-lock = false; - dwt = true; - dwtp = true; - }; - }; - cursor = { - hide-after-inactive-ms = 2000; - hide-when-typing = true; - }; - layout = { - background-color = "transparent"; - border = { - enable = true; - width = 1; - }; - focus-ring = { - enable = false; - }; - gaps = 5; - }; - binds = with config.lib.niri.actions; let - sh = spawn "sh" "-c"; - in + config = { + programs.niri = { + package = pkgs.niri-stable; # which package to use for niri validation + settings = { + debug = { + honor-xdg-activation-with-invalid-serial = [ ]; + }; + xwayland-satellite = { + enable = true; + path = "${lib.getExe pkgs.xwayland-satellite-unstable}"; + }; + prefer-no-csd = true; + layer-rules = [ + { matches = [{ namespace = "^notifications$"; }]; block-out-from = "screen-capture"; } + { matches = [{ namespace = "^wallpaper$"; }]; place-within-backdrop = true; } + { matches = [{ namespace = "^noctalia-overview*"; }]; place-within-backdrop = true; } + ]; + window-rules = [ { - - # "Mod+Super_L" = spawn "killall -SIGUSR1 .waybar-wrapped"; - "Mod+z".action = spawn "killall -SIGUSR1 .waybar-wrapped"; - "Mod+Shift+t".action = toggle-window-rule-opacity; - # "Mod+Escape".action = "mode $exit"; - "Mod+m".action = focus-workspace-previous; - "Mod+Shift+Space".action = toggle-window-floating; - "Mod+Shift+f".action = toggle-windowed-fullscreen; - "Mod+q".action = close-window; - "Mod+f".action = spawn "firefox"; - "Mod+Space".action = spawn "fuzzel"; - "Mod+Shift+c".action = spawn "qalculate-gtk"; - "Mod+Ctrl+p".action = spawn "1password" "--quick-acces"; - "Mod+Shift+Escape".action = spawn "kitty" "-o" "confirm_os_window_close=0" "btm"; - "Mod+h".action = sh ''hyprpicker | wl-copy''; - # "Mod+s".action = spawn "grim" "-g" "\"$(slurp)\"" "-t" "png" "-" "|" "wl-copy" "-t" "image/png"; - # "Mod+s".action = screenshot { show-pointer = false; }; - "Mod+s".action.screenshot = { show-pointer = false; }; - # "Mod+Shift+s".action = spawn "slurp" "|" "grim" "-g" "-" "Pictures/Screenshots/$(date +'screenshot_%Y-%m-%d-%H%M%S.png')"; - # "Mod+Shift+s".action = screenshot-window { write-to-disk = true; }; - "Mod+Shift+s".action.screenshot-window = { write-to-disk = true; }; - # "Mod+Shift+v".action = spawn "wf-recorder" "-g" "'$(slurp -f %o -or)'" "-f" "~/Videos/screenrecord_$(date +%Y-%m-%d-%H%M%S).mkv"; - - "Mod+e".action = sh "emacsclient -nquc -a emacs -e '(dashboard-open)'"; - "Mod+c".action = sh "emacsclient -ce '(org-capture)'"; - "Mod+t".action = sh "emacsclient -ce '(org-agenda)'"; - "Mod+Shift+m".action = sh "emacsclient -ce '(mu4e)'"; - "Mod+Shift+a".action = sh "emacsclient -ce '(swarsel/open-calendar)'"; - - "Mod+a".action = spawn "swarselcheck-niri" "-s"; - "Mod+x".action = spawn "swarselcheck-niri" "-k"; - "Mod+d".action = spawn "swarselcheck-niri" "-d"; - "Mod+w".action = spawn "swarselcheck-niri" "-e"; - - "Mod+p".action = spawn "pass-fuzzel"; - "Mod+o".action = spawn "pass-fuzzel" "--otp"; - "Mod+Shift+p".action = spawn "pass-fuzzel" "--type"; - "Mod+Shift+o".action = spawn "pass-fuzzel" "--otp" "--type"; - - "Mod+Left".action = focus-column-or-monitor-left; - "Mod+Right".action = focus-column-or-monitor-right; - "Mod+Down".action = focus-window-or-workspace-down; - "Mod+Up".action = focus-window-or-workspace-up; - "Mod+Shift+Left".action = move-column-left; - "Mod+Shift+Right".action = move-column-right; - "Mod+Shift+Down".action = move-window-down-or-to-workspace-down; - "Mod+Shift+Up".action = move-window-up-or-to-workspace-up; - # "Mod+Ctrl+Shift+c".action = "reload"; - # "Mod+Ctrl+Shift+r".action = "exec swarsel-displaypower"; - # "Mod+Shift+e".action = "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'"; - # "Mod+r".action = "mode resize"; - # "Mod+Return".action = "exec kitty"; - "Mod+Return".action = spawn "swarselzellij"; - "XF86AudioRaiseVolume".action = spawn "swayosd-client" "--output-volume" "raise"; - "XF86AudioLowerVolume".action = spawn "swayosd-client" "--output-volume" "lower"; - "XF86AudioMute".action = spawn "swayosd-client" "--output-volume" "mute-toggle"; - "XF86MonBrightnessUp".action = spawn "swayosd-client" "--brightness raise"; - "XF86MonBrightnessDown".action = spawn "swayosd-client" "--brightness lower"; - "XF86Display".action = spawn "wl-mirror" "eDP-1"; - "Mod+Escape".action = spawn "wlogout"; - "Mod+Equal".action = set-column-width "+10%"; - "Mod+Minus".action = set-column-width "-10%"; - - "Mod+1".action = focus-workspace 1; - "Mod+2".action = focus-workspace 2; - "Mod+3".action = focus-workspace 3; - "Mod+4".action = focus-workspace 4; - "Mod+5".action = focus-workspace 5; - "Mod+6".action = focus-workspace 6; - "Mod+7".action = focus-workspace 7; - "Mod+8".action = focus-workspace 8; - "Mod+9".action = focus-workspace 9; - "Mod+0".action = focus-workspace 0; - - "Mod+Shift+1".action = move-column-to-index 1; - "Mod+Shift+2".action = move-column-to-index 2; - "Mod+Shift+3".action = move-column-to-index 3; - "Mod+Shift+4".action = move-column-to-index 4; - "Mod+Shift+5".action = move-column-to-index 5; - "Mod+Shift+6".action = move-column-to-index 6; - "Mod+Shift+7".action = move-column-to-index 7; - "Mod+Shift+8".action = move-column-to-index 8; - "Mod+Shift+9".action = move-column-to-index 9; - "Mod+Shift+0".action = move-column-to-index 0; - }; - spawn-at-startup = [ - # { command = [ "vesktop" "--start-minimized" "--enable-speech-dispatcher" "--ozone-platform-hint=auto" "--enable-features=WaylandWindowDecorations" "--enable-wayland-ime" ]; } - # { command = [ "element-desktop" "--hidden" "--enable-features=UseOzonePlatform" "--ozone-platform=wayland" "--disable-gpu-driver-bug-workarounds" ]; } - # { command = [ "anki" ]; } - # { command = [ "obsidian" ]; } - # { command = [ "nm-applet" ]; } - { command = [ "niri" "msg" "action" "focus-workspace" "2" ]; } - ]; - workspaces = { - # "01-Main" = { - # name = "Scratchpad"; - # }; - "99-Scratchpad" = { - name = ""; + matches = [{ app-id = ".*"; }]; + opacity = 0.95; + default-column-width = { proportion = 0.5; }; + shadow = { + enable = true; + draw-behind-window = true; }; + clip-to-geometry = true; + geometry-corner-radius = { top-left = 5.0; top-right = 5.0; bottom-left = 5.0; bottom-right = 5.0; }; + } + { matches = [{ app-id = "at.yrlf.wl_mirror"; }]; opacity = 1.0; } + { matches = [{ app-id = "Gimp"; }]; opacity = 1.0; } + { matches = [{ app-id = "^firefox$"; }]; opacity = 0.95; } + { matches = [{ app-id = "^special.*"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; } + { matches = [{ app-id = "chromium-browser"; }]; opacity = 0.99; } + { matches = [{ app-id = "^qalculate-gtk$"; }]; open-floating = true; } + { matches = [{ app-id = "^blueman$"; }]; open-floating = true; } + { matches = [{ app-id = "^pavucontrol$"; }]; open-floating = true; } + { matches = [{ app-id = "^syncthingtray$"; }]; open-floating = true; } + { matches = [{ app-id = "^Element$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; block-out-from = "screen-capture"; } + # { matches = [{ app-id = "^Element$"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; block-out-from = "screencast"; } + { matches = [{ app-id = "^vesktop$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; block-out-from = "screen-capture"; } + # { matches = [{ app-id = "^vesktop$"; }]; default-column-width = { proportion = 0.9; }; open-on-workspace = "Scratchpad"; block-out-from = "screencast"; } + { matches = [{ app-id = "^com.nextcloud.desktopclient.nextcloud$"; }]; open-floating = true; } + { matches = [{ title = ".*1Password.*"; }]; excludes = [{ app-id = "^firefox$"; } { app-id = "^emacs$"; } { app-id = "^kitty$"; }]; open-floating = true; block-out-from = "screen-capture"; } + { matches = [{ title = "(?:Open|Save) (?:File|Folder|As)"; }]; open-floating = true; } + { matches = [{ title = "^Add$"; }]; open-floating = true; } + { matches = [{ title = "^Picture-in-Picture$"; }]; open-floating = true; } + { matches = [{ title = "Syncthing Tray"; }]; open-floating = true; } + { matches = [{ title = "^Emacs Popup Frame$"; }]; open-floating = true; } + { matches = [{ title = "^Emacs Popup Anchor$"; }]; open-floating = true; } + { matches = [{ app-id = "^spotifytui$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; } + { matches = [{ app-id = "^kittyterm$"; }]; open-floating = true; default-column-width = { proportion = 0.5; }; } + ]; + environment = { + DISPLAY = ":0"; + QT_QPA_PLATFORM = lib.mkForce "wayland"; + EDITOR = "emacsclient -c"; + } // vars.waylandSessionVariables; + screenshot-path = "~/Pictures/Screenshots/screenshot_%Y-%m-%d-%H%M%S.png"; + input = { + mod-key = "Super"; + keyboard = { + xkb = { + layout = "us"; + variant = "altgr-intl"; + }; + }; + mouse = { + natural-scroll = false; + }; + touchpad = { + enable = true; + tap = true; + tap-button-map = "left-right-middle"; + natural-scroll = true; + scroll-method = "two-finger"; + click-method = "clickfinger"; + disabled-on-external-mouse = true; + drag = true; + drag-lock = false; + dwt = true; + dwtp = true; }; }; - }; + cursor = { + hide-after-inactive-ms = 2000; + hide-when-typing = true; + }; + layout = { + background-color = "transparent"; + border = { + enable = true; + width = 1; + }; + focus-ring = { + enable = false; + }; + gaps = 5; + }; + binds = with config.lib.niri.actions; let + sh = spawn "sh" "-c"; + resizer = "niri-resize"; + in + { + "Mod+Shift+t".action = toggle-window-rule-opacity; + "Mod+m".action = focus-workspace-previous; + "Mod+Shift+Space".action = toggle-window-floating; + "Mod+Shift+f".action = fullscreen-window; + "Mod+q".action = sh "niri msg action close-window & ${resizer}"; + "Mod+f".action = sh "${resizer} & firefox"; + # "Mod+Space".action = spawn "noctalia-shell" "ipc" "call" "launcher" "toggle"; + "Mod+Space".action = sh "${resizer} & fuzzel"; + "Mod+z".action = spawn "noctalia-shell" "ipc" "call" "bar" "toggle"; + "Mod+Shift+c".action = spawn "qalculate-gtk"; + "Mod+Ctrl+p".action = spawn "1password" "--quick-acces"; + "Mod+Shift+Escape".action = spawn "kitty" "-o" "confirm_os_window_close=0" "btm"; + "Mod+h".action = sh ''hyprpicker | wl-copy''; + # "Mod+s".action = spawn "grim" "-g" "\"$(slurp)\"" "-t" "png" "-" "|" "wl-copy" "-t" "image/png"; + # "Mod+s".action = screenshot { show-pointer = false; }; + "Mod+s".action.screenshot = { show-pointer = false; }; + # "Mod+Shift+s".action = spawn "slurp" "|" "grim" "-g" "-" "Pictures/Screenshots/$(date +'screenshot_%Y-%m-%d-%H%M%S.png')"; + # "Mod+Shift+s".action = screenshot-window { write-to-disk = true; }; + "Mod+Shift+s".action.screenshot-window = { write-to-disk = true; }; + # "Mod+Shift+v".action = spawn "wf-recorder" "-g" "'$(slurp -f %o -or)'" "-f" "~/Videos/screenrecord_$(date +%Y-%m-%d-%H%M%S).mkv"; - } // { - programs.niri = lib.mkIf (!config.swarselmodules.niri) { - package = null; - config = null; - settings = null; + "Mod+e".action = sh "${resizer} & emacsclient -nquc -a emacs -e '(dashboard-open)'"; + "Mod+c".action = sh "${resizer} & emacsclient -ce '(org-capture)'"; + "Mod+t".action = sh "${resizer} & emacsclient -ce '(org-agenda)'"; + "Mod+Shift+m".action = sh "${resizer} & emacsclient -ce '(mu4e)'"; + "Mod+Shift+a".action = sh "${resizer} & emacsclient -ce '(swarsel/open-calendar)'"; + + "Mod+a".action = spawn "swarselcheck-niri" "-s"; + "Mod+x".action = spawn "swarselcheck-niri" "-k"; + "Mod+d".action = spawn "swarselcheck-niri" "-d"; + "Mod+w".action = spawn "swarselcheck-niri" "-e"; + + "Mod+p".action = spawn "pass-fuzzel"; + "Mod+o".action = spawn "pass-fuzzel" "--otp"; + "Mod+Shift+p".action = spawn "pass-fuzzel" "--type"; + "Mod+Shift+o".action = spawn "pass-fuzzel" "--otp" "--type"; + + "Mod+Left".action = focus-column-or-monitor-left; + "Mod+Right".action = focus-column-or-monitor-right; + "Mod+Down".action = focus-window-or-workspace-down; + "Mod+Up".action = focus-window-or-workspace-up; + "Mod+Shift+Left".action = move-column-left; + "Mod+Shift+Right".action = move-column-right; + "Mod+Shift+Down".action = move-window-down-or-to-workspace-down; + "Mod+Shift+Up".action = move-window-up-or-to-workspace-up; + # "Mod+Ctrl+Shift+c".action = "reload"; + # "Mod+Ctrl+Shift+r".action = "exec swarsel-displaypower"; + # "Mod+Shift+e".action = "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'"; + # "Mod+r".action = "mode resize"; + # "Mod+Return".action = "exec kitty"; + "Mod+Return".action = sh "${resizer} & exec kitty -o confirm_os_window_close=0"; + "XF86AudioRaiseVolume".action = spawn "noctalia-shell" "ipc" "call" "volume" "increase"; + "XF86AudioLowerVolume".action = spawn "noctalia-shell" "ipc" "call" "volume" "decrease"; + "XF86AudioMute".action = spawn "noctalia-shell" "ipc" "call" "volume" "muteOutput"; + "XF86AudioPrev".action = spawn "noctalia-shell" "ipc" "call" "media" "previous"; + "XF86AudioPlay".action = spawn "noctalia-shell" "ipc" "call" "media" "playPause"; + "XF86AudioNext".action = spawn "noctalia-shell" "ipc" "call" "media" "next"; + "XF86MonBrightnessUp".action = spawn "noctalia-shell" "ipc" "call" "brightness" "increase"; + "XF86MonBrightnessDown".action = spawn "noctalia-shell" "ipc" "call" "brightness" "decrease"; + "XF86Display".action = spawn "wl-mirror" "eDP-1"; + "Mod+Escape".action = spawn "noctalia-shell" "ipc" "call" "sessionMenu" "toggle"; + "Mod+i".action = spawn "noctalia-shell" "ipc" "call" "launcher" "emoji"; + "Mod+Equal".action = set-column-width "+10%"; + "Mod+Minus".action = set-column-width "-10%"; + + "Mod+1".action = focus-workspace 1; + "Mod+2".action = focus-workspace 2; + "Mod+3".action = focus-workspace 3; + "Mod+4".action = focus-workspace 4; + "Mod+5".action = focus-workspace 5; + "Mod+6".action = focus-workspace 6; + "Mod+7".action = focus-workspace 7; + "Mod+8".action = focus-workspace 8; + "Mod+9".action = focus-workspace 9; + "Mod+0".action = focus-workspace 0; + + "Mod+Shift+1".action = move-column-to-index 1; + "Mod+Shift+2".action = move-column-to-index 2; + "Mod+Shift+3".action = move-column-to-index 3; + "Mod+Shift+4".action = move-column-to-index 4; + "Mod+Shift+5".action = move-column-to-index 5; + "Mod+Shift+6".action = move-column-to-index 6; + "Mod+Shift+7".action = move-column-to-index 7; + "Mod+Shift+8".action = move-column-to-index 8; + "Mod+Shift+9".action = move-column-to-index 9; + "Mod+Shift+0".action = move-column-to-index 0; + }; + spawn-at-startup = [ + # { command = [ "vesktop" "--start-minimized" "--enable-speech-dispatcher" "--ozone-platform-hint=auto" "--enable-features=WaylandWindowDecorations" "--enable-wayland-ime" ]; } + # { command = [ "element-desktop" "--hidden" "--enable-features=UseOzonePlatform" "--ozone-platform=wayland" "--disable-gpu-driver-bug-workarounds" ]; } + # { command = [ "anki" ]; } + # { command = [ "obsidian" ]; } + # { command = [ "nm-applet" ]; } + # { command = [ "niri" "msg" "action" "focus-workspace" "2" ]; } + # { command = [ "noctalia-shell" ]; } + { command = [ "pkill mako" ]; } + { command = [ "systemctl" "--user" "start" "noctalia-shell.target" ]; } + ]; + # workspaces = { + # "01-Main" = { + # name = "Scratchpad"; + # }; + # "99-Scratchpad" = { + # name = ""; + # }; + # }; + }; }; + }; } diff --git a/modules/home/optional/noctalia.nix b/modules/home/optional/noctalia.nix new file mode 100644 index 0000000..bd2831d --- /dev/null +++ b/modules/home/optional/noctalia.nix @@ -0,0 +1,605 @@ +{ self, inputs, config, pkgs, lib, confLib, ... }: +{ + imports = [ + inputs.noctalia.homeModules.default + ]; + config = { + systemd.user = { + targets = { + noctalia-shell.Unit = { + After = [ "graphical-session.target" ]; + Wants = [ + "tray.target" + "noctalia-tray-pre.target" + ]; + }; + tray = { + Unit = { + After = [ "noctalia-tray-pre.target" ]; + PartOf = [ "noctalia-shell.service" ]; + }; + Install.WantedBy = [ "noctalia-shell.target" ]; + }; + noctalia-tray-pre = { + Unit = { + After = [ + "noctalia-init.service" + ]; + }; + Install.WantedBy = [ "noctalia-shell.target" ]; + }; + }; + services = { + noctalia-shell = confLib.overrideTarget "noctalia-shell.target"; + noctalia-init = { + Unit = { + PartOf = [ "noctalia-tray-pre.target" ]; + }; + + Service = { + Type = "oneshot"; + ExecStartPre = "${pkgs.coreutils}/bin/sleep 5"; + ExecStart = "-${pkgs.busybox}/bin/pkill mako"; + RemainAfterExit = true; + }; + + Install = { + WantedBy = [ "noctalia-tray-pre.target" ]; + }; + }; + }; + }; + + programs = { + fastfetch.enable = true; + noctalia-shell = { + enable = true; + package = pkgs.noctalia-shell.override { calendarSupport = true; }; + systemd.enable = true; + settings = { + bar = { + barType = "simple"; + position = "top"; + monitors = [ ]; + density = "default"; + showCapsule = false; + showOutline = false; + capsuleOpacity = lib.mkForce 1; + backgroundOpacity = lib.mkForce 0.5; + useSeparateOpacity = true; + floating = false; + marginVertical = 4; + marginHorizontal = 0; + frameThickness = 8; + frameRadius = 12; + outerCorners = true; + hideOnOverview = false; + displayMode = "auto_hide"; + autoHideDelay = 100; + autoShowDelay = 300; + screenOverrides = [ ]; + widgets = { + left = [ + { + characterCount = 2; + colorizeIcons = false; + emptyColor = "primary"; + enableScrollWheel = false; + focusedColor = "secondary"; + followFocusedScreen = false; + groupedBorderOpacity = 1; + hideUnoccupied = true; + iconScale = 0.5; + id = "Workspace"; + labelMode = "none"; + occupiedColor = "primary"; + pillSize = 0.4; + reverseScroll = false; + showApplications = true; + showBadge = true; + showLabelsOnlyWhenOccupied = true; + unfocusedIconsOpacity = 0.25; + } + ]; + center = [ + { + colorizeIcons = false; + hideMode = "hidden"; + id = "ActiveWindow"; + maxWidth = 145; + scrollingMode = "hover"; + showIcon = true; + useFixedWidth = false; + } + { + id = "plugin:privacy-indicator"; + } + { + id = "plugin:screen-recorder"; + } + ]; + right = [ + { + blacklist = [ + "bluetooth*" + ]; + colorizeIcons = false; + drawerEnabled = true; + hidePassive = true; + id = "Tray"; + pinned = [ ]; + } + { + displayMode = "alwaysShow"; + id = "Volume"; + middleClickCommand = "pavucontrol"; + } + { + displayMode = "onhover"; + id = "Network"; + } + { + displayMode = "onhover"; + id = "Bluetooth"; + } + { + displayMode = "onhover"; + id = "VPN"; + } + { + deviceNativePath = "__default__"; + hideIfIdle = true; + hideIfNotDetected = true; + id = "Battery"; + showNoctaliaPerformance = false; + showPowerProfiles = true; + } + { + id = "plugin:ba7043:github-feed"; + } + { + id = "plugin:clipper"; + } + { + colorName = "primary"; + id = "SessionMenu"; + } + { + customFont = "FiraCode Nerd Font Mono"; + formatHorizontal = "ddd dd. MMM HH:mm:ss"; + formatVertical = ""; + id = "Clock"; + tooltipFormat = "ddd dd. MMM HH:mm:ss"; + useCustomFont = true; + usePrimaryColor = true; + } + { + colorizeDistroLogo = false; + colorizeSystemIcon = "primary"; + customIconPath = ""; + enableColorization = true; + icon = "noctalia"; + id = "ControlCenter"; + useDistroLogo = true; + } + ]; + }; + }; + general = { + avatarImage = "${self}/files/wallpaper/swarsel.png"; + dimmerOpacity = 0.2; + showScreenCorners = false; + forceBlackScreenCorners = false; + scaleRatio = 1; + radiusRatio = 0.2; + iRadiusRatio = 1; + boxRadiusRatio = 1; + screenRadiusRatio = 1; + animationSpeed = 1; + animationDisabled = false; + compactLockScreen = true; + lockOnSuspend = true; + showSessionButtonsOnLockScreen = true; + showHibernateOnLockScreen = false; + enableShadows = true; + shadowDirection = "bottom_right"; + shadowOffsetX = 2; + shadowOffsetY = 3; + language = ""; + allowPanelsOnScreenWithoutBar = true; + showChangelogOnStartup = true; + telemetryEnabled = false; + enableLockScreenCountdown = true; + lockScreenCountdownDuration = 10000; + autoStartAuth = true; + allowPasswordWithFprintd = true; + }; + ui = { + fontDefaultScale = 1; + fontFixedScale = 1; + tooltipsEnabled = true; + panelBackgroundOpacity = lib.mkForce 1; + panelsAttachedToBar = true; + settingsPanelMode = "centered"; + wifiDetailsViewMode = "grid"; + bluetoothDetailsViewMode = "grid"; + networkPanelView = "wifi"; + bluetoothHideUnnamedDevices = false; + boxBorderEnabled = false; + }; + location = { + name = confLib.getConfig.repo.secrets.common.location.timezoneSpecific; + weatherEnabled = true; + weatherShowEffects = false; + useFahrenheit = false; + use12hourFormat = false; + showWeekNumberInCalendar = true; + showCalendarEvents = true; + showCalendarWeather = true; + analogClockInCalendar = false; + firstDayOfWeek = 1; + hideWeatherTimezone = false; + hideWeatherCityName = false; + }; + calendar = { + cards = [ + { + enabled = true; + id = "calendar-header-card"; + } + { + enabled = true; + id = "calendar-month-card"; + } + { + enabled = true; + id = "weather-card"; + } + ]; + }; + wallpaper = { + enabled = true; + overviewEnabled = true; + directory = "${self}/files/wallpaper"; + monitorDirectories = [ ]; + enableMultiMonitorDirectories = true; + showHiddenFiles = false; + viewMode = "single"; + setWallpaperOnAllMonitors = true; + fillMode = "crop"; + fillColor = "#000000"; + useSolidColor = false; + solidColor = "#1a1a2e"; + automationEnabled = false; + wallpaperChangeMode = "random"; + randomIntervalSec = 300; + transitionDuration = 500; + transitionType = "random"; + transitionEdgeSmoothness = 0.05; + panelPosition = "follow_bar"; + hideWallpaperFilenames = false; + useWallhaven = false; + wallhavenQuery = ""; + wallhavenSorting = "relevance"; + wallhavenOrder = "desc"; + wallhavenCategories = "111"; + wallhavenPurity = "100"; + wallhavenRatios = ""; + wallhavenApiKey = ""; + wallhavenResolutionMode = "atleast"; + wallhavenResolutionWidth = ""; + wallhavenResolutionHeight = ""; + sortOrder = "name"; + }; + appLauncher = { + enableClipboardHistory = false; + autoPasteClipboard = false; + enableClipPreview = true; + clipboardWrapText = true; + clipboardWatchTextCommand = "wl-paste --type text --watch cliphist store"; + clipboardWatchImageCommand = "wl-paste --type image --watch cliphist store"; + position = "center"; + pinnedApps = [ ]; + useApp2Unit = false; + sortByMostUsed = true; + terminalCommand = "kitty -e"; + customLaunchPrefixEnabled = false; + customLaunchPrefix = ""; + viewMode = "list"; + showCategories = false; + iconMode = "native"; + showIconBackground = false; + enableSettingsSearch = false; + enableWindowsSearch = false; + ignoreMouseInput = true; + screenshotAnnotationTool = ""; + }; + controlCenter = { + position = "close_to_bar_button"; + diskPath = "/"; + shortcuts = { + left = [ + { + id = "Network"; + } + { + id = "Bluetooth"; + } + ]; + right = [ + { + id = "Notifications"; + } + { + id = "PowerProfile"; + } + { + id = "KeepAwake"; + } + { + id = "plugin:screen-recorder"; + } + ]; + }; + cards = [ + { + enabled = true; + id = "profile-card"; + } + { + enabled = true; + id = "shortcuts-card"; + } + { + enabled = true; + id = "audio-card"; + } + { + enabled = true; + id = "brightness-card"; + } + { + enabled = true; + id = "weather-card"; + } + { + enabled = true; + id = "media-sysmon-card"; + } + ]; + }; + systemMonitor = { + cpuWarningThreshold = 80; + cpuCriticalThreshold = 90; + tempWarningThreshold = 80; + tempCriticalThreshold = 90; + gpuWarningThreshold = 80; + gpuCriticalThreshold = 90; + memWarningThreshold = 80; + memCriticalThreshold = 90; + swapWarningThreshold = 80; + swapCriticalThreshold = 90; + diskWarningThreshold = 80; + diskCriticalThreshold = 90; + diskAvailWarningThreshold = 20; + diskAvailCriticalThreshold = 10; + cpuPollingInterval = 1000; + gpuPollingInterval = 3000; + enableDgpuMonitoring = false; + memPollingInterval = 1000; + diskPollingInterval = 30000; + networkPollingInterval = 1000; + loadAvgPollingInterval = 3000; + useCustomColors = true; + warningColor = "#5ec4ff"; + criticalColor = "#d95468"; + externalMonitor = "btm"; + }; + dock = { + enabled = false; + }; + network = { + wifiEnabled = true; + bluetoothRssiPollingEnabled = false; + bluetoothRssiPollIntervalMs = 10000; + wifiDetailsViewMode = "grid"; + bluetoothDetailsViewMode = "grid"; + bluetoothHideUnnamedDevices = false; + }; + sessionMenu = { + enableCountdown = true; + countdownDuration = 3000; + position = "center"; + showHeader = true; + largeButtonsStyle = true; + largeButtonsLayout = "grid"; + showNumberLabels = true; + powerOptions = [ + { + action = "lock"; + command = ""; + countdownEnabled = true; + enabled = true; + } + { + action = "suspend"; + command = ""; + countdownEnabled = true; + enabled = true; + } + { + action = "hibernate"; + command = ""; + countdownEnabled = true; + enabled = true; + } + { + action = "reboot"; + command = ""; + countdownEnabled = true; + enabled = true; + } + { + action = "logout"; + command = ""; + countdownEnabled = true; + enabled = true; + } + { + action = "shutdown"; + command = ""; + countdownEnabled = true; + enabled = true; + } + ]; + }; + notifications = { + enabled = true; + monitors = [ ]; + location = "top_right"; + overlayLayer = true; + backgroundOpacity = 0.5; + respectExpireTimeout = true; + lowUrgencyDuration = 3; + normalUrgencyDuration = 8; + criticalUrgencyDuration = 15; + enableMediaToast = false; + enableKeyboardLayoutToast = true; + batteryWarningThreshold = 20; + batteryCriticalThreshold = 5; + saveToHistory = { + low = true; + normal = true; + critical = true; + }; + sounds.enabled = false; + }; + osd = { + enabled = true; + location = "right"; + autoHideMs = 2000; + overlayLayer = true; + backgroundOpacity = 0.5; + monitors = [ ]; + enabledTypes = [ 0 1 2 3 ]; + }; + audio = { + volumeStep = 5; + volumeOverdrive = false; + cavaFrameRate = 30; + visualizerType = "linear"; + mprisBlacklist = [ ]; + preferredPlayer = ""; + volumeFeedback = false; + }; + brightness = { + brightnessStep = 5; + enforceMinimum = true; + enableDdcSupport = false; + }; + nightLight = { + enabled = true; + autoSchedule = true; + nightTemp = "3700"; + dayTemp = "5500"; + manualSunrise = "06:30"; + manualSunset = "18:30"; + }; + hooks.enabled = false; + desktopWidgets.enabled = false; + + plugins = { + sources = [ + { + enabled = true; + name = "Official Noctalia Plugins"; + url = "https://github.com/noctalia-dev/noctalia-plugins"; + } + { + enabled = true; + name = "Dev"; + url = "https://github.com/Swarsel/noctalia-plugins"; + } + ]; + states = lib.listToAttrs + (map + (plugin: + lib.nameValuePair plugin { + enabled = true; + sourceUrl = "https://github.com/noctalia-dev/noctalia-plugins"; + }) + [ + "clipper" + "github-feed" + "privacy-indicator" + "kaomoji-provider" + "unicode-picker" + "screen-recorder" + ]) // { + github-feed = { + enabled = true; + sourceUrl = "https://github.com/Swarsel/noctalia-plugins"; + }; + }; + }; + pluginSettings = { + clipper = { + enableTodoIntegration = false; + }; + + privacy-indicator = { + hideInactive = true; + iconSpacing = 4; + removeMargins = true; + }; + + screen-recorder = { + hideInactive = true; + directory = ""; + filenamePattern = "recording_yyyyMMdd_HHmmss"; + frameRate = "60"; + audioCodec = "opus"; + videoCodec = "h264"; + quality = "very_high"; + colorRange = "limited"; + showCursor = true; + copyToClipboard = true; + audioSource = "default_output"; + videoSource = "portal"; + resolution = "original"; + }; + + github-feed = { + username = lib.toUpper config.swarselsystems.mainUser; + token = confLib.getConfig.repo.secrets.common.noctaliaGithubToken; + refreshInterval = 300; + maxEvents = 50; + showStars = false; + showForks = false; + showPRs = false; + showRepoCreations = false; + showMyRepoStars = true; + showMyRepoForks = true; + openInBrowser = true; + # my fork: + showNotificationBadge = true; + colorizationEnabled = true; + colorizationIcon = "Primary"; + colorizationBadge = "Tertiary"; + colorizationBadgeText = "Primary"; + defaultTab = 1; + enableSystemNotifications = true; + notifyGitHubNotifications = true; + notifyStars = true; + notifyForks = true; + notifyPRs = true; + notifyRepoCreations = true; + notifyMyRepoStars = true; + notifyMyRepoForks = true; + }; + }; + }; + }; + }; + }; +} diff --git a/modules/home/optional/work.nix b/modules/home/optional/work.nix index 587a3ee..ce0a1e6 100644 --- a/modules/home/optional/work.nix +++ b/modules/home/optional/work.nix @@ -459,16 +459,18 @@ in teams-applet = { Unit = { Description = "teams applet"; - Requires = [ "tray.target" ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { @@ -479,16 +481,18 @@ in onepassword-applet = { Unit = { Description = "1password applet"; - Requires = [ "tray.target" ]; + Requires = [ "graphical-session.target" ]; After = [ "graphical-session.target" "tray.target" ]; - PartOf = [ "graphical-session.target" ]; + PartOf = [ + "tray.target" + ]; }; Install = { - WantedBy = [ "graphical-session.target" ]; + WantedBy = [ "tray.target" ]; }; Service = { @@ -501,7 +505,7 @@ in services.pizauth = { enable = true; extraConfig = '' - auth_notify_cmd = "if [[ \"$(notify-send -A \"Open $PIZAUTH_ACCOUNT\" -t 30000 'pizauth authorisation')\" == \"0\" ]]; then open \"$PIZAUTH_URL\"; fi"; + auth_notify_cmd = "if [[ \"$(notify-send -A \"Open $PIZAUTH_ACCOUNT\" -t 30000 'pizauth authorisation')\" == \"0\" ]]; then open \"$PIZAUTH_URL\"; fi"; error_notify_cmd = "notify-send -t 90000 \"pizauth error for $PIZAUTH_ACCOUNT\" \"$PIZAUTH_MSG\""; token_event_cmd = "pizauth dump > ${homeDir}/.pizauth.state"; ''; diff --git a/modules/nixos/client/lowbattery.nix b/modules/nixos/client/lowbattery.nix index 9dece08..cec7315 100644 --- a/modules/nixos/client/lowbattery.nix +++ b/modules/nixos/client/lowbattery.nix @@ -2,21 +2,25 @@ { options.swarselmodules.lowBattery = lib.mkEnableOption "low battery notification config"; config = lib.mkIf config.swarselmodules.lowBattery { - systemd.user.services."battery-low" = { - enable = true; - description = "Timer for battery check that alerts at 10% or less"; - partOf = [ "graphical-session.target" ]; - wantedBy = [ "graphical-session.target" ]; - serviceConfig = { - Type = "simple"; - ExecStart = pkgs.writeShellScript "battery-low-notification" - '' - if (( 10 >= $(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%" | ${lib.getExe pkgs.ripgrep} -o "\d+") && $(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%" | ${lib.getExe pkgs.ripgrep} -o "\d+") > 0 )); - then ${lib.getExe pkgs.libnotify} --urgency=critical "low battery" "$(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%")"; - fi; - ''; + systemd.user.services."battery-low" = + let + target = "sway-session.target"; + in + { + enable = true; + description = "Timer for battery check that alerts at 10% or less"; + partOf = [ target ]; + wantedBy = [ target ]; + serviceConfig = { + Type = "simple"; + ExecStart = pkgs.writeShellScript "battery-low-notification" + '' + if (( 10 >= $(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%" | ${lib.getExe pkgs.ripgrep} -o "\d+") && $(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%" | ${lib.getExe pkgs.ripgrep} -o "\d+") > 0 )); + then ${lib.getExe pkgs.libnotify} --urgency=critical "low battery" "$(${lib.getExe pkgs.acpi} -b | head -n 1 | ${lib.getExe pkgs.ripgrep} -o "\d+%")"; + fi; + ''; + }; }; - }; systemd.user.timers."battery-low" = { wantedBy = [ "timers.target" ]; timerConfig = { diff --git a/modules/nixos/client/uwsm.nix b/modules/nixos/client/uwsm.nix index 2304d27..e2f170c 100644 --- a/modules/nixos/client/uwsm.nix +++ b/modules/nixos/client/uwsm.nix @@ -14,7 +14,7 @@ in comment = "Sway compositor managed by UWSM"; binPath = "/run/current-system/sw/bin/sway"; }; - niri = lib.mkIf (config.swarselmodules ? niri) { + niri = lib.mkIf (config.programs ? niri) { prettyName = "Niri"; comment = "Niri compositor managed by UWSM"; binPath = "/run/current-system/sw/bin/niri-session"; diff --git a/modules/nixos/client/xdg-portal.nix b/modules/nixos/client/xdg-portal.nix index 9da6946..633f184 100644 --- a/modules/nixos/client/xdg-portal.nix +++ b/modules/nixos/client/xdg-portal.nix @@ -1,20 +1,20 @@ -{ lib, config, pkgs, ... }: +{ lib, config, ... }: { options.swarselmodules.xdg-portal = lib.mkEnableOption "xdg portal config"; config = lib.mkIf config.swarselmodules.xdg-portal { xdg.portal = { enable = true; - config = { - common = { - default = "wlr"; - }; - }; - wlr.enable = true; - wlr.settings.screencast = { - output_name = "eDP-1"; - chooser_type = "simple"; - chooser_cmd = "${pkgs.slurp}/bin/slurp -f %o -or"; - }; + # config = { + # common = { + # default = "wlr"; + # }; + # }; + # wlr.enable = true; + # wlr.settings.screencast = { + # output_name = "eDP-1"; + # chooser_type = "simple"; + # chooser_cmd = "${pkgs.slurp}/bin/slurp -f %o -or"; + # }; }; }; } diff --git a/modules/nixos/optional/niri.nix b/modules/nixos/optional/niri.nix index 80b5c5a..bf03b83 100644 --- a/modules/nixos/optional/niri.nix +++ b/modules/nixos/optional/niri.nix @@ -1,33 +1,30 @@ -{ inputs, lib, config, pkgs, ... }: -let - moduleName = "niri"; -in +{ self, inputs, config, pkgs, ... }: { imports = [ inputs.niri-flake.nixosModules.niri ]; - options.swarselmodules.${moduleName} = lib.mkEnableOption "${moduleName} settings"; - config = lib.mkIf config.swarselmodules.${moduleName} - { + config = { - environment.systemPackages = with pkgs; [ - wl-clipboard - wayland-utils - libsecret - cage - gamescope - xwayland-satellite-unstable - ]; - - - programs.niri = { - enable = true; - package = pkgs.niri-unstable; # the actual niri that will be installed and used - }; - } // { niri-flake.cache.enable = true; - programs.niri = { - package = null; + home-manager.users.${config.swarselsystems.mainUser}.imports = [ + "${self}/modules/home/optional/niri.nix" + ]; + + environment.systemPackages = with pkgs; [ + wl-clipboard + wayland-utils + libsecret + cage + gamescope + xwayland-satellite-unstable + ]; + + + programs = { + niri = { + enable = true; + package = pkgs.niri-stable; # the actual niri that will be installed and used + }; }; }; } diff --git a/modules/nixos/optional/noctalia.nix b/modules/nixos/optional/noctalia.nix new file mode 100644 index 0000000..aa8fea6 --- /dev/null +++ b/modules/nixos/optional/noctalia.nix @@ -0,0 +1,17 @@ +{ self, inputs, config, ... }: +{ + disabledModules = [ "programs/gpu-screen-recorder.nix" ]; + imports = [ + "${inputs.nixpkgs-dev}/nixos/modules/programs/gpu-screen-recorder.nix" + ]; + config = { + home-manager.users.${config.swarselsystems.mainUser}.imports = [ + "${self}/modules/home/optional/noctalia.nix" + ]; + services = { + upower.enable = true; # needed for battery percentage + gnome.evolution-data-server.enable = true; # needed for calendar integration + }; + programs.gpu-screen-recorder.enable = true; + }; +} diff --git a/modules/nixos/server/firefly-iii.nix b/modules/nixos/server/firefly-iii.nix index 2f952c2..808008f 100644 --- a/modules/nixos/server/firefly-iii.nix +++ b/modules/nixos/server/firefly-iii.nix @@ -1,4 +1,4 @@ -{ self, lib, config, globals, dns, confLib, ... }: +{ lib, config, globals, dns, confLib, ... }: let inherit (confLib.gen { name = "firefly-iii"; port = 80; }) servicePort serviceName serviceUser serviceGroup serviceDomain serviceAddress proxyAddress4 proxyAddress6; inherit (confLib.static) isHome dnsServer webProxy homeWebProxy homeServiceAddress nginxAccessRules; @@ -30,11 +30,11 @@ in }; }; - topology.self.services.${serviceName} = { - name = "Firefly-III"; - info = "https://${serviceDomain}"; - icon = "${self}/files/topology-images/${serviceName}.png"; - }; + # topology.self.services.${serviceName} = { + # name = "Firefly-III"; + # info = "https://${serviceDomain}"; + # icon = "${self}/files/topology-images/${serviceName}.png"; + # }; globals.services.${serviceName} = { domain = serviceDomain; diff --git a/modules/nixos/server/freshrss.nix b/modules/nixos/server/freshrss.nix index bdae10f..281b088 100644 --- a/modules/nixos/server/freshrss.nix +++ b/modules/nixos/server/freshrss.nix @@ -1,4 +1,4 @@ -{ self, lib, config, globals, dns, confLib, ... }: +{ lib, config, globals, dns, confLib, ... }: let inherit (confLib.gen { name = "freshrss"; port = 80; }) servicePort serviceName serviceUser serviceGroup serviceDomain serviceAddress proxyAddress4 proxyAddress6; inherit (confLib.static) isHome webProxy homeWebProxy dnsServer homeServiceAddress nginxAccessRules; @@ -49,11 +49,11 @@ in # }; }; - topology.self.services.${serviceName} = { - name = "FreshRSS"; - info = "https://${serviceDomain}"; - icon = "${self}/files/topology-images/${serviceName}.png"; - }; + # topology.self.services.${serviceName} = { + # name = "FreshRSS"; + # info = "https://${serviceDomain}"; + # icon = "${self}/files/topology-images/${serviceName}.png"; + # }; globals.services.${serviceName} = { domain = serviceDomain; diff --git a/modules/shared/config-lib.nix b/modules/shared/config-lib.nix index 106d3f2..42a3f3f 100644 --- a/modules/shared/config-lib.nix +++ b/modules/shared/config-lib.nix @@ -165,6 +165,19 @@ in _ = { }; }); + overrideTarget = target: + let + inherit target; + in + { + Unit = { + PartOf = lib.mkForce [ target ]; + After = lib.mkForce [ target ]; + Requires = lib.mkForce [ target ]; + }; + Install.WantedBy = lib.mkForce [ target ]; + }; + genNginx = { serviceAddress , serviceName diff --git a/nix/overlays.nix b/nix/overlays.nix index 0468d04..76e1e4b 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -82,6 +82,7 @@ in (additions final prev) // (nixpkgs-stable-versions final prev) // (inputs.niri-flake.overlays.niri final prev) + // (inputs.noctalia.overlays.default final prev) // (inputs.vbc-nix.overlays.default final prev) // (inputs.nur.overlays.default final prev) // (inputs.emacs-overlay.overlay final prev) diff --git a/pkgs/flake/git-replace/default.nix b/pkgs/flake/git-replace/default.nix index 2ec008b..f31ffb1 100644 --- a/pkgs/flake/git-replace/default.nix +++ b/pkgs/flake/git-replace/default.nix @@ -30,7 +30,7 @@ writeShellApplication { ;; -r | --repo) shift - target_repo=rue + target_repo=true ;; -d | --directory) shift diff --git a/pkgs/flake/niri-resize/default.nix b/pkgs/flake/niri-resize/default.nix new file mode 100644 index 0000000..d01d97e --- /dev/null +++ b/pkgs/flake/niri-resize/default.nix @@ -0,0 +1,6 @@ +{ self, name, writeShellApplication, jq }: +writeShellApplication { + inherit name; + runtimeInputs = [ jq ]; + text = builtins.readFile "${self}/files/scripts/${name}.sh"; +} diff --git a/pkgs/flake/swarselcheck-niri/default.nix b/pkgs/flake/swarselcheck-niri/default.nix index 7504de3..13dcb56 100644 --- a/pkgs/flake/swarselcheck-niri/default.nix +++ b/pkgs/flake/swarselcheck-niri/default.nix @@ -2,5 +2,38 @@ writeShellApplication { inherit name; runtimeInputs = [ kitty element-desktop vesktop spotify-player jq ]; - text = builtins.readFile "${self}/files/scripts/${name}.sh"; + text = '' + while :; do + case ''${1:-} in + -k | --kitty) + cmd=(sh -c 'kitty --app-id kittyterm -T kittyterm -o confirm_os_window_close=0 zellij --config ${self}/files/zellij/config-kittyterm.kdl attach --create kittyterm' '&') + searchapp="kittyterm" + ;; + -e | --element) + cmd=(element-desktop) + searchapp="Element" + ;; + -d | --vesktop) + cmd=(vesktop) + searchapp="vesktop" + ;; + -s | --spotifyplayer) + cmd=(sh -c 'kitty --add-id spotifytui -T spotifytui -o confirm_os_window_close=0 spotify_player' '&') + searchapp="spotifytui" + ;; + *) break ;; + esac + shift + done + + WIN_INFO=$(niri msg -j windows | jq --arg search "$searchapp" '.[] | select (.app_id | test($search)) | { id, is_focused, workspace_id }') + ID=$(echo "$WIN_INFO" | jq -r '.id // empty') + + if [ -z "$ID" ]; then + niri msg action spawn -- "''${cmd[@]}" + else + niri msg action close-window --id "$ID" + fi + + ''; } diff --git a/secrets/repo/pii.nix.enc b/secrets/repo/pii.nix.enc index 79cc512..28718d0 100644 --- a/secrets/repo/pii.nix.enc +++ b/secrets/repo/pii.nix.enc @@ -1,5 +1,5 @@ { - "data": "ENC[AES256_GCM,data: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,iv:uO2n6uM8pG16CzQoRGpqqRp9CpSALkzFGnVdgGSeMS0=,tag:yPHLjZ+spz2djJuzg11U9A==,type:str]", + "data": "ENC[AES256_GCM,data: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,iv:oqiozntlZYeny0E4IoTfavXZuDMs8cKzeiMlxcNbFiM=,tag:gAX9pe7rmiJYhBFpLFVtYw==,type:str]", "sops": { "age": [ { @@ -143,8 +143,8 @@ "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBpYWx1Yy9aNEpnbTdnMmR4\nK1hNTXkrSUVMaE9wR2xTbFVwYzJVVnpQZ1dJCnlKQ2FMa20wUy9nVlFTVmI3WEdu\nMDdIUjVjRCtBVXJzOEVLWHNFTWNkNjgKLS0tIDZiNkVzSzFRa2J6bTFIcFRMemRQ\nOFdPb0xEV2pVVUdsdmFNNGQ5d3hOc2sKeR3NUDYRGDCywMfylXpbo+FOPdtNKkKA\nVffrmB7VKnL+jhKOCjgYeLpSzAQFa3L8QZ9R1xYHa/AmlnEk3IMEBw==\n-----END AGE ENCRYPTED FILE-----\n" } ], - "lastmodified": "2026-01-12T20:26:18Z", - "mac": "ENC[AES256_GCM,data:jIB7rrK4yYjLlqUdl10JfYg3qaAYbuePPjZoGCBCCaohFdTWJPDoJMg5EFMFrZIDVOeWDjYVh6bB+PvXiIvU39NrEymS/Gu50ehCG7Lls7a90K+NSZQhuHS1y91+93t8vOq3kPisN0fh0J9tJwphB/NbmgDrE5e/NQsA4FjOsWU=,iv:VITEc80bKA5ZXuy9iUz7NjobYvVDKXDWhnXFyFwy84c=,tag:POCbrUFiKcc0418v9njPNw==,type:str]", + "lastmodified": "2026-02-06T21:14:11Z", + "mac": "ENC[AES256_GCM,data:7wpdf7B03R8F3Mj2zNApsTX4EDxiuxOHGg+BvnI4Vdg920b02dpvcsP1wkhr1EIew4dR6yxjk14Y69szRRdIqlfgQJF5WXTjsxaU/WuJYwOyylf4uOBZt/l2oiDl1/TsIq+vKNn6NgiHV1/PhYXBz5y2GxAcM1KIc9aBxD6b+G4=,iv:I/qa1KZ93a9gJXxRTjUtBRi7f7LiPvhZXgMBq9Eik/4=,tag:P0VtDXxBG2W7y6xUb2ehig==,type:str]", "pgp": [ { "created_at": "2026-01-12T22:05:07Z",