mirror of
https://github.com/moons-14/dotfiles.git
synced 2026-10-07 09:04:09 +09:00
wallpaper engine
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user