#!/bin/sh # Regenerate wallust colors from the current wallpaper and reload running apps. # Also keeps the niri backdrop in sync with the wallpaper. # # This is the single startup entry point: it derives the last used wallpaper # from awww's own cache (so "main = last used wallpaper"), reads the saved # palette/threshold from the runtime state file, runs `wallust run` (which # regenerates EVERY template -> adding a new app only needs a wallust.toml # template, never a new autostart line), and reloads live apps. CACHE="${XDG_CACHE_HOME:-$HOME/.cache}" STATE="$CACHE/wallust_runtime" WP_DIR="$HOME/Pictures/wallpapers" # Determine the current wallpaper. # Primary: the marker file written by theme-switcher.sh (last used wallpaper). # Fallback: parse awww's cache (the last image set via `awww img`), excluding # the blurred backdrop layer. awww stores the cache as one concatenated line, # so we grep for the first absolute image path that is not a backdrop blur. get_wp() { marker="$CACHE/current_wallpaper" if [ -f "$marker" ]; then wp="$(cat "$marker" 2>/dev/null)" [ -n "$wp" ] && [ -f "$wp" ] && { echo "$wp"; return 0; } fi for f in "$CACHE"/awww/*/*; do [ -f "$f" ] || continue # awww stores the cache as one concatenated line; the main-namespace # image is everything before the first "backdrop" delimiter. Cut there # so the greedy path match can't swallow the (blurred) backdrop path. wp=$(sed 's/backdrop.*//' "$f" \ | tr '\0' '\n' \ | grep -oE '/[^[:space:]]+\.(png|jpg|jpeg|webp|gif)' \ | head -1) [ -n "$wp" ] && [ -f "$wp" ] && { echo "$wp"; return 0; } done return 1 } # Read saved palette/threshold/saturation/colorspace from the runtime state. palette=""; threshold=""; sat=""; cs="" if [ -f "$STATE" ]; then while IFS='=' read -r k v; do case "$k" in palette) palette="$v" ;; threshold) threshold="$v" ;; saturation) sat="$v" ;; colorspace) cs="$v" ;; esac done < "$STATE" fi WP="$(get_wp)" || WP="$(ls -1 "$WP_DIR"/*.* 2>/dev/null | head -1)" || true if [ -n "$WP" ] && [ -f "$WP" ]; then args="" [ -n "$palette" ] && args="$args -p $palette" [ -n "$threshold" ] && args="$args -t $threshold" [ -n "$sat" ] && args="$args --saturation $sat" [ -n "$cs" ] && args="$args -c $cs" # shellcheck disable=SC2086 wallust run $args "$WP" || true "$HOME/.config/niri/set-backdrop.sh" "$WP" || true fi # Reload apps that support live reload. makoctl reload 2>/dev/null || true # Refresh niri's own theme (focus ring, etc.) from the freshly generated # wallust niri template. Optional because niri may still be starting up. niri msg action reload-config 2>/dev/null || true