debian-dots

dotfiles (does the obvious)
git clone [email protected]:dracuxan/debian-dots.git
Log | Files | Refs | README | LICENSE

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 "$@"