#!/bin/sh # This script does the following: # Run by itself, set the wallpaper (at X start). # If given a file, set that as the new wallpaper. # If given a directory, choose random file in it. # If wal is installed, also generates a colorscheme. # Use -c to generate colors from a different image than the wallpaper. # # Usage: # setbg # wallpaper + colors from same image # setbg -c # wallpaper from first, colors from second # setbg -c # same as above (order doesn't matter) # setbg -s # silent mode (no notifications) # setbg -w # wallpaper only (no colorscheme) # setbg -d # default Plan 9 theme + solid grey root # Location of link to wallpaper link. bgloc="${XDG_DATA_HOME:-$HOME/.local/share}/bg" default_bg="#737573" default_wallpaper="${XDG_DATA_HOME:-$HOME/.local/share}/wallpapers/plan9-grey.png" xresources="${XDG_CONFIG_HOME:-$HOME/.config}/x11/xresources" # Configuration files of applications that have their themes changed by pywal. dunstconf="${XDG_CONFIG_HOME:-$HOME/.config}/dunst/dunstrc" zathuraconf="${XDG_CONFIG_HOME:-$HOME/.config}/zathura/zathurarc" # Parse options silent="" colorimg="" wallonly="" default_theme="" while getopts "sdwc:" o; do case "${o}" in s) silent='1' ;; d) default_theme='1' ;; w) wallonly='1' ;; c) colorimg="$OPTARG" ;; esac done shift $((OPTIND - 1)) refreshdwm() { pidof dwm >/dev/null && xdotool key super+F5 } set_default_terminal_colors() { for term in /dev/pts/[0-9]*; do [ -w "$term" ] || continue { printf '\033]10;#000000\007' printf '\033]11;%s\007' "$default_bg" printf '\033]12;#000000\007' printf '\033]4;0;#000000\007' printf '\033]4;1;#aa0000\007' printf '\033]4;2;#448844\007' printf '\033]4;3;#99994c\007' printf '\033]4;4;#005dbb\007' printf '\033]4;5;#8888cc\007' printf '\033]4;6;#008888\007' printf '\033]4;7;#ffffea\007' printf '\033]4;8;%s\007' "$default_bg" printf '\033]4;9;#ff0000\007' printf '\033]4;10;#88cc88\007' printf '\033]4;11;#eeee9e\007' printf '\033]4;12;#4993dd\007' printf '\033]4;13;#ff00ff\007' printf '\033]4;14;#eaffff\007' printf '\033]4;15;#ffffff\007' printf '\033]4;256;#000000\007' printf '\033]4;258;%s\007' "$default_bg" printf '\033]4;259;#000000\007' } >"$term" 2>/dev/null done } if [ -n "$default_theme" ]; then [ -f "$xresources" ] && xrdb -merge "$xresources" [ -f "$default_wallpaper" ] && ln -sf "$default_wallpaper" "$bgloc" xwallpaper --tile "$default_wallpaper" set_default_terminal_colors [ -z "$silent" ] && notify-send "Default Plan 9 theme" "$default_bg" refreshdwm exit 0 fi # If no argument, just apply existing wallpaper if [ -z "$1" ]; then [ -f "$bgloc" ] && xwallpaper --zoom "$bgloc" exit 0 fi trueloc="$(readlink -f "$1")" && case "$(/usr/bin/file --mime-type -b "$trueloc")" in image/* ) ln -sf "$trueloc" "$bgloc" && [ -z "$silent" ] && notify-send -i "$bgloc" "Changing wallpaper..." ;; inode/directory ) ln -sf "$(find "$trueloc" -iregex '.*.\(jpg\|jpeg\|png\|gif\)' -type f | shuf -n 1)" "$bgloc" && [ -z "$silent" ] && notify-send -i "$bgloc" "Random Wallpaper chosen." ;; *) [ -z "$silent" ] && notify-send "🖼️ Error" "Not a valid image or directory." ; exit 1;; esac # Determine which image to use for colorscheme if [ -n "$colorimg" ]; then colorloc="$(readlink -f "$colorimg")" # Verify it's a valid image case "$(/usr/bin/file --mime-type -b "$colorloc")" in image/* ) ;; *) [ -z "$silent" ] && notify-send "🎨 Error" "Color image not valid." ; colorloc="" ;; esac else colorloc="$(readlink -f "$bgloc")" fi # If pywal is installed and wallpaper-only mode is not set, use it. if [ -z "$wallonly" ] && command -v wal >/dev/null 2>&1 ; then wal -n -i "$colorloc" -o "${XDG_CONFIG_HOME:-$HOME/.config}/wal/postrun" >/dev/null 2>&1 [ -z "$silent" ] && [ -n "$colorimg" ] && notify-send -i "$colorloc" "Colors from separate image" # If pywal is removed, return config files to normal. elif [ -z "$wallonly" ]; then [ -f "$dunstconf.bak" ] && unlink "$dunstconf" && mv "$dunstconf.bak" "$dunstconf" [ -f "$zathuraconf.bak" ] && unlink "$zathuraconf" && mv "$zathuraconf.bak" "$zathuraconf" fi xwallpaper --zoom "$bgloc" # If running, dwm hit the key to refresh the color scheme. refreshdwm