Files
NexusOS/bin/boot-branding.sh
T
janvanwanandClaude Opus 5 f46e53de15 feat(branding): restore the boot splash, SDDM theme, and greeter background
Neither the Plymouth theme nor the login/lock theming was ever installed by a
restore, so a rebuilt box came up with stock distro branding.

bin/boot-branding.sh installs all three, and the desktop stage of
restore-linux.sh calls it. Each block self-skips when its greeter is absent or
already current, so it is cheap to re-run and works whether the box boots
lightdm or SDDM:

- Plymouth: a real copy under /usr/share/plymouth/themes, not a symlink into
  the user home. The stock initramfs hook copies the theme path verbatim, so a
  symlink into an unmounted home dangles at early boot and Plymouth drops to
  text mode -- which is what assets/boot/initramfs-hook-my-custom-logo existed
  to work around. With a real copy that hook is unnecessary.
- SDDM: the NexusOS-QML theme, selected via /etc/sddm.conf.d.
- slick-greeter: cannot lay out a custom login screen, so the logo and wordmark
  are baked into assets/themes/greeter/greeter-background.svg and its own
  centered login box lands underneath.

Main.qml now loads background.png instead of background.svg. QtSvg implements
SVG Tiny 1.2, which has no <pattern>, so the brushed-metal and machine-line
textures silently dropped out at runtime. librsvg renders them, so the SVG is
rasterized at 1920x1200 and committed alongside it; the regeneration command is
in the comment above the source: line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 14:31:11 -05:00

119 lines
4.8 KiB
Bash
Executable File

#!/bin/bash
# NexusOS boot-time branding: the Plymouth boot splash and the LightDM greeter
# (which is also what you see on lock -- light-locker just switches to it).
#
# Both are system-level and need root, which is why this is a standalone script
# rather than part of assets/themes/install-theme.sh.
#
# Usage: sudo bin/boot-branding.sh [--uninstall]
set -euo pipefail
NEXUS_ROOT="${NEXUS_ROOT:-$(cd "$(dirname "$(realpath "$0")")/.." && pwd)}"
# Plymouth. A real copy is placed under /usr/share/plymouth/themes -- NOT a
# symlink into /home. The stock initramfs plymouth hook copies the theme path
# verbatim, so a symlink into an unmounted /home dangles at early boot and
# Plymouth falls back to text mode. That is what
# assets/boot/initramfs-hook-my-custom-logo exists to work around; with a real
# copy the hook is unnecessary.
SRC="$NEXUS_ROOT/assets/boot/my-custom-logo"
DEST=/usr/share/plymouth/themes/my-custom-logo
THEME="$DEST/my-custom-logo.plymouth"
# Greeter. slick-greeter cannot lay out a custom login screen the way the
# NexusOS-QML SDDM theme does, so the logo and wordmark are baked into the
# background image instead and the greeter's own centered login box lands under
# them. The SVG is used as-is: gdk-pixbuf's SVG loader is installed, so there is
# nothing to rasterize. Copied out of the repo because the greeter runs as user
# `lightdm` and the user home is 0750, so nothing in here is readable to it.
GREETER_ART="$NEXUS_ROOT/assets/themes/greeter/greeter-background.svg"
GREETER_DIR=/usr/share/nexusos
GREETER_CONF=/etc/lightdm/slick-greeter.conf
# SDDM. Its greeter is a QML app, so unlike slick-greeter it can draw the real
# layout (logo, wordmark, login box, clock) -- this is the theme the design was
# written for. Installed whenever sddm is present, regardless of which display
# manager is currently active, so switching between the two needs no re-run.
SDDM_SRC="$NEXUS_ROOT/assets/themes/KDE/sddm/NexusOS-QML"
SDDM_DEST=/usr/share/sddm/themes/NexusOS-QML
SDDM_CONF=/etc/sddm.conf.d/nexusos.conf
[ "$(id -u)" -eq 0 ] || { echo "run with sudo"; exit 1; }
if [ "${1:-}" = "--uninstall" ]; then
update-alternatives --remove default.plymouth "$THEME" 2>/dev/null || true
rm -rf "$DEST" "$GREETER_DIR" "$GREETER_CONF" "$SDDM_DEST" "$SDDM_CONF"
command -v update-initramfs >/dev/null && update-initramfs -u
echo "reverted to the distro defaults"
exit 0
fi
# --- Plymouth boot splash -----------------------------------------------------
if [ ! -d "$SRC" ]; then
echo "missing theme source: $SRC -- skipping boot splash"
elif ! command -v update-initramfs >/dev/null || [ ! -d /usr/share/plymouth/themes ]; then
echo "no Plymouth on this box -- skipping boot splash"
# update-initramfs is slow, and a restore runs this every time. Bail out when the
# installed copy already matches the repo and the alternative already points here.
elif diff -rq "$SRC" "$DEST" >/dev/null 2>&1 &&
[ "$(readlink -f /usr/share/plymouth/themes/default.plymouth)" = "$THEME" ]; then
echo "boot splash already installed"
else
rm -rf "$DEST"
cp -aL "$SRC" "$DEST"
chown -R root:root "$DEST"
chmod -R a+rX,go-w "$DEST"
update-alternatives --install /usr/share/plymouth/themes/default.plymouth \
default.plymouth "$THEME" 300
update-alternatives --set default.plymouth "$THEME"
update-initramfs -u
echo "boot splash installed"
fi
# --- LightDM greeter (login + lock) -------------------------------------------
# Only slick-greeter is configured here; it's what Mint/XFCE ships and it reads
# this file directly. theme-name is deliberately left alone -- the NexusOS GTK
# theme lives in ~/.themes, which the lightdm user cannot read, so pointing at it
# would just fall back silently. Colors below are the NexusOS-QML palette
# (theme.conf: bgDark).
if [ ! -f "$GREETER_ART" ]; then
echo "missing $GREETER_ART -- skipping greeter"
elif ! command -v slick-greeter >/dev/null; then
echo "no slick-greeter on this box -- skipping greeter"
else
install -D -m 644 -o root -g root "$GREETER_ART" "$GREETER_DIR/greeter-background.svg"
cat > "$GREETER_CONF" <<EOF
[Greeter]
background=$GREETER_DIR/greeter-background.svg
background-color=#0a0e1a
draw-user-backgrounds=false
draw-grid=false
content-align=center
stretch-background-across-monitors=false
EOF
chmod 644 "$GREETER_CONF"
echo "greeter background installed"
fi
# --- SDDM greeter -------------------------------------------------------------
if [ ! -d "$SDDM_SRC" ]; then
echo "missing $SDDM_SRC -- skipping SDDM theme"
elif [ ! -d /usr/share/sddm/themes ]; then
echo "no SDDM on this box -- skipping SDDM theme"
else
rm -rf "$SDDM_DEST"
cp -aL "$SDDM_SRC" "$SDDM_DEST"
chown -R root:root "$SDDM_DEST"
chmod -R a+rX,go-w "$SDDM_DEST"
install -d -m 755 /etc/sddm.conf.d
cat > "$SDDM_CONF" <<EOF
[Theme]
Current=NexusOS-QML
EOF
chmod 644 "$SDDM_CONF"
echo "SDDM theme installed"
fi
echo "done -- reboot to see it."