Motion-Wallpaper-Omarchy/motion-wallpaper-theme-watcher
28allday 779ff3d495 Stop motion wallpaper when the Omarchy theme changes
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.
2026-04-25 09:04:08 +01:00

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