#!/usr/bin/env bash set -euo pipefail # ------------------------------- # Config # ------------------------------- HOME_DIR="$HOME" PICTURES_DIR="$HOME_DIR/Wallpapers/pictures" STATE_DIR="$HOME_DIR/.cache/hypr-wallpapers" NAMESPACE="main" CURRENTPATH=/run/current-system/sw/bin # Required environment variables : "${XDG_RUNTIME_DIR:?XDG_RUNTIME_DIR is not set}" : "${HYPRLAND_INSTANCE_SIGNATURE:?HYPRLAND_INSTANCE_SIGNATURE is not set}" : "${WAYLAND_DISPLAY:?WAYLAND_DISPLAY is not set}" IPC_SOCKET="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" # ------------------------------- # Wait for Hyprland IPC socket # ------------------------------- until [ -S "$IPC_SOCKET" ]; do echo "Waiting for Hyprland IPC socket..." sleep 1 done # ------------------------------- # Start awww-daemon if not already running # ------------------------------- awww_SOCKET="$XDG_RUNTIME_DIR/awww/$NAMESPACE.sock" if [ ! -S "$awww_SOCKET" ]; then if ! pgrep -f "awww-daemon.*--namespace $NAMESPACE" >/dev/null; then echo "Starting awww-daemon for namespace $NAMESPACE..." "$CURRENTPATH/awww-daemon" --namespace "$NAMESPACE" & sleep 0.5 else echo "awww-daemon already running for namespace $NAMESPACE" fi fi # ------------------------------- # Load wallpapers # ------------------------------- mapfile -t IMAGES < <(find "$PICTURES_DIR" -type f \( -iname '*.png' -o -iname '*.jpg' -o -iname '*.jpeg' \)) [ "${#IMAGES[@]}" -eq 0 ] && { echo "No wallpapers found in $PICTURES_DIR"; exit 1; } mkdir -p "$STATE_DIR" get_wallpaper() { local ws="$1" local mon="$2" local key="$STATE_DIR/ws${ws}_mon${mon}.txt" if [ -f "$key" ]; then cat "$key" else local image="${IMAGES[RANDOM % ${#IMAGES[@]}]}" echo "$image" > "$key" echo "$image" fi } # ------------------------------- # Subscribe to workspace events # ------------------------------- { echo '{"subscribe":["workspace"]}' "$CURRENTPATH/socat" - UNIX-CONNECT:"$IPC_SOCKET" } | while read -r line; do [[ "$line" =~ ^\{ ]] || continue WS_NUM=$("$CURRENTPATH/jq" -r 'select(.type=="workspace" and .active==true) | .workspace' <<< "$line" 2>/dev/null || true) MONITOR=$("$CURRENTPATH/jq" -r '.monitor' <<< "$line" 2>/dev/null || true) if [ -n "$WS_NUM" ] && [ -n "$MONITOR" ]; then WALLPAPER=$(get_wallpaper "$WS_NUM" "$MONITOR") echo "Setting wallpaper for workspace $WS_NUM on monitor $MONITOR: $WALLPAPER" "$CURRENTPATH/awww" img "$WALLPAPER" --resize stretch --namespace "$WS_NUM" fi done