clicksnap CTRL+click window snapping for Openbox
https://maboxlinux.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.5 KiB
78 lines
2.5 KiB
#!/bin/bash |
|
### clicksnap - click on the appropriate area of the window to snap it in a given direction. |
|
# Works with active and inactive windows |
|
# Author: Daniel Napora <napcok@gmail.com> |
|
# https://maboxlinux.org |
|
# |
|
### Configuration |
|
# Gap between windows |
|
GAP="32" |
|
# TITLEBAR HEIGHT - no idea how to find it from cli |
|
TITLEBAR_HEIGHT="20" |
|
# Activate moved windows? |
|
activate_window="false" |
|
### End Configuration |
|
|
|
eval $(xdotool getmouselocation --shell) |
|
Mouse_x="$X" |
|
Mouse_y="$Y" |
|
|
|
HEX_ID=$(printf '0x%x\n' $WINDOW) |
|
|
|
CHILD_ID=$(xwininfo -id $HEX_ID -children|grep "\"" | awk '{print $1}') |
|
|
|
if xwininfo -id $CHILD_ID -wm |grep Dock ; then exit 0 ;fi # Ignore Dock eg. tint2 |
|
|
|
if xwininfo -id $CHILD_ID -wm |grep Undecorated ; then # Undecorated |
|
T="0" |
|
else # Decorated |
|
T="$TITLEBAR_HEIGHT" |
|
fi |
|
|
|
eval $(xdotool getwindowgeometry --shell $WINDOW) |
|
Win_x="$X" |
|
Win_y="$Y" |
|
Win_width="$WIDTH" |
|
Win_height="$HEIGHT" |
|
|
|
Rel_x="$((Mouse_x-Win_x))" |
|
Rel_y="$((Mouse_y-Win_y))" |
|
|
|
pos_x="$(((Mouse_x-Win_x)/(Win_width/3)))" |
|
pos_y="$(((Mouse_y-Win_y)/(Win_height/3)))" |
|
POS_CODE="$pos_x$pos_y" |
|
|
|
OFFSET=$(wmctrl -d |grep "*" | awk -F' ' '{print $8}') |
|
REALSIZE=$(wmctrl -d |grep "*" | awk -F' ' '{print $9}') |
|
|
|
AVAIL_X="${REALSIZE%x*}" |
|
AVAIL_Y="${REALSIZE#*x}" |
|
|
|
OFF_X="${OFFSET%,*}" |
|
OFF_Y="${OFFSET#*,}" |
|
|
|
case $POS_CODE in |
|
00) # top-left |
|
W=$((AVAIL_X/2-GAP*3/2)) H=$((AVAIL_Y/2-T-GAP*3/2)) X=$((0+OFF_X+GAP)) Y=$((0+OFF_Y+GAP));; |
|
10) # top |
|
W=$((AVAIL_X-GAP*2)) H=$((AVAIL_Y/2-T-GAP*3/2)) X=$((0+OFF_X+GAP)) Y=$((0+OFF_Y+GAP));; |
|
20) # top-right |
|
W=$((AVAIL_X/2-GAP*3/2)) H=$((AVAIL_Y/2-T-GAP*3/2)) X=$((AVAIL_X/2+OFF_X+GAP/2)) Y=$((0+OFF_Y+GAP));; |
|
01) # left |
|
W=$((AVAIL_X/2-GAP*3/2)) H=$((AVAIL_Y-T-GAP*2)) X=$((0+OFF_X+GAP)) Y=$((0+OFF_Y+GAP));; |
|
11) # center |
|
W=$((AVAIL_X/8*6-OFF_X)) H=$((AVAIL_Y/8*6-T)) X=$((AVAIL_X/8+OFF_X/2)) Y=$((AVAIL_Y/8+OFF_Y/2));; |
|
21) # right |
|
W=$((AVAIL_X/2-GAP*3/2)) H=$((AVAIL_Y-T-GAP*2)) X=$((AVAIL_X/2+OFF_X+GAP/2)) Y=$((0+OFF_Y+GAP));; |
|
02) # bottom-left |
|
W=$((AVAIL_X/2-GAP*3/2)) H=$((AVAIL_Y/2-T-GAP*3/2)) X=$((0+OFF_X+GAP)) Y=$((AVAIL_Y/2+OFF_Y+GAP/2));; |
|
12) # bottom |
|
W=$((AVAIL_X-GAP*2)) H=$((AVAIL_Y/2-T-GAP*3/2)) X=$((0+OFF_X+GAP)) Y=$((AVAIL_Y/2+OFF_Y+GAP/2));; |
|
22) # bottom-right |
|
W=$((AVAIL_X/2-GAP*3/2)) H=$((AVAIL_Y/2-T-GAP*3/2)) X=$((AVAIL_X/2+OFF_X+GAP/2)) Y=$((AVAIL_Y/2+OFF_Y+GAP/2));; |
|
esac |
|
|
|
|
|
xdotool windowsize $WINDOW $W $H |
|
xdotool windowmove $WINDOW $X $Y |
|
if [ $activate_window == "true" ]; then xdotool windowactivate $WINDOW; fi
|
|
|