97 lines
3.1 KiB
Bash
Executable File
97 lines
3.1 KiB
Bash
Executable File
#!/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
|
|
#
|
|
CONFIG_DIR="$HOME/.config/deskgrid"
|
|
CONFIG_FILE="$CONFIG_DIR/deskgrid.conf"
|
|
mkdir -p $CONFIG_DIR
|
|
if [ ! -f $CONFIG_FILE ]; then
|
|
cat <<EOF > ${CONFIG_FILE}
|
|
# Gap between windows in pixels (reasonable values: 0 8 16 24)
|
|
gap=16
|
|
# Grid columns (12 16 24)
|
|
grid_x=16
|
|
# Grid rows (6 12 16)
|
|
grid_y=12
|
|
#
|
|
titlebar_height=18
|
|
#Notifications true or false
|
|
enable_notifications=true
|
|
# Outer gap (disable if you use WM margins)
|
|
show_outer_gap=true
|
|
# Only for clicksnap action
|
|
activate_window=false
|
|
EOF
|
|
fi
|
|
source <(grep = $CONFIG_FILE)
|
|
|
|
GAP=${gap:-16}
|
|
TITLEBAR_HEIGHT=${titlebar_height:-18}
|
|
|
|
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
|
|
|
|
## OUTER GAP
|
|
if [[ "$show_outer_gap" == "true" ]]; then OUT_GAP="$GAP" ; else OUT_GAP="0" ; fi
|
|
echo "OUT_GAP: $OUT_GAP"
|
|
|
|
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-OUT_GAP-GAP/2)) H=$((AVAIL_Y/2-T-OUT_GAP-GAP/2)) X=$((0+OFF_X+OUT_GAP)) Y=$((0+OFF_Y+OUT_GAP));;
|
|
10) # top
|
|
W=$((AVAIL_X-OUT_GAP*2)) H=$((AVAIL_Y/2-T-OUT_GAP-GAP/2)) X=$((0+OFF_X+OUT_GAP)) Y=$((0+OFF_Y+OUT_GAP));;
|
|
20) # top-right
|
|
W=$((AVAIL_X/2-OUT_GAP-GAP/2)) H=$((AVAIL_Y/2-T-OUT_GAP-GAP/2)) X=$((AVAIL_X/2+OFF_X+GAP/2)) Y=$((0+OFF_Y+OUT_GAP));;
|
|
01) # left
|
|
W=$((AVAIL_X/2-OUT_GAP-GAP/2)) H=$((AVAIL_Y-T-OUT_GAP*2)) X=$((0+OFF_X+OUT_GAP)) Y=$((0+OFF_Y+OUT_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-OUT_GAP-GAP/2)) H=$((AVAIL_Y-T-OUT_GAP*2)) X=$((AVAIL_X/2+OFF_X+GAP/2)) Y=$((0+OFF_Y+OUT_GAP));;
|
|
02) # bottom-left
|
|
W=$((AVAIL_X/2-OUT_GAP-GAP/2)) H=$((AVAIL_Y/2-T-OUT_GAP-GAP/2)) X=$((0+OFF_X+OUT_GAP)) Y=$((AVAIL_Y/2+OFF_Y+GAP/2));;
|
|
12) # bottom
|
|
W=$((AVAIL_X-OUT_GAP*2)) H=$((AVAIL_Y/2-T-OUT_GAP-GAP/2)) X=$((0+OFF_X+OUT_GAP)) Y=$((AVAIL_Y/2+OFF_Y+GAP/2));;
|
|
22) # bottom-right
|
|
W=$((AVAIL_X/2-OUT_GAP-GAP/2)) H=$((AVAIL_Y/2-T-OUT_GAP-GAP/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
|