mirror of
https://github.com/moons-14/dotfiles.git
synced 2026-10-06 07:08:12 +09:00
168 lines
3.1 KiB
Bash
168 lines
3.1 KiB
Bash
# shellcheck shell=bash
|
|
|
|
set -o errexit -o nounset -o pipefail
|
|
|
|
playlist_file="$1"
|
|
default_id="$2"
|
|
configuration_id="$3"
|
|
shift 3
|
|
|
|
state_dir="${XDG_RUNTIME_DIR:?}/linux-wallpaperengine"
|
|
state_file="$state_dir/current"
|
|
|
|
usage() {
|
|
printf '%s\n' \
|
|
'Usage: wallpaperengine-wallpaper COMMAND [ID]' \
|
|
'' \
|
|
'Commands:' \
|
|
' select ID Select a declaratively configured ID for this session' \
|
|
' next Select the next configured ID' \
|
|
' previous Select the previous configured ID' \
|
|
' list List configured IDs and mark the selected one' \
|
|
' current Print the selected ID' \
|
|
' restart Restart the selected wallpaper' \
|
|
' stop Stop Wallpaper Engine for this session'
|
|
}
|
|
|
|
load_playlist() {
|
|
mapfile -t wallpaper_ids < <(awk '/^[0-9]+$/ && !seen[$0]++' "$playlist_file")
|
|
if [ "${#wallpaper_ids[@]}" -eq 0 ]; then
|
|
echo "wallpaperengine-wallpaper: no wallpaper IDs are configured in settings.nix" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
contains_id() {
|
|
local candidate="$1"
|
|
local id
|
|
|
|
for id in "${wallpaper_ids[@]}"; do
|
|
[ "$id" = "$candidate" ] && return 0
|
|
done
|
|
return 1
|
|
}
|
|
|
|
current_id() {
|
|
local saved_configuration=""
|
|
local saved_id=""
|
|
local -a saved_state=()
|
|
|
|
if [ -s "$state_file" ]; then
|
|
mapfile -t saved_state <"$state_file"
|
|
saved_configuration="${saved_state[0]:-}"
|
|
saved_id="${saved_state[1]:-}"
|
|
fi
|
|
|
|
if [ "$saved_configuration" = "$configuration_id" ] && contains_id "$saved_id"; then
|
|
printf '%s\n' "$saved_id"
|
|
else
|
|
printf '%s\n' "$default_id"
|
|
fi
|
|
}
|
|
|
|
select_id() {
|
|
local id="$1"
|
|
|
|
if ! contains_id "$id"; then
|
|
echo "wallpaperengine-wallpaper: ID is not declared in settings.nix: $id" >&2
|
|
exit 2
|
|
fi
|
|
|
|
mkdir -p "$state_dir"
|
|
printf '%s\n%s\n' "$configuration_id" "$id" >"$state_file"
|
|
systemctl --user restart linux-wallpaperengine.service
|
|
}
|
|
|
|
cycle() {
|
|
local step="$1"
|
|
local current
|
|
local index=0
|
|
local next_index
|
|
|
|
current=$(current_id)
|
|
for i in "${!wallpaper_ids[@]}"; do
|
|
if [ "${wallpaper_ids[$i]}" = "$current" ]; then
|
|
index="$i"
|
|
break
|
|
fi
|
|
done
|
|
|
|
next_index=$(((index + step + ${#wallpaper_ids[@]}) % ${#wallpaper_ids[@]}))
|
|
select_id "${wallpaper_ids[$next_index]}"
|
|
}
|
|
|
|
load_playlist
|
|
|
|
command="${1:-}"
|
|
if [ -z "$command" ]; then
|
|
usage
|
|
exit 2
|
|
fi
|
|
shift
|
|
|
|
case "$command" in
|
|
select)
|
|
[ "$#" -eq 1 ] || {
|
|
usage >&2
|
|
exit 2
|
|
}
|
|
select_id "$1"
|
|
;;
|
|
next)
|
|
[ "$#" -eq 0 ] || {
|
|
usage >&2
|
|
exit 2
|
|
}
|
|
cycle 1
|
|
;;
|
|
previous)
|
|
[ "$#" -eq 0 ] || {
|
|
usage >&2
|
|
exit 2
|
|
}
|
|
cycle -1
|
|
;;
|
|
list)
|
|
[ "$#" -eq 0 ] || {
|
|
usage >&2
|
|
exit 2
|
|
}
|
|
current=$(current_id)
|
|
for id in "${wallpaper_ids[@]}"; do
|
|
if [ "$id" = "$current" ]; then
|
|
printf '* %s\n' "$id"
|
|
else
|
|
printf ' %s\n' "$id"
|
|
fi
|
|
done
|
|
;;
|
|
current)
|
|
[ "$#" -eq 0 ] || {
|
|
usage >&2
|
|
exit 2
|
|
}
|
|
current_id
|
|
;;
|
|
restart)
|
|
[ "$#" -eq 0 ] || {
|
|
usage >&2
|
|
exit 2
|
|
}
|
|
systemctl --user restart linux-wallpaperengine.service
|
|
;;
|
|
stop)
|
|
[ "$#" -eq 0 ] || {
|
|
usage >&2
|
|
exit 2
|
|
}
|
|
systemctl --user stop linux-wallpaperengine.service
|
|
;;
|
|
help | -h | --help)
|
|
usage
|
|
;;
|
|
*)
|
|
usage >&2
|
|
exit 2
|
|
;;
|
|
esac
|