Files
Thinkpad-Hyprland-Dotfiles/config/hypr/Scripts/wallpaper-menu.sh
2026-04-28 03:59:07 +02:00

198 lines
5.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
HYPR_DIR="$(cd -- "$SCRIPT_DIR/.." && pwd)"
WALLPAPER_DIR="${WALLPAPER_DIR:-$HOME/Bilder/Wallpaper}"
HYPRPAPER_CONF="$HYPR_DIR/hyprpaper.conf"
CURRENT_WALLPAPER="$HYPR_DIR/current-wallpaper"
TRANSITION_TYPE="${TRANSITION_TYPE:-grow}"
TRANSITION_DURATION="${TRANSITION_DURATION:-1.0}"
TRANSITION_FPS="${TRANSITION_FPS:-60}"
TRANSITION_POS="${TRANSITION_POS:-center}"
notify() {
notify-send "󰸉 Wallpaper" "$1" >/dev/null 2>&1 || true
}
start_detached() {
local command_name="$1"
local unit_name="${command_name//[^[:alnum:]_.-]/-}"
if command -v systemd-run >/dev/null 2>&1; then
systemd-run --user --unit="$unit_name" --collect "$@" >/dev/null 2>&1 && return
fi
if command -v setsid >/dev/null 2>&1; then
setsid -f "$@" >/dev/null 2>&1
else
"$@" >/dev/null 2>&1 &
fi
}
apply_wallpaper() {
local wallpaper="$1"
cat >"$HYPRPAPER_CONF" <<EOF
wallpaper {
monitor =
path = $wallpaper
fit_mode = cover
}
EOF
printf '%s\n' "$wallpaper" >"$CURRENT_WALLPAPER"
if command -v awww >/dev/null 2>&1; then
if ! pgrep -x awww-daemon >/dev/null 2>&1; then
start_detached awww-daemon
sleep 0.2
fi
awww img "$wallpaper" \
--transition-type "$TRANSITION_TYPE" \
--transition-duration "$TRANSITION_DURATION" \
--transition-fps "$TRANSITION_FPS" \
--transition-pos "$TRANSITION_POS" >/dev/null 2>&1 || true
return
fi
if command -v swww >/dev/null 2>&1; then
if ! pgrep -x swww-daemon >/dev/null 2>&1; then
start_detached swww-daemon
sleep 0.2
fi
swww img "$wallpaper" \
--transition-type "$TRANSITION_TYPE" \
--transition-duration "$TRANSITION_DURATION" \
--transition-fps "$TRANSITION_FPS" \
--transition-pos "$TRANSITION_POS" >/dev/null 2>&1 || true
return
fi
if command -v hyprctl >/dev/null 2>&1; then
if ! pgrep -x hyprpaper >/dev/null 2>&1; then
start_detached hyprpaper
sleep 0.2
fi
hyprctl hyprpaper preload "$wallpaper" >/dev/null || true
hyprctl hyprpaper wallpaper ",$wallpaper" >/dev/null || true
fi
}
preview_wallpaper() {
local wallpaper="$1"
if command -v swayimg >/dev/null 2>&1; then
start_detached swayimg "$wallpaper"
return
fi
if command -v imv >/dev/null 2>&1; then
start_detached imv "$wallpaper"
return
fi
if command -v kitty >/dev/null 2>&1; then
start_detached kitty \
--class wallpaper-preview \
--title "Wallpaper Vorschau" \
sh -c 'clear; printf "%s\n\n" "$1"; kitty +kitten icat --fit both --align center "$1"; printf "\nEnter schliesst die Vorschau."; read -r _' \
sh "$wallpaper"
return
fi
notify "Kein Vorschauprogramm gefunden."
}
if [[ "${1:-}" == "--apply" ]]; then
wallpaper="${2:-}"
if [[ -z "$wallpaper" || ! -f "$wallpaper" ]]; then
notify "Wallpaper nicht gefunden."
exit 1
fi
apply_wallpaper "$wallpaper"
notify "$(basename "$wallpaper") angewendet."
exit 0
fi
if [[ "${1:-}" == "--preview" ]]; then
wallpaper="${2:-}"
if [[ -z "$wallpaper" || ! -f "$wallpaper" ]]; then
notify "Wallpaper nicht gefunden."
exit 1
fi
preview_wallpaper "$wallpaper"
exit 0
fi
pick_wallpaper() {
local entries=()
local wallpaper
mapfile -t wallpapers < <(
find "$WALLPAPER_DIR" -maxdepth 1 -type f \
\( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' -o -iname '*.gif' \) |
sort
)
if ((${#wallpapers[@]} == 0)); then
notify "Keine Bilder in $WALLPAPER_DIR gefunden."
exit 1
fi
for wallpaper in "${wallpapers[@]}"; do
entries+=("󰸉 $(basename "$wallpaper")")
done
choice="$(
printf '%s\n' "${entries[@]}" |
wofi --dmenu --prompt "󰸉 Wallpaper" --insensitive
)"
[[ -z "${choice:-}" ]] && exit 0
for i in "${!entries[@]}"; do
if [[ "$choice" == "${entries[$i]}" ]]; then
printf '%s\n' "${wallpapers[$i]}"
return
fi
done
}
while true; do
wallpaper="$(pick_wallpaper)"
[[ -z "${wallpaper:-}" ]] && exit 0
action="$(
printf '%s\n' \
"󰋩 Vorschau" \
"󰄬 Anwenden" \
"󰁍 Zurueck" |
wofi --dmenu --prompt "󰸉 $(basename "$wallpaper")" --insensitive
)"
case "$action" in
*"Vorschau"*)
preview_wallpaper "$wallpaper"
;;
*"Anwenden"*)
apply_wallpaper "$wallpaper"
notify "$(basename "$wallpaper") angewendet."
exit 0
;;
*"Zurueck"*)
;;
*)
exit 0
;;
esac
done