# Plymouth boot splash — Nomarchy-branded (ported from the legacy # iteration), background tinted from the same theme-state.json that # drives the desktop (nomarchy.system.stateFile, wired automatically by # lib.mkFlake). One caveat by design: theme switches are Home # Manager-only and never touch the initrd, so the splash follows the # theme as of the last SYSTEM rebuild (`sys-update`), not the last # `nomarchy-theme-sync apply`. { config, lib, pkgs, ... }: let cfg = config.nomarchy.system; state = if cfg.stateFile != null then builtins.fromJSON (builtins.readFile cfg.stateFile) else { }; base = lib.removePrefix "#" ((state.colors or { }).base or "#1a1b26"); # Plymouth's Window.SetBackgroundTopColor takes three floats in # 0.0–1.0; the .plymouth metadata's ConsoleLogBackgroundColor takes a # 0xRRGGBB hex. Nix has no float math: multiply, integer-divide, pad. byteToFloat = n: let thousandths = (n * 1000) / 255; s = toString thousandths; padded = if lib.stringLength s == 1 then "00${s}" else if lib.stringLength s == 2 then "0${s}" else s; in "0.${padded}"; channel = off: byteToFloat (lib.fromHexString (lib.substring off 2 base)); nomarchy-plymouth = pkgs.stdenv.mkDerivation { pname = "nomarchy-plymouth"; version = "1.0"; src = ./plymouth; installPhase = '' mkdir -p $out/share/plymouth/themes/nomarchy cp * $out/share/plymouth/themes/nomarchy/ # Point the .plymouth metadata into the store sed -i "s|/usr/share/plymouth/themes/nomarchy|$out/share/plymouth/themes/nomarchy|g" \ $out/share/plymouth/themes/nomarchy/nomarchy.plymouth # Bake the theme's base color: RGB floats for the script's # Window.SetBackground* calls, 0xRRGGBB for ConsoleLogBackground. sed -i \ -e 's|@BG_R@|${channel 0}|g' \ -e 's|@BG_G@|${channel 2}|g' \ -e 's|@BG_B@|${channel 4}|g' \ $out/share/plymouth/themes/nomarchy/nomarchy.script sed -i 's|@BG_HEX@|${base}|g' \ $out/share/plymouth/themes/nomarchy/nomarchy.plymouth ''; }; in { config = lib.mkIf cfg.plymouth.enable { # Plymouth wants the systemd initrd (also what applies the keyboard # layout to the LUKS prompt) and a quiet console around it. boot.initrd.systemd.enable = lib.mkDefault true; boot.initrd.verbose = lib.mkDefault false; console.earlySetup = lib.mkDefault true; boot.consoleLogLevel = lib.mkDefault 0; boot.plymouth = { enable = lib.mkDefault true; themePackages = lib.mkDefault [ nomarchy-plymouth ]; theme = lib.mkDefault "nomarchy"; }; # Not mkDefault: kernelParams is a list other modules add to at # normal priority — a mkDefault def would be dropped entirely, # losing the quiet/splash boot. These merge with the rest. boot.kernelParams = [ "quiet" "splash" "loglevel=3" "rd.systemd.show_status=false" "rd.udev.log_level=3" "udev.log_priority=3" "boot.shell_on_fail" ]; }; }