From cbb3e0585970a5b7532cc55ad36c692f9b7f3063 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 7 Aug 2026 17:13:59 -0500 Subject: [PATCH] Update to radiantave-cpp, enable plymouth boot image --- .DS_Store | Bin 0 -> 8196 bytes assets/.DS_Store | Bin 0 -> 6148 bytes assets/RWT-Circular-Color-ForOnDark.svg | 65 +++++++++++++ assets/RWT_Logo-Dark.svg | 117 ------------------------ assets/splash.png | Bin 53030 -> 0 bytes configuration.nix | 43 ++++++++- flake.nix | 33 ++++++- plymouth-theme/radiantwave.script | 24 ++++- rotated_display.nix | 3 + 9 files changed, 163 insertions(+), 122 deletions(-) create mode 100644 .DS_Store create mode 100644 assets/.DS_Store create mode 100755 assets/RWT-Circular-Color-ForOnDark.svg delete mode 100644 assets/RWT_Logo-Dark.svg delete mode 100644 assets/splash.png diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d3115ecdd6a985f10d0b9b3af07e4c9c22140087 GIT binary patch literal 8196 zcmeHMU2GIp6u#fIlo>kE0g4pt#Dzi-vcN)%Eq`YFr+`3#ZRxfYmf4+=4oqjt&g>Q_ zjg5&fAQ+!C{`;hn$b$hTzG$K%`lx7vF+LDA{ygA=FDeh7nLA7Dmil0f5uMxId*+^d z&b{}X`Odw2ri?MP74$WX)iK6Isy$&ik78mQ8oJbOT>iZI0hSEuoqFHSTW(s53?Is;c{2vIR7n^qRKrjI=ogTXzH96dw>J zQOYQFqoYlU#&~R9V%=CgHoAUoA|7jMyl-qw66ZCn-nb`o#2T`lQ``)MM**8zX4dI) zn=H53&c8`iq)Ik@QL;&zQ7z9@d((aW@<2wJQ>4vz4SS|zyL*kiOEja@xMbwkoMZ3G z8~%82&anzZwwqCA=QJx)TX*cfTBFRKGq+Zj z`^lTOXFhBi`JNF|_XhhkH)q(oX&>q>ny#6(jBZ;SGG-$#Nmpy?7A(BGUR9?OO&7A} z(Sqq6R~keySR=Mbl?Qa%+zveNlo2?og~v411cLV;9&5>@xd|eZ{_KH`p%#svuzos!@xDSb{j#p&2b$k2Z8+H})Wf z0Sv;#VYoPk6BxxwJcd(v9A|JAPvLpIh?np(Uc(!>fQxt&@8AkP!pHa&*YP#J!MC`9 zU-27m3e$x7LY=TcSS-YamBK2aS!fY92pff+LYI&hG~uw|2*Z5;LMhz#mrM@%$B9lj zLMYtAPk_St+lO2IgIl(4legb7;dX5n53qT6&5tczvAU^cbL%Z2a^#l4`o|Cma6chh z0^A31IR!_7CMGtV;DyX>nAaWM=*{@ahkAx7EjhJ$|w2jf`BM(F#_;U}SvLn^eMlw^Kael5Hqk534UwpZ7 yP6HKcf^?i{kd70*^$$aOj*+OZlMLxNr^KQ1kADdGD?hiR`#-w>1GN5kn%@DNMRGp? literal 0 HcmV?d00001 diff --git a/assets/.DS_Store b/assets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/RWT_Logo-Dark.svg b/assets/RWT_Logo-Dark.svg deleted file mode 100644 index 0127ed4..0000000 --- a/assets/RWT_Logo-Dark.svg +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/splash.png b/assets/splash.png deleted file mode 100644 index a042520f2a717c400761c415931575fb207a9e2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53030 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
  • 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 diff --git a/configuration.nix b/configuration.nix index cb3628e..ff1fc75 100644 --- a/configuration.nix +++ b/configuration.nix @@ -1,4 +1,4 @@ -{ pkgs, radiantwave, upgradeFlakeRef, ... }: +{ pkgs, radiantwave, upgradeFlakeRef, radiantwavePlymouth, ... }: let radiantApp = radiantwave.packages.${pkgs.system}.default; @@ -18,10 +18,42 @@ in # This populates the EFI partition and tells the NUC how to start NixOS. boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; + # Boot straight into the splash screen without waiting on the bootloader menu. + boot.loader.timeout = 0; # Hardware-specific: NUC 14 needs these for the NVMe and Graphics boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "i915" "drm" "drm_kms_helper" ]; - boot.kernelParams = [ "quiet" "splash" ]; + + # --- RadiantWave splash: Plymouth from boot until the app's first frame --- + boot.plymouth.enable = true; + boot.plymouth.theme = "radiantwave"; + boot.plymouth.themePackages = [ radiantwavePlymouth ]; + + # Silence the kernel/initrd output behind the splash. The module adds + # "splash" itself; we keep "quiet" plus show_status=false and loglevel 0. + boot.consoleLogLevel = 0; + boot.initrd.verbose = false; + boot.kernelParams = [ "quiet" "splash" "systemd.show_status=false" ]; + + # Hold the splash until the app is ready to take over the display, instead of + # quitting at multi-user.target (which would flash a black/console screen + # during the login shell's network wait). The kiosk login shell runs + # `sudo -n plymouth quit --wait` immediately before exec'ing cage. + systemd.services.plymouth-quit.wantedBy = pkgs.lib.mkForce [ ]; + systemd.services.plymouth-quit-wait.wantedBy = pkgs.lib.mkForce [ ]; + + # Allow the kiosk user to quit Plymouth (NOPASSWD, command-scoped). + security.sudo.extraRules = [ + { + users = [ "kiosk" ]; + commands = [ + { + command = "/run/current-system/sw/bin/plymouth"; + options = [ "NOPASSWD" ]; + } + ]; + } + ]; hardware.graphics.enable = true; @@ -29,6 +61,10 @@ in networking.networkmanager.enable = true; + nix.settings.access-tokens = { + "gitea.radiantwavetech.com" = "ff524968d31acc5c4da350d0884a87264d0e8881"; + }; + system.autoUpgrade = { enable = true; flake = upgradeFlakeRef; @@ -105,6 +141,9 @@ in # Pin system audio to 100% and unmute before launching RadiantWave ${pkgs.systemd}/bin/systemctl --user start radiantwave-audio-init.service || true + # Release the splash screen right before the compositor takes over the display + sudo -n plymouth quit --wait || true + exec dbus-run-session cage -- /run/current-system/sw/bin/radiantwave -d -s > /tmp/kiosk.log 2>&1 fi ''; diff --git a/flake.nix b/flake.nix index 0b7610b..b86a8c0 100644 --- a/flake.nix +++ b/flake.nix @@ -5,7 +5,7 @@ disko.inputs.nixpkgs.follows = "nixpkgs"; nixos-facter-modules.url = "github:numtide/nixos-facter-modules"; radiantwave.url = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/radiantwave.git?ref=main"; - radiantwave-dev.url = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/radiantwave.git?ref=dev"; + radiantwave-dev.url = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/radiantwave-cpp.git?ref=dev"; nixos-raspberrypi.url = "github:nvmd/nixos-raspberrypi/main"; }; @@ -22,6 +22,35 @@ }@inputs: let system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + + # Plymouth theme: renders the RadiantWave SVG to a full-HD splash.png + # at build time (librsvg), so the theme is hermetic and resolution- + # independent. The .plymouth file's /usr paths are rewritten to $out + # (the NixOS module's initrd fixup rewrites store paths again). + radiantwavePlymouth = pkgs.stdenv.mkDerivation { + pname = "radiantwave-plymouth"; + version = "1.0.0"; + + nativeBuildInputs = [ pkgs.librsvg ]; + + src = ./assets/RWT-Circular-Color-ForOnDark.svg; + + buildPhase = '' + mkdir -p $out/share/plymouth/themes/radiantwave + rsvg-convert \ + --keep-aspect-ratio \ + --background-color=#111318 \ + --width=3840 \ + --height=2160 \ + --output=$out/share/plymouth/themes/radiantwave/splash.png \ + $src + sed 's,/usr/,'"$out"'/,g' ${./plymouth-theme/radiantwave.plymouth} \ + > $out/share/plymouth/themes/radiantwave/radiantwave.plymouth + cp ${./plymouth-theme/radiantwave.script} \ + $out/share/plymouth/themes/radiantwave/radiantwave.script + ''; + }; mkKioskSystem = { system, radiantwave, upgradeFlakeRef, extraModules ? [], diskModule, enableAutoUpgrade ? true, extraSpecialArgs ? {}}: nixpkgs.lib.nixosSystem { @@ -30,6 +59,7 @@ specialArgs = { inherit radiantwave; inherit upgradeFlakeRef; + inherit radiantwavePlymouth; } // extraSpecialArgs; modules = [ @@ -48,6 +78,7 @@ specialArgs = { inherit radiantwave upgradeFlakeRef; inherit nixos-raspberrypi; + inherit radiantwavePlymouth; }; modules = [ diff --git a/plymouth-theme/radiantwave.script b/plymouth-theme/radiantwave.script index e03716a..2760a44 100644 --- a/plymouth-theme/radiantwave.script +++ b/plymouth-theme/radiantwave.script @@ -1,6 +1,26 @@ wallpaper_image = Image("splash.png"); screen_width = Window.GetWidth(); screen_height = Window.GetHeight(); -resized_wallpaper_image = wallpaper_image.Scale(screen_width, screen_height); -wallpaper_sprite = Sprite(resized_wallpaper_image); + +# Scale the wallpaper to cover the whole screen, then center-crop the overflow. +# Works for both landscape (NUC) and portrait (rotated android) displays +# without distorting the artwork. +scale_x = screen_width / wallpaper_image.GetWidth(); +scale_y = screen_height / wallpaper_image.GetHeight(); + +if (scale_x > scale_y) { + scale = scale_x; +} else { + scale = scale_y; +} + +scaled_width = wallpaper_image.GetWidth() * scale; +scaled_height = wallpaper_image.GetHeight() * scale; +scaled_image = wallpaper_image.Scale(scaled_width, scaled_height); + +crop_x = (scaled_width - screen_width) / 2; +crop_y = (scaled_height - screen_height) / 2; +cropped_image = scaled_image.Crop(crop_x, crop_y, screen_width, screen_height); + +wallpaper_sprite = Sprite(cropped_image); wallpaper_sprite.SetZ(-100); diff --git a/rotated_display.nix b/rotated_display.nix index 332fc92..1693d7c 100644 --- a/rotated_display.nix +++ b/rotated_display.nix @@ -30,6 +30,9 @@ in # Pin system audio to 100% and unmute before launching RadiantWave ${pkgs.systemd}/bin/systemctl --user start radiantwave-audio-init.service || true + # Release the splash screen right before the compositor takes over the display + sudo -n plymouth quit --wait || true + exec dbus-run-session cage -- ${kioskscript} > /tmp/kiosk.log 2>&1 fi '';