diff options
Diffstat (limited to '')
-rwxr-xr-x | wmutils/bin/switch_grid.sh | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/wmutils/bin/switch_grid.sh b/wmutils/bin/switch_grid.sh new file mode 100755 index 0000000..a7aa66d --- /dev/null +++ b/wmutils/bin/switch_grid.sh @@ -0,0 +1,93 @@ +#!/bin/sh +# +# Copyright (c) 2015 Greduan <me@greduan.com>, licensed under the WTFPL license +# Credit where credit is due, the grid algorithm was written by z3bra +# +# When used puts all the windows in a grid and when you focus one of the windows +# it puts all the windows back to their original location and focuses the window +# you switched to. +# depends on: wew focus.sh + +TEMP=$(mktemp) && wattr xywhi $(lsw) > $TEMP +NB=$(wc -l < $TEMP) # NB as in NumBer of windows + +# just safety +if [ $NB -eq 1 ]; then + exit +fi + +# user defined +BW=${BW:-4} # width of your borders +GAP=${GAP:-20} # gap between windows + +# get monitor dimensions +ROOT=$(lsw -r) +SW=$(wattr w $ROOT) +SH=$(wattr h $ROOT) +# reduce screen useable screen area to improve later expressions +SW=$(( SW - GAP - 2*BW )) +SH=$(( SH - GAP - 2*BW )) + +# calculate the size of the grid using the square root of the number of windows +ROWS=$(echo "sqrt($NB)" | bc) +COLS=$ROWS + +# FOLLOWING WAS WRITTEN BY Z3BRA, don't give me credit for this awesome logic +# for each row... +for r in `seq 1 $ROWS`; do + + # .. if we're on the last row, display all the remaining windows + # eg: if we have 12 windows, the square root would be 3 (truncated). + # so the script would draw a 3x3 grid. This would leave 3 windows apart. To + # avoid this, we set the number of columns of the last row as + # + # 12 - 3 * (3-1) + # => 12 - 3 * 2 + # => 12 - 6 + # == 6 + # so we will have 6 windows on the last row, instead of 3. + # This do not lead to the best looking grid, I know (the best one would be + # 3x4), but it's the simplest algo I've found. Don't forget we're playing + # with shell scripts here, not matlab.. + test $r -eq $ROWS && COLS=$(( NB - ROWS * (ROWS-1) )) + + # for each column of each row.. + for c in `seq 1 $COLS`; do + + # exit if we don't have other windows to display + test $(( (r-1)*r + c )) -gt $NB && break + + # heigh of windows (total heigh minus gaps and borders) + H=$(( SH/ROWS - GAP - BW )) + # same for width + W=$(( SW/COLS - GAP - BW )) + + # and the tricky part.. + # The X offset is the width * the actual column (starting from 0) + the + # gaps/borders multiplied by the column number (draw it on a sheet of + # paper like me, it will make much more sense! + X=$(( W * (c-1) + c*(GAP + BW) )) + # same for the Y offset + Y=$(( H * (r-1) + r*(GAP + BW) )) + + # finally, teleport the window to the place we just calculated. + # the sed trick is used to get the corresponding line number in the file + # holding the window infos. + wtp $X $Y $W $H $(sed "$(( (r-1)*r + c ))p;d" $TEMP | cut -d\ -f5) + done +done +# END Z3BRA + +# listen to wew for our desired event +wew -m 4 | while IFS=: read ev wid; do + if [ $ev -eq 4 ]; then + while read line; do + wtp $line + done < $TEMP + focus.sh $wid + killall wew + fi +done + +# cleanup +rm $TEMP |