mpvpaper kept running over the new theme's static wallpaper because nothing was watching the omarchy-theme symlink. Add a small sibling script that polls ~/.config/omarchy/current/background and, when the target changes, runs `motion-wallpaper-toggle stop` — which tears down mpvpaper and respawns swaybg with the new symlink target so the new theme's bg becomes visible. - motion-wallpaper-theme-watcher: polls readlink every 2s, exits silently on non-Omarchy systems where the symlink doesn't exist. - toggle: spawn alongside the auto-pause watcher; kill alongside it. - wallpaper.sh: install the new binary.
60 lines
2.2 KiB
Bash
Executable file
60 lines
2.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# ==============================================================================
|
|
# Motion Wallpaper — theme-change watcher.
|
|
#
|
|
# Polls the Omarchy background symlink (~/.config/omarchy/current/background).
|
|
# When the user switches themes (or cycles backgrounds), Omarchy points the
|
|
# symlink at a new image. mpvpaper would otherwise keep running on top of the
|
|
# new theme's static wallpaper, so we tear it down via the toggle script —
|
|
# which also respawns swaybg with the *new* symlink target.
|
|
#
|
|
# Runs as a sibling to mpvpaper. Spawned and killed by motion-wallpaper-toggle.
|
|
# ==============================================================================
|
|
|
|
set -euo pipefail
|
|
|
|
BG_LINK="$HOME/.config/omarchy/current/background"
|
|
LOG_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/motion-wallpaper.log"
|
|
POLL_SECONDS=2
|
|
|
|
log() {
|
|
printf '[%s] theme-watcher: %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >> "$LOG_FILE"
|
|
}
|
|
|
|
# Non-Omarchy systems won't have the symlink. Exit silently — auto-pause still
|
|
# works without us; we only matter on Omarchy where theme-set rotates the bg.
|
|
if [ ! -L "$BG_LINK" ] && [ ! -e "$BG_LINK" ]; then
|
|
log "no Omarchy background symlink at $BG_LINK — exiting"
|
|
exit 0
|
|
fi
|
|
|
|
initial="$(readlink -f "$BG_LINK" 2>/dev/null || true)"
|
|
if [ -z "$initial" ]; then
|
|
log "could not resolve $BG_LINK — exiting"
|
|
exit 0
|
|
fi
|
|
log "watching $BG_LINK (initial=$initial)"
|
|
|
|
# Locate the toggle binary in PATH first, then fall back to our own dir — same
|
|
# trick the auto-pause watcher uses, since launcher-spawned PATH is minimal.
|
|
TOGGLE="$(command -v motion-wallpaper-toggle 2>/dev/null || true)"
|
|
if [ -z "$TOGGLE" ]; then
|
|
self_dir="$(dirname "$(readlink -f "$0")")"
|
|
if [ -x "$self_dir/motion-wallpaper-toggle" ]; then
|
|
TOGGLE="$self_dir/motion-wallpaper-toggle"
|
|
fi
|
|
fi
|
|
if [ -z "$TOGGLE" ]; then
|
|
log "motion-wallpaper-toggle not found — exiting"
|
|
exit 0
|
|
fi
|
|
|
|
while sleep "$POLL_SECONDS"; do
|
|
current="$(readlink -f "$BG_LINK" 2>/dev/null || true)"
|
|
[ -z "$current" ] && continue
|
|
if [ "$current" != "$initial" ]; then
|
|
log "background changed ($initial → $current) — stopping motion wallpaper"
|
|
"$TOGGLE" stop >/dev/null 2>&1 || true
|
|
exit 0
|
|
fi
|
|
done
|