Dotfiles/etc-lightdm/lightdm-greeter-wallpaper

42 lines
1.7 KiB
Bash

#!/bin/sh
# lightdm-greeter-wallpaper — mirror the user's desktop wallpaper to the greeter.
#
# The wallpaper picker (~/.config/scripts/wallpaper-picker) writes the chosen
# per-monitor wallpapers to ~/.config/hypr/usr/wallpaper.conf. This helper copies
# the wallpaper of the greeter's main monitor to a world-readable system path so
# the LightDM greeter — which runs as the unprivileged 'lightdm' user and cannot
# read a 0700 home — can use it as its background.
#
# Run as root (it needs to read the user's home) via lightdm-greeter-wallpaper.path,
# which fires whenever wallpaper.conf changes. Usage:
# lightdm-greeter-wallpaper <username>
#
# Monitor choice: prefer $PREFERRED_MONITOR (the main/4K panel that hosts the
# login form); fall back to the first wallpaper entry. Set PREFERRED_MONITOR in
# the environment (the .service does) to match your primary output.
set -eu
USER_NAME="${1:?usage: lightdm-greeter-wallpaper <username>}"
PREFERRED="${PREFERRED_MONITOR:-}"
DEST="/usr/share/backgrounds/lightdm-greeter-bg.png"
HOME_DIR="$(getent passwd "$USER_NAME" | cut -d: -f6)"
[ -n "$HOME_DIR" ] || { echo "no home for $USER_NAME" >&2; exit 0; }
STATE="$HOME_DIR/.config/hypr/usr/wallpaper.conf"
[ -r "$STATE" ] || { echo "no wallpaper state at $STATE" >&2; exit 0; }
# Path for the preferred monitor, else the first wallpaper path in the file.
src=""
if [ -n "$PREFERRED" ]; then
src="$(awk -v m="$PREFERRED" '
$1=="monitor" && $3==m { want=1; next }
want && $1=="path" { print $3; exit }' "$STATE")"
fi
[ -n "$src" ] || src="$(awk '$1=="path"{print $3; exit}' "$STATE")"
[ -n "$src" ] && [ -r "$src" ] || { echo "no readable wallpaper resolved" >&2; exit 0; }
install -Dm644 "$src" "$DEST"
echo "greeter background <- $src"