nixos/plymouth: use bgrt theme

The BGRT theme is probably a close as to "FlickerFree" we can
get without https://github.com/NixOS/nixpkgs/pull/74842.
It's more agnostic than the Breeze theme.

We also install all of themes provided by the packages, as it's possible
that one theme needs the ImageDir of another, and they're small files
anyways.

Lastly, how plymouth handles logo and header files is
a total mess, so hopefully when they have an actual release
we won't need to do all this symlinking.
This commit is contained in:
WORLDofPEACE 2021-02-22 07:40:00 -05:00
parent 726dd9804e
commit 6bd4f9a3c5

View File

@ -4,8 +4,7 @@ with lib;
let let
inherit (pkgs) plymouth; inherit (pkgs) plymouth nixos-icons;
inherit (pkgs) nixos-icons;
cfg = config.boot.plymouth; cfg = config.boot.plymouth;
@ -16,9 +15,31 @@ let
osVersion = config.system.nixos.release; osVersion = config.system.nixos.release;
}; };
plymouthLogos = pkgs.runCommand "plymouth-logos" { inherit (cfg) logo; } ''
mkdir -p $out
# For themes that are compiled with PLYMOUTH_LOGO_FILE
mkdir -p $out/etc/plymouth
ln -s $logo $out/etc/plymouth/logo.png
# Logo for bgrt theme
# Note this is technically an abuse of watermark for the bgrt theme
# See: https://gitlab.freedesktop.org/plymouth/plymouth/-/issues/95#note_813768
mkdir -p $out/share/plymouth/themes/spinner
ln -s $logo $out/share/plymouth/themes/spinner/watermark.png
# Logo for spinfinity theme
# See: https://gitlab.freedesktop.org/plymouth/plymouth/-/issues/106
mkdir -p $out/share/plymouth/themes/spinfinity
ln -s $logo $out/share/plymouth/themes/spinfinity/header-image.png
'';
themesEnv = pkgs.buildEnv { themesEnv = pkgs.buildEnv {
name = "plymouth-themes"; name = "plymouth-themes";
paths = [ plymouth ] ++ cfg.themePackages; paths = [
plymouth
plymouthLogos
] ++ cfg.themePackages;
}; };
configFile = pkgs.writeText "plymouthd.conf" '' configFile = pkgs.writeText "plymouthd.conf" ''
@ -48,7 +69,7 @@ in
}; };
themePackages = mkOption { themePackages = mkOption {
default = [ nixosBreezePlymouth ]; default = lib.optional (cfg.theme == "breeze") nixosBreezePlymouth;
type = types.listOf types.package; type = types.listOf types.package;
description = '' description = ''
Extra theme packages for plymouth. Extra theme packages for plymouth.
@ -56,7 +77,7 @@ in
}; };
theme = mkOption { theme = mkOption {
default = "breeze"; default = "bgrt";
type = types.str; type = types.str;
description = '' description = ''
Splash screen theme. Splash screen theme.
@ -115,8 +136,8 @@ in
systemd.paths.systemd-ask-password-plymouth.wantedBy = [ "multi-user.target" ]; systemd.paths.systemd-ask-password-plymouth.wantedBy = [ "multi-user.target" ];
boot.initrd.extraUtilsCommands = '' boot.initrd.extraUtilsCommands = ''
copy_bin_and_libs ${pkgs.plymouth}/bin/plymouthd copy_bin_and_libs ${plymouth}/bin/plymouth
copy_bin_and_libs ${pkgs.plymouth}/bin/plymouth copy_bin_and_libs ${plymouth}/bin/plymouthd
# Check if the actual requested theme is here # Check if the actual requested theme is here
if [[ ! -d ${themesEnv}/share/plymouth/themes/${cfg.theme} ]]; then if [[ ! -d ${themesEnv}/share/plymouth/themes/${cfg.theme} ]]; then
@ -134,21 +155,29 @@ in
mkdir -p $out/share/plymouth/themes mkdir -p $out/share/plymouth/themes
cp ${plymouth}/share/plymouth/plymouthd.defaults $out/share/plymouth cp ${plymouth}/share/plymouth/plymouthd.defaults $out/share/plymouth
# copy themes into working directory for patching # Copy themes into working directory for patching
mkdir themes mkdir themes
# use -L to copy the directories proper, not the symlinks to them
cp -r -L ${themesEnv}/share/plymouth/themes/{text,details,${cfg.theme}} themes
# patch out any attempted references to the theme or plymouth's themes directory # Use -L to copy the directories proper, not the symlinks to them.
# Copy all themes because they're not large assets, and bgrt depends on the ImageDir of
# the spinner theme.
cp -r -L ${themesEnv}/share/plymouth/themes/* themes
# Patch out any attempted references to the theme or plymouth's themes directory
chmod -R +w themes chmod -R +w themes
find themes -type f | while read file find themes -type f | while read file
do do
sed -i "s,/nix/.*/share/plymouth/themes,$out/share/plymouth/themes,g" $file sed -i "s,/nix/.*/share/plymouth/themes,$out/share/plymouth/themes,g" $file
done done
# Install themes
cp -r themes/* $out/share/plymouth/themes cp -r themes/* $out/share/plymouth/themes
cp ${cfg.logo} $out/share/plymouth/logo.png
# Install logo
mkdir -p $out/etc/plymouth
cp -r -L ${themesEnv}/etc/plymouth $out
# Setup font
mkdir -p $out/share/fonts mkdir -p $out/share/fonts
cp ${cfg.font} $out/share/fonts cp ${cfg.font} $out/share/fonts
mkdir -p $out/etc/fonts mkdir -p $out/etc/fonts