{pkgs, config, ...}: let inherit (pkgs.lib) mkOption mkIf singleton; inherit (pkgs) stdenv; kernelPackages = config.boot.kernelPackages; splashutils = kernelPackages.splashutils; requiredTTYs = config.requiredTTYs; backgrounds = let specificThemes = config.services.ttyBackgrounds.defaultSpecificThemes ++ config.services.ttyBackgrounds.specificThemes; overridenTTYs = map (x: x.tty) specificThemes; # Use the default theme for all the mingetty ttys and for the # syslog tty, except those for which a specific theme is # specified. defaultTTYs = pkgs.lib.filter (x: !(pkgs.lib.elem x overridenTTYs)) requiredTTYs; in (map (ttyNumber: { tty = ttyNumber; theme = config.services.ttyBackgrounds.defaultTheme; }) defaultTTYs) ++ specificThemes; themesUnpacked = stdenv.mkDerivation { name = "splash-themes"; builder = ./tty-backgrounds-combine.sh; # !!! Should use XML here. ttys = map (x: x.tty) backgrounds; themes = map (x: if x ? theme then (unpackTheme x.theme) else "default") backgrounds; }; unpackTheme = theme: import ../../lib/unpack-theme.nix { inherit stdenv theme; }; in { ###### interface options = { services.ttyBackgrounds = { enable = mkOption { default = true; description = '' Whether to enable graphical backgrounds for the virtual consoles. ''; }; defaultTheme = mkOption { default = pkgs.fetchurl { #url = http://www.bootsplash.de/files/themes/Theme-BabyTux.tar.bz2; url = mirror://gentoo/distfiles/Theme-BabyTux.tar.bz2; md5 = "a6d89d1c1cff3b6a08e2f526f2eab4e0"; }; description = '' The default theme for the virtual consoles. Themes can be found at . ''; }; defaultSpecificThemes = mkOption { default = [ /* { tty = 6; theme = pkgs.fetchurl { # Yeah! url = mirror://gentoo/distfiles/Theme-Pativo.tar.bz2; md5 = "9e13beaaadf88d43a5293e7ab757d569"; }; } */ { tty = 10; theme = pkgs.themes "theme-gnu"; } ]; description = '' This option sets specific themes for virtual consoles. If you just want to set themes for additional consoles, use . ''; }; specificThemes = mkOption { default = [ ]; description = '' This option allows you to set specific themes for virtual consoles. ''; }; }; }; ###### implementation config = mkIf config.services.ttyBackgrounds.enable { assertions = singleton { assertion = kernelPackages.splashutils != null; message = "kernelPackages.splashutils may not be false"; }; environment.etc = singleton { source = themesUnpacked; target = "splash"; }; jobs = singleton { name = "tty-backgrounds"; startOn = "udev"; preStart = '' # Critical: tell the kernel where to find splash_helper. It calls # this program every time we switch between consoles. helperProcFile=${splashutils.helperProcFile} if test -e /proc/sys/fbcondecor; then helperProcFile=/proc/sys/fbcondecor; fi echo ${splashutils}/${splashutils.helperName} > $helperProcFile # For each console... for tty in ${toString (map (x: x.tty) backgrounds)}; do # Make sure that the console exists. echo -n "" > /dev/tty$tty # Set the theme as determined by tty-backgrounds-combine.sh # above. theme=$(readlink ${themesUnpacked}/$tty) ${splashutils}/${splashutils.controlName} --tty $tty -c setcfg -t $theme || true ${splashutils}/${splashutils.controlName} --tty $tty -c setpic -t $theme || true ${splashutils}/${splashutils.controlName} --tty $tty -c on || true done ''; postStop = '' /var/run/current-system/sw/bin/ps -axuw > /tmp/ps # Disable the theme on each console. for tty in ${toString (map (x: x.tty) backgrounds)}; do ${splashutils}/${splashutils.controlName} --tty $tty -c off || true done ''; }; }; }