#!/usr/bin/env bash WALLFILE="$HOME/Pictures/wallconfig" WALLLINK="$HOME/Pictures/current_wall" BINNAME="setwall" function unsetwalls() { for wall in $@; do echo unsetting $wall pat=$(echo $wall | sed 's/\//\\\//g') sed -i.bak "/$pat/d" $WALLFILE done } function unsetcur() { if [ -f "${WALLLINK}" ]; then unsetwalls $(realpath --relative-to=$HOME $WALLLINK) else echo "could not resolve current wallpaper" exit 1 fi } function delete() { echo deleting wallfile rm $WALLFILE } function unsetall() { echo clearing wallfile echo -n > $WALLFILE } function setwalls() { for wall in $@; do if grep -q $wall "$WALLFILE"; then echo $wall already set else echo setting $wall echo $wall >> $WALLFILE fi done } function runsetwall() { feh --bg-tile $1 # wal --saturate 0.9 -i $1 } function applywall() { echo applying wallpaper $1 rm $WALLLINK ln -s $(pwd)/$1 $WALLLINK runsetwall $1 } function reapply() { echo reapplying linked wallpaper # feh --bg-fill $WALLLINK runsetwall $WALLLINK } function help() { echo "Wallpaper mangement script" echo echo "Syntax: ${BINNAME} OPTIONS" echo "options:" echo " -A, --apply [OPTIONS] applies a random wallpaper" echo " -S, --set FILES sets new wallpapers" echo " -U, --unset [OPTIONS] [FILES] unsets new wallpapers" echo " -P, --preview FILE temporarily sets a wallpaper" echo " -h, --help this message" echo echo "unset options:" echo " -a, --all clears wallconfig file" echo " -d, --delete deleted wallconfig file" echo " -c, --current unset currently applied wallpaper" echo echo "apply options:" echo " -r, --reapply reapply last applied wallpaper" } function unknown() { echo "${BINNAME}: unknown option $1" 1>&2 exit 1 } if [[ $# -eq 0 ]]; then echo "${BINNAME}: no arguments given" 1>&2 help exit 1 fi mode="N" pos="" function apply_mode() { case $mode in U) unsetwalls $pos ;; S) setwalls $pos ;; A) applywall $(shuf -n 1 $WALLFILE) ;; esac } while [[ $# -gt 0 ]]; do keys="$1" # If $1 does is single - argument if [[ $1 == '-'* ]] && [[ ! $1 == '--'* ]] ; then # Remove first - keys=${keys#?} # Place space between each character keys=$(echo $keys | sed 's/./-& /g') fi for key in $keys; do case $mode in U) case $key in -a|--all) unsetall mode="N" ;; -d|--delete) delete mode="N" ;; -c|--current) unsetcur mode="N" ;; '-'*|'--'*) unknown $key ;; *) pos="$pos $key" shift ;; esac ;; A) case $key in -r|--reapply) reapply mode="N" ;; '-'*|'--'*) unknown $key ;; *) echo Unexpected argument help mode="N" ;; esac ;; S) pos="$pos $key" shift ;; *) apply_mode case $key in -A|--apply) mode="A" shift ;; -U|--unset) mode="U" shift ;; -S|--set) mode="S" shift ;; -P|--preview) applywall $2 ;; -h|--help) help shift exit 0 ;; *) unknown $key ;; esac ;; esac done done apply_mode