92 lines
3.5 KiB
Bash
Executable File
92 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Configuration
|
|
WALLPAPER_DIR="$HOME/.wallpapers" # Change this to your wallpaper directory
|
|
CACHE_DIR="$HOME/.cache/wallpaper-selector"
|
|
THUMBNAIL_WIDTH="250" # Size of thumbnails in pixels (16:9)
|
|
THUMBNAIL_HEIGHT="141"
|
|
# Create cache directory if it doesn't exist
|
|
mkdir -p "$CACHE_DIR"
|
|
|
|
# Function to generate thumbnail
|
|
generate_thumbnail() {
|
|
local input="$1"
|
|
local output="$2"
|
|
magick "$input" -thumbnail "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}^" -gravity center -extent "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" "$output"
|
|
}
|
|
|
|
# Create shuffle icon thumbnail on the fly
|
|
SHUFFLE_ICON="$CACHE_DIR/shuffle_thumbnail.png"
|
|
# Create a properly sized shuffle icon thumbnail
|
|
# magick -size "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" xc:#1e1e2e \
|
|
# "$HOME/Repos/wallpaper-selector/assets/shuffle.png" -resize "120x120" -gravity center -composite \
|
|
# "$SHUFFLE_ICON"
|
|
magick -size "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" xc:#1e1e2e \
|
|
\( "$HOME/Repos/wallpaper-selector/assets/shuffle.png" -resize "80x80" \) \
|
|
-gravity center -composite "$SHUFFLE_ICON"
|
|
|
|
# Generate thumbnails and create menu items
|
|
generate_menu() {
|
|
# Add random/shuffle option with a name that sorts first (using ! prefix)
|
|
echo -en "img:$SHUFFLE_ICON\x00info:!Random Wallpaper\x1fRANDOM\n"
|
|
|
|
# Then add all wallpapers
|
|
for img in "$WALLPAPER_DIR"/*.{jpg,jpeg,png}; do
|
|
# Skip if no matches found
|
|
[[ -f "$img" ]] || continue
|
|
|
|
# Generate thumbnail filename
|
|
thumbnail="$CACHE_DIR/$(basename "${img%.*}").png"
|
|
|
|
# Generate thumbnail if it doesn't exist or is older than source
|
|
if [[ ! -f "$thumbnail" ]] || [[ "$img" -nt "$thumbnail" ]]; then
|
|
generate_thumbnail "$img" "$thumbnail"
|
|
fi
|
|
|
|
# Output menu item (filename and path)
|
|
echo -en "img:$thumbnail\x00info:$(basename "$img")\x1f$img\n"
|
|
done
|
|
}
|
|
|
|
# Use wofi to display grid of wallpapers - IMPORTANT: added --sort-order=default
|
|
selected=$(generate_menu | wofi --show dmenu \
|
|
--cache-file /dev/null \
|
|
--define "image-size=${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" \
|
|
--columns 3 \
|
|
--allow-images \
|
|
--insensitive \
|
|
--sort-order=default \
|
|
--prompt "Select Wallpaper" \
|
|
--conf ~/.config/wofi/wallpaper.conf \
|
|
)
|
|
|
|
# Set wallpaper if one was selected
|
|
if [ -n "$selected" ]; then
|
|
# Remove the img: prefix to get the cached thumbnail path
|
|
thumbnail_path="${selected#img:}"
|
|
|
|
# Check if random wallpaper was selected
|
|
if [[ "$thumbnail_path" == "$SHUFFLE_ICON" ]]; then
|
|
# Select a random wallpaper from the directory
|
|
original_path=$(find "$WALLPAPER_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | shuf -n 1)
|
|
else
|
|
# Get the original filename from the thumbnail path
|
|
original_filename=$(basename "${thumbnail_path%.*}")
|
|
|
|
# Find the corresponding original file in the wallpaper directory
|
|
original_path=$(find "$WALLPAPER_DIR" -type f -name "${original_filename}.*" | head -n1)
|
|
fi
|
|
|
|
# Ensure a valid wallpaper was found before proceeding
|
|
if [ -n "$original_path" ]; then
|
|
hyprctl hyprpaper wallpaper ",$original_path"
|
|
|
|
# Save the selection for persistence
|
|
echo "$original_path" > "$HOME/.cache/current_wallpaper"
|
|
|
|
# Optional: Notify user
|
|
notify-send "Wallpaper" "Wallpaper has been updated" -i "$original_path"
|
|
else
|
|
notify-send "Wallpaper Error" "Could not find the original wallpaper file."
|
|
fi
|
|
fi
|