84 lines
2.5 KiB
Bash
Executable File
84 lines
2.5 KiB
Bash
Executable File
#!/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 swww-daemon if not already running
|
|
# -------------------------------
|
|
SWWW_SOCKET="$XDG_RUNTIME_DIR/swww/$NAMESPACE.sock"
|
|
|
|
if [ ! -S "$SWWW_SOCKET" ]; then
|
|
if ! pgrep -f "swww-daemon.*--namespace $NAMESPACE" >/dev/null; then
|
|
echo "Starting swww-daemon for namespace $NAMESPACE..."
|
|
"$CURRENTPATH/swww-daemon" --namespace "$NAMESPACE" &
|
|
sleep 0.5
|
|
else
|
|
echo "swww-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/swww" img "$WALLPAPER" --resize stretch --namespace "$WS_NUM"
|
|
fi
|
|
done
|