#!/bin/bash

# Usage: place-window [<window_ID>[ <delay>[ <type>[ <sizeX>[ <sizeY>[ <newPosX> <newPosY>]]]]]]
# if <window_ID> remains empty the current window will be positioned
# if <delay> is not set then delay=1 (sec)
# if delay < 0 then place-window waits for the next opening window
# if type=0 then the script refers to the whole screen, otherwise (1 / 2) to the left /right half, default is 0.
# if <sizeX> or <sizeY> is not set then it keeps the current value
# if <newPosX>  and <newPosY> are not set then the active window gets centered in whole screen or touches half screen

win_id="$1"
keep_size=false
delay="$2"; type="$3"
if [ -z "$delay" ]; then delay="1"; fi
if [ "${delay::1}" = "-" ]; then
  delay=${delay#-}
  wait_for_win=true
else
  wait_for_win=false
fi
if [ -z "$type" ]; then type="0"; fi
if ! $wait_for_win; then sleep "$delay"; fi

sizeX="$4"
sizeY="$5"
newPosX="$6"
newPosY="$7"

if $wait_for_win; then
    IFS=$'\n'
    pre_win=($(wmctrl -l))
    n_pre_win=${#pre_win[@]}
    n_post_win=$n_pre_win
    while [ $n_post_win -eq $n_pre_win ]; do
	post_win=($(wmctrl -l))
	n_post_win=${#post_win[@]}
    done
    sleep $delay
fi
[ -z "$win_id" ] && win_id=$(xdotool getactivewindow)
win_geo=$(xdotool getwindowgeometry $win_id)
size=${win_geo#*Geometry: }

if [ -z "$sizeX" ] && [ -z "$sizeY" ]; then keep_size=true; fi
if [ -z "$sizeX" ]; then sizeX=${size%x*}; fi
if [ -z "$sizeY" ]; then sizeY=${size#*x}; fi
if [ $type -gt 0 ]; then
    newPosX=""; newPosY=""; keep_size=false
fi

if [ -z "$newPosX" ] && [ -z "$newPosY" ]; then
    IFS='x' read screenWidth screenHeight < <(xdpyinfo | grep dimensions | grep -o '[0-9x]*' | head -n1)
    (( screenHalf = screenWidth/2 ))
    if [ $type -gt 0 ] && [ $sizeX -gt $screenHalf ]; then sizeX=$screenHalf; fi
    case $type in
      0) newPosX=$(( screenWidth / 2 - sizeX / 2 )); newPosY=$(( screenHeight / 2 - sizeY / 2 )) ;;
      1) newPosX=$(( screenWidth / 2 - sizeX )); newPosY=$(( screenHeight / 2 - sizeY / 2 )) ;;
      2) newPosX=$(( screenWidth / 2 )); newPosY=$(( screenHeight / 2 - sizeY / 2 )) ;;
    esac
fi

if $keep_size; then
    xdotool windowmove $win_id $newPosX $newPosY
else
    wmctrl -i -r $win_id -e 0,$newPosX,$newPosY,$sizeX,$sizeY
fi
