2021-05-14 19:35:19 +02:00
#!/bin/bash
### deskgrid - click on the window and select area to place it on the grid
# Works with active and inactive windows
# (C) Daniel Napora <napcok@gmail.com>, 2021
# https://maboxlinux.org
#
2021-05-21 23:06:41 +02:00
CONFIG_DIR=~/.config/deskgrid
2021-05-23 13:18:24 +02:00
CONFIG_FILE="$CONFIG_DIR/deskgrid.cfg"
2021-05-14 19:35:19 +02:00
mkdir -p $CONFIG_DIR
if [ ! -f $CONFIG_FILE ]; then
cat <<EOF > ${CONFIG_FILE}
2021-05-15 02:38:38 +02:00
# Gap between windows in pixels (reasonable values: 0 8 16 24)
2021-05-14 19:35:19 +02:00
gap=16
2021-05-15 02:38:38 +02:00
# Grid columns (12 16 24)
2021-05-23 13:18:24 +02:00
columns=12
2021-05-15 02:38:38 +02:00
# Grid rows (6 12 16)
2021-05-23 13:18:24 +02:00
rows=6
2021-05-14 19:35:19 +02:00
#
titlebar_height=18
#Notifications true or false
2021-05-21 23:06:41 +02:00
notifications=true
2021-05-15 02:38:38 +02:00
# Outer gap (disable if you use WM margins)
show_outer_gap=true
# Only for clicksnap action
activate_window=false
2021-05-14 19:35:19 +02:00
EOF
fi
source <(grep = $CONFIG_FILE)
GAP=${gap:-16}
2021-05-23 13:18:24 +02:00
COLUMNS=${columns:-12}
ROWS=${rows:-6}
2021-05-14 19:35:19 +02:00
TITLEBAR_HEIGHT=${titlebar_height:-18}
eval $(xdotool getmouselocation --shell)
# we have window id now as $WINDOW
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
xdotool windowminimize --sync $WINDOW
# Screen dimensions, margins and available size
SCREENSIZE=$(wmctrl -d |grep "*" | awk -F' ' '{print $4}')
MARGINS=$(wmctrl -d |grep "*" | awk -F' ' '{print $8}')
AVAILSIZE=$(wmctrl -d |grep "*" | awk -F' ' '{print $9}')
SCREEN_X="${SCREENSIZE%x*}"
SCREEN_Y="${SCREENSIZE#*x}"
AVAIL_X="${AVAILSIZE%x*}"
AVAIL_Y="${AVAILSIZE#*x}"
MARGIN_X="${MARGINS%,*}"
MARGIN_Y="${MARGINS#*,}"
#Show notify
2021-05-21 23:06:41 +02:00
if [ $notifications = true ]; then
notify-send.sh -t 15000 --replace-file=/tmp/deskgrid --icon=mbcc "Welcome to DeskGrid (experimental)" "\nDraw rectangle by mouse to set new window positon and size.\nWhile drawing you may hold Space key to move selection.\nNew window will be bigger than selection."
2021-05-14 19:35:19 +02:00
fi
# Take selection
slop=$(slop --highlight -b 4 --tolerance=0 --color=0.3,0.4,0.6,0.4 -f "%x %y %w %h") || exit 1
read -r X Y W H < <(echo $slop)
2021-05-23 13:18:24 +02:00
start_x="$(((X-MARGIN_X)/(AVAIL_X/COLUMNS)))"
start_y="$(((Y-MARGIN_Y)/(AVAIL_Y/ROWS)))"
end_x="$(((X-MARGIN_X+W)/(AVAIL_X/COLUMNS)))"
end_y="$(((Y-MARGIN_Y+H)/(AVAIL_Y/ROWS)))"
2021-05-14 19:35:19 +02:00
2021-05-15 02:38:38 +02:00
### Outer gap factor
if [[ $show_outer_gap = true ]]; then GF="1" ; else GF="0" ; fi
2021-05-14 19:35:19 +02:00
### SIZE and POS calculation
2021-05-15 02:38:38 +02:00
if [[ $start_x = "0" ]]; then GAP_X="$((GAP*GF))" ; else GAP_X=$((GAP/2)) ; fi
if [[ $start_y = "0" ]]; then GAP_Y="$((GAP*GF))" ; else GAP_Y=$((GAP/2)) ; fi
2021-05-14 19:35:19 +02:00
2021-05-23 13:18:24 +02:00
if [[ $end_x = $((COLUMNS-1)) ]]; then GAP_X_END="$((GAP*GF))" ; else GAP_X_END=$((GAP/2)) ; fi
if [[ $end_y = $((ROWS-1)) ]]; then GAP_Y_END="$((GAP*GF))" ; else GAP_Y_END=$((GAP/2)) ; fi
2021-05-14 19:35:19 +02:00
2021-05-23 13:18:24 +02:00
SIZE="$(((end_x-start_x+1)*(AVAIL_X/COLUMNS)-GAP_X-GAP_X_END)) $(((end_y-start_y+1)*(AVAIL_Y/ROWS)-GAP_Y-GAP_Y_END-T))"
2021-05-14 19:35:19 +02:00
2021-05-23 13:18:24 +02:00
POSITION="$((start_x*AVAIL_X/COLUMNS+GAP_X+MARGIN_X)) $((start_y*AVAIL_Y/ROWS+GAP_Y+MARGIN_Y))"
2021-05-14 19:35:19 +02:00
xdotool windowsize $WINDOW $SIZE
xdotool windowmove $WINDOW $POSITION
xdotool windowmap $WINDOW
2021-05-21 23:06:41 +02:00
if [ $notifications = true ]; then
2021-05-14 20:44:00 +02:00
notify-send.sh -t 15000 --replace-file=/tmp/deskgrid --icon=mbcc "Info" "You can disable those notifications or edit config file using buttons below.\n\n" -o "Disable notifications:mb-setvar enable_notifications=false ~/.config/deskgrid/deskgrid.conf" -o "Edit DeskGrid config file:geany ~/.config/deskgrid/deskgrid.conf"
2021-05-23 13:18:24 +02:00
#notify-send.sh -t 15000 --replace-file=/tmp/deskgrid --icon=mbcc "Success notification" "You can disable those notifications by editing config file. Button below.\nScreensize: $SCREENSIZE\nMargins: $MARGINS\nAvailable size: $AVAILSIZE\nGrid: $((AVAIL_X/COLUMNS)) x $((AVAIL_Y/ROWS)) Selection: $slop\nPosition: <b>$POSITION</b>\n($start_x*$AVAIL_X/$COLUMNS+$GAP_X+$MARGIN_X)\n($start_y*$AVAIL_Y/$ROWS+$GAP_Y+$MARGIN_Y) \nSize: $SIZE" -o "Disable notifications:mb-setvar enable_notifications=false ~/.config/deskgrid/deskgrid.conf" -o "Edit config file:geany ~/.config/deskgrid/deskgrid.conf"
2021-05-14 19:35:19 +02:00
fi