set_wallpaper (5535B)
1 #!/bin/bash 2 3 # Wallpaper Management Script 4 # Usage: 5 # set_wallpaper.sh # Set wallpaper from config file 6 # set_wallpaper.sh filename.jpg # Set new wallpaper and update config 7 # set_wallpaper.sh --select # Select wallpaper using rofi 8 9 set -e 10 11 # Configuration 12 CONFIG_FILE="$HOME/.config/wallpaper.conf" 13 WALLPAPER_DIR="$HOME/Wallpapers" 14 DEFAULT_WALLPAPER="$WALLPAPER_DIR/gruvbox_spac.jpg" 15 16 # Colors for output 17 RED='\033[0;31m' 18 GREEN='\033[0;32m' 19 YELLOW='\033[1;33m' 20 NC='\033[0m' # No Color 21 22 # Logging functions 23 log_info() { 24 echo -e "${GREEN}[INFO]${NC} $1" 25 } 26 27 log_warn() { 28 echo -e "${YELLOW}[WARN]${NC} $1" 29 } 30 31 log_error() { 32 echo -e "${RED}[ERROR]${NC} $1" >&2 33 } 34 35 # Ensure wallpaper directory exists 36 ensure_wallpaper_dir() { 37 if [[ ! -d "$WALLPAPER_DIR" ]]; then 38 log_warn "Wallpaper directory $WALLPAPER_DIR not found, creating..." 39 mkdir -p "$WALLPAPER_DIR" 40 fi 41 } 42 43 # Read current wallpaper from config 44 read_wallpaper_config() { 45 if [[ -f "$CONFIG_FILE" ]]; then 46 source "$CONFIG_FILE" 47 echo "${WALLPAPER_PATH:-$DEFAULT_WALLPAPER}" 48 else 49 log_warn "Config file not found, using default wallpaper" 50 echo "$DEFAULT_WALLPAPER" 51 fi 52 } 53 54 # Write wallpaper to config 55 write_wallpaper_config() { 56 local wallpaper_path="$1" 57 local config_dir 58 config_dir="$(dirname "$CONFIG_FILE")" 59 60 mkdir -p "$config_dir" 61 62 echo "# Wallpaper Configuration" >"$CONFIG_FILE" 63 echo "# Format: WALLPAPER_PATH=~/Wallpapers/filename.jpg" >>"$CONFIG_FILE" 64 echo "# The wallpaper script will read this file and apply the specified wallpaper" >>"$CONFIG_FILE" 65 echo "" >>"$CONFIG_FILE" 66 echo "WALLPAPER_PATH=$wallpaper_path" >>"$CONFIG_FILE" 67 68 log_info "Wallpaper config updated: $wallpaper_path" 69 } 70 71 # Validate wallpaper file exists 72 validate_wallpaper() { 73 local wallpaper_path="$1" 74 75 wallpaper_path="${wallpaper_path/#\~/$HOME}" 76 77 if [[ ! -f "$wallpaper_path" ]]; then 78 log_error "Wallpaper file not found: $wallpaper_path" 79 return 1 80 fi 81 82 return 0 83 } 84 85 # Apply wallpaper using feh 86 apply_wallpaper() { 87 local wallpaper_path="$1" 88 89 wallpaper_path="${wallpaper_path/#\~/$HOME}" 90 91 if ! validate_wallpaper "$wallpaper_path"; then 92 return 1 93 fi 94 95 if feh --bg-fill "$wallpaper_path"; then 96 log_info "Wallpaper applied successfully: $(basename "$wallpaper_path")" 97 return 0 98 else 99 log_error "Failed to apply wallpaper: $wallpaper_path" 100 return 1 101 fi 102 } 103 104 # Select wallpaper using rofi 105 select_wallpaper() { 106 ensure_wallpaper_dir 107 108 local selected 109 110 selected=$( 111 find "$WALLPAPER_DIR" -maxdepth 1 -type f \ 112 \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.webp" -o -iname "*.bmp" \) | 113 sed "s|$WALLPAPER_DIR/||" | 114 sort | 115 rofi -dmenu -m 0 -i -p ">" 116 ) 117 118 [[ -z "$selected" ]] && exit 0 119 120 echo "$WALLPAPER_DIR/$selected" 121 } 122 123 # Show usage 124 show_usage() { 125 echo "Wallpaper Management Script" 126 echo "" 127 echo "Usage:" 128 echo " $0 # Set wallpaper from config file" 129 echo " $0 filename.jpg # Set new wallpaper and update config" 130 echo " $0 --select # Select wallpaper using rofi" 131 echo " $0 --list # List available wallpapers" 132 echo " $0 --help # Show this help" 133 echo "" 134 echo "Examples:" 135 echo " $0 gruvbox_spac.jpg" 136 echo " $0 ~/Wallpapers/joyboy.png" 137 echo " $0 --select" 138 } 139 140 # List available wallpapers 141 list_wallpapers() { 142 ensure_wallpaper_dir 143 144 log_info "Available wallpapers in $WALLPAPER_DIR:" 145 146 local wallpapers 147 wallpapers=("$WALLPAPER_DIR"/*.{jpg,jpeg,png,bmp,webp}) 148 149 local found=false 150 151 for wallpaper in "${wallpapers[@]}"; do 152 if [[ -f "$wallpaper" ]]; then 153 echo " $(basename "$wallpaper")" 154 found=true 155 fi 156 done 157 158 if [[ "$found" == false ]]; then 159 log_warn "No wallpapers found in $WALLPAPER_DIR" 160 fi 161 } 162 163 # Main function 164 main() { 165 local wallpaper_path 166 local action="from_config" 167 168 case "${1:-}" in 169 --help | -h) 170 show_usage 171 exit 0 172 ;; 173 174 --select | -s) 175 action="select" 176 ;; 177 178 --list | -l) 179 list_wallpapers 180 exit 0 181 ;; 182 183 "") 184 action="from_config" 185 ;; 186 187 *) 188 wallpaper_path="$1" 189 190 if [[ "$wallpaper_path" != *"/"* ]]; then 191 wallpaper_path="$WALLPAPER_DIR/$wallpaper_path" 192 fi 193 194 wallpaper_path="${wallpaper_path/#$HOME/\~}" 195 action="specific" 196 ;; 197 esac 198 199 case "$action" in 200 "from_config") 201 wallpaper_path=$(read_wallpaper_config) 202 log_info "Setting wallpaper from config: $(basename "$wallpaper_path")" 203 ;; 204 205 "select") 206 wallpaper_path=$(select_wallpaper) 207 log_info "Selected wallpaper: $(basename "$wallpaper_path")" 208 ;; 209 210 "specific") 211 log_info "Setting specific wallpaper: $(basename "$wallpaper_path")" 212 ;; 213 esac 214 215 if validate_wallpaper "$wallpaper_path"; then 216 if apply_wallpaper "$wallpaper_path"; then 217 218 if [[ "$action" != "from_config" ]]; then 219 write_wallpaper_config "$wallpaper_path" 220 fi 221 222 log_info "Wallpaper set successfully!" 223 else 224 log_error "Failed to set wallpaper" 225 exit 1 226 fi 227 else 228 log_error "Invalid wallpaper file: $wallpaper_path" 229 exit 1 230 fi 231 } 232 233 main "$@"