Files
dotfiles/hypr/theme-cycle.sh
2026-04-19 09:12:58 +02:00

119 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
DAY_HOUR=7
NIGHT_HOUR=20
DAY_WALL="$HOME/.config/hypr/paper/day.jpg"
NIGHT_WALL="$HOME/.config/hypr/paper/night.jpg"
STATE_FILE="/tmp/wallpaper-mode" # tracks: day / night / auto
MONITORS=( $(hyprctl monitors -j | jq -r '.[].name') )
apply_day() {
for mon in "${MONITORS[@]}"; do
hyprctl hyprpaper wallpaper "$mon,$DAY_WALL" &>/dev/null
done
sh ~/.config/waybar/switch-theme.sh day
}
apply_night() {
for mon in "${MONITORS[@]}"; do
hyprctl hyprpaper wallpaper "$mon,$NIGHT_WALL" &>/dev/null
done
sh ~/.config/waybar/switch-theme.sh night
}
wait_for_hyprpaper() {
local retries=20
local sock="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.hyprpaper.sock"
[[ -S "$sock" ]] || sock="/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.hyprpaper.sock"
while ((retries-- > 0)); do
[[ -S "$sock" ]] && return 0
sleep 0.3
done
return 1
}
get_state() {
cat "$STATE_FILE" 2>/dev/null || echo "auto"
}
set_state() {
echo "$1" > "$STATE_FILE"
}
# --- ARGUMENT HANDLING ---
case "$1" in
day)
set_state "day"
wait_for_hyprpaper || { echo "hyprpaper not ready"; exit 1; }
apply_day
exit 0
;;
night)
set_state "night"
wait_for_hyprpaper || { echo "hyprpaper not ready"; exit 1; }
apply_night
exit 0
;;
auto)
set_state "auto"
exit 0
;;
# Waybar left-click: cycle day -> night -> auto -> day
next)
cur=$(get_state)
case "$cur" in
day) "$0" night; exit 0 ;;
night) "$0" auto; exit 0 ;;
auto) "$0" day; exit 0 ;;
esac
;;
# Waybar polls this for the button label
status)
cur=$(get_state)
case "$cur" in
day) echo '{"text":"󰖙 day", "tooltip":"Wallpaper: day (click to → night)","class":"day"}' ;;
night) echo '{"text":"󰖔 night","tooltip":"Wallpaper: night (click to → auto)","class":"night"}' ;;
auto) echo '{"text":"󰃝 auto", "tooltip":"Wallpaper: auto (click to → day)","class":"auto"}' ;;
esac
exit 0
;;
"")
# No arg — fall through to cycle loop
;;
*)
echo "Usage: $0 [day|night|auto|next|status]"
exit 1
;;
esac
# --- CYCLE LOOP ---
current_mode="none"
while true; do
hour=$(date +%H | sed 's/^0*//')
state=$(get_state)
if [[ "$current_mode" == "none" ]]; then
if wait_for_hyprpaper; then
current_mode="waiting"
fi
sleep 1
continue
fi
# If pinned to day or night, just wait and recheck
if [[ "$state" == "day" && "$current_mode" != "day" ]]; then
apply_day; current_mode="day"
elif [[ "$state" == "night" && "$current_mode" != "night" ]]; then
apply_night; current_mode="night"
elif [[ "$state" == "auto" ]]; then
if (( hour >= DAY_HOUR && hour < NIGHT_HOUR )) && [[ "$current_mode" != "day" ]]; then
apply_day; current_mode="day"
elif (( hour < DAY_HOUR || hour >= NIGHT_HOUR )) && [[ "$current_mode" != "night" ]]; then
apply_night; current_mode="night"
fi
fi
sleep $(( 60 - $(date +%S) ))
done