diff --git a/move.sh b/move.sh index d1e7b35..1ae3d86 100644 --- a/move.sh +++ b/move.sh @@ -3,35 +3,91 @@ # Theme directory name theme=${1:-default} # Will default hot-babe theme, if it can be found +if hbpid=$(pgrep -x hot-babe) ; then + # Seems to be running. Check if --dir was passed, and extract its value if so + if runningTheme=$(ps -o args= -p $hbpid | \ + grep -o -- '--dir [^[:space:]]*' | \ + cut -f 2 -d ' ' \ + ) ; then + # Whatever was given on the command line, we override with the running theme + theme=$runningTheme + fi -# Margins set in integer percentage points -XmarginPct=${2:-2} # Default 2% of screen width -YmarginPct=${3:-0} # Default no vertical margin + if [ "$2" ] && ! [ "${2%%%}" -eq "${2%%%}" ] 2>/dev/null ; then + # Both theme and Z-order was given (or at least two string values - whatever + # they might be.) Toss away the first argument. The suffix pattern removal + # allows passing of percentage values for margins (removing any trailing % + # before checking if the remainder is still a string). + shift + fi +fi + +if [ "${1%%%}" -eq "${1%%%}" ] 2>/dev/null ; then + # The first remaining argument is a number, so any Z-order argument must be $5 + casevar=$5 +else + if [ "$6" ] ; then + # If a sixth argument was given, it's our Z-order + casevar=$6 + shift + else + # Hopefully the first remaining argument is Z-order + # Of course this means the usage() text is slightly wrong.. + casevar=$1 + shift + fi +fi + +# Z-order; above/below +# Define the zorder() function which constructs the xdotool command +case $casevar in + [Aa][Bb][Oo][Vv][Ee]) + zorder() { echo "windowstate --remove BELOW $1 windowstate --add ABOVE $1"; } + ;; + [Bb][Ee][Ll][Oo][Ww]) + # Defer to the default + ;& + *) + zorder() { echo "windowstate --remove ABOVE $1 windowstate --add BELOW $1"; } +esac + +# Margins set in integer pixels or percentage points +Xmargin=${1:-0} # Default no horizontal margin +Ymargin=${2:-0} # Default no vertical margin # Alignment; left/right and top/bottom -Xalign=${4:-right} # Default right-edge -Yalign=${5:-bottom} # Default bottom-edge +Xalign=${3:-right} # Default right-edge +Yalign=${4:-bottom} # Default bottom-edge -#### Do not modify beyond this line #### usage() { echo '${0} - Position hot-babe on screen.' echo 'Usage:' - echo " ${0} [ ]" + echo " ${0} [] [ ] []" echo ' where' - echo ' is the name of a theme directory in ~/.hot-babe or "default",' - echo ' is given in percentage of screensize (integer only), and' - echo ' is given as left/right and top/bottom, respectively.' + echo ' is the name of a theme directory in ~/.hot-babe or "default",' + echo ' is given in pixels or percentage of screensize (integer only),' + echo ' is given as left/right and top/bottom, respectively, and' + echo ' is above or below. This option can be given independently of the' + echo ' other positioning arguments; if given it must come last (or instead' + echo ' of the theme name).' + echo + echo 'If is not specified (or "default" is given), the script will try to' + echo 'find a running Hot Babe and determine if a "--dir " argument was given.' echo echo 'Note that this script will only make a limited effort at locating the' echo 'files for the default theme; locate it and copy to your ~/.hot-babe if' echo 'this fails.' echo + echo 'Default values are: Zero margins, bottom-right alignment, below other windows.' + echo exit 1 } -if [ "${2}" ] ; then - if [ -z "${5}" ] ; then +if [ "${1}" ] ; then + # If we have any arguments remaining.. + if [ -z "${4}" ] ; then + # ..but not at least four, then we're missing some. echo "If any positional options are given, all must be given." echo usage @@ -64,22 +120,34 @@ if ! [ -f "${dir}/descr" ] ; then fi # Extract screen dimensions from xprop +# Using 'set' this way splits the passed value by IFS and assigns to positional +# parameters. IFS=' ' set -- $(xprop -root _NET_DESKTOP_GEOMETRY|tr -d ,|cut -f 3,4 -d ' ') scrwidth=$1 scrheigth=$2 -unset IFS if ! [ "$scrwidth" -gt 0 ] || ! [ "$scrheigth" -gt 0 ] ; then echo "Could not determine screen dimensions. Does 'xprop' work at all?" + echo "Got '$scrwidth' and '$scrheigth'." exit 1 fi # Calculate margins -marginX=$((scrwidth*XmarginPct/100)) -marginY=$((scrheigth*YmarginPct/100)) +if [ "${Xmargin%%%}" -ge 0 ] && ! [ "${Xmargin}" -gt 0 ] 2>/dev/null ; then + # Margins apparently given in % + marginX=$((scrwidth*${Xmargin%%%}/100)) +else + marginX=$Xmargin +fi +if [ "${Ymargin%%%}" -ge 0 ] && ! [ "${Ymargin}" -gt 0 ] 2>/dev/null ; then + # Margins apparently given in % + marginY=$((scrheigth*${Ymargin%%%}/100)) +else + marginY=$Ymargin +fi if ! [ "$marginX" -ge 0 ] || ! [ "$marginY" -ge 0 ] ; then - echo "Could not calculate margins." + echo "Could not calculate margins. Was given '$marginX' and '$marginY'." usage fi @@ -87,11 +155,11 @@ fi IFS=' ' set -- $(file "${first}"|grep -Eo '[0-9]{1,4} x [0-9]{1,4}'|cut -f 1,3 -d ' ') imgwidth=$1 imgheigth=$2 -unset IFS if ! [ "$imgwidth" -gt 0 ] || ! [ "$imgheigth" -gt 0 ] ; then echo "Could not determine image dimensions. Check that the 'file' command gives sane output." echo "Its output must contain image dimensions matching the regex '[0-9]{1,4} x [0-9]{1,4}'." + echo "(Was given '$imgwidth' and '$imgheigth'.)" exit 1 fi @@ -103,7 +171,7 @@ case $Xalign in posX=$marginX ;; *) - echo "Xalign not correctly specified ('right' or 'left')" + echo "Xalign not correctly specified ('right' or 'left'). Was given '$Xalign'." usage esac @@ -115,19 +183,20 @@ case $Yalign in posY=$(((scrheigth-marginY)-imgheigth)) ;; *) - echo "Yalign not correctly specified ('top' or 'bottom')" + echo "Yalign not correctly specified ('top' or 'bottom'). Was given '$Yalign'." usage esac +# Let's wait for the Babe to show up. wait=0 while [ $wait -lt 10 ] ; do - if [ $(xdotool search --class hot-babe | wc -l) -gt 0 ] ; then + if window=$(xdotool search --class hot-babe) ; then echo "The Hot Babe is here, relocating.." - sleep 0.5 - xdotool search --class hot-babe windowmove %1 $posX $posY windowstate --add BELOW %1 + xdotool windowmove $window $posX $posY $(zorder $window) exit 0 else wait=$((wait+2)) + # Let's not sit around for those last 2 seconds if [ $wait -ge 10 ] ; then break fi