From 925cf71b1992fcea3578768ab2988820d1404dc1 Mon Sep 17 00:00:00 2001 From: Daniel Napora Date: Tue, 4 May 2021 18:34:30 +0200 Subject: [PATCH] - better handle undecorated windows - gap support --- CHANGELOG.md | 8 +++++ README.md | 6 ++++ clicksnap | 84 ++++++++++++++++++++-------------------------------- 3 files changed, 46 insertions(+), 52 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8d4c7e0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +## Changelog + +### 4.05.2021 +- handle undecorated windows +- handle gap + +### 3.05.2021 +- initial "quick and dirty" version diff --git a/README.md b/README.md index f7e40ed..83aa1e2 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,14 @@ clicksnap for Openbox - click on the appropriate area of the window to snap it in a given direction. Works with active and inactive windows. +Configurable gap between windows. *(Far from perfection, but imho already enough good to use)* ## Requirements - wmctrl - xdotool +- xwininfo ## Installation wget https://git.maboxlinux.org/napcok/clicksnap/raw/branch/master/clicksnap @@ -22,9 +24,13 @@ Add this mousebind action to context Frame: + ## Usage clicksnap is binded to Ctrl + Left Mouse Click Click inside window you like to move. There are 9 areas ... see screenshot :) ![clicksnap](clicksnap.png "clicksnap areas") + +## Configuration + diff --git a/clicksnap b/clicksnap index 5bb14e8..5d8459e 100755 --- a/clicksnap +++ b/clicksnap @@ -1,17 +1,32 @@ #!/bin/bash -## clicksnap - click on the appropriate area of the window to snap it in a given direction. -# Works with active and inactive windows -# -# -# -# -## +### 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 +# 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 Undecorated ; then # Undecorated +T="0" +else # Decorated +T="$TITLEBAR_HEIGHT" +fi + eval $(xdotool getwindowgeometry --shell $WINDOW) Win_x="$X" Win_y="$Y" @@ -36,61 +51,26 @@ OFF_Y="${OFFSET#*,}" case $POS_CODE in 00) # top-left - WIDTH=$((AVAIL_X/2)) - HEIGHT=$((AVAIL_Y/2-OFF_Y/2)) - X=$((0+OFF_X)) - Y=$((0+OFF_Y)) - ;; + W=$((AVAIL_X/2-GAP)) H=$((AVAIL_Y/2-T-GAP)) X=$((0+OFF_X+GAP/2)) Y=$((0+OFF_Y+GAP/2));; 10) # top - WIDTH=$((AVAIL_X)) - HEIGHT=$((AVAIL_Y/2-OFF_Y/2)) - X=$((0+OFF_X)) - Y=$((0+OFF_Y)) - ;; + W=$((AVAIL_X-GAP)) H=$((AVAIL_Y/2-T-GAP)) X=$((0+OFF_X+GAP/2)) Y=$((0+OFF_Y+GAP/2));; 20) # top-right - WIDTH=$((AVAIL_X/2)) - HEIGHT=$((AVAIL_Y/2-OFF_Y/2)) - X=$((AVAIL_X/2+OFF_X)) - Y=$((0+OFF_Y)) - ;; + W=$((AVAIL_X/2-GAP)) H=$((AVAIL_Y/2-T-GAP)) X=$((AVAIL_X/2+OFF_X+GAP/2)) Y=$((0+OFF_Y+GAP/2));; 01) # left - WIDTH=$((AVAIL_X/2)) - HEIGHT=$((AVAIL_Y-OFF_Y/2)) - X=$((0+OFF_X)) - Y=$((0+OFF_Y)) - ;; + W=$((AVAIL_X/2-GAP)) H=$((AVAIL_Y-T-GAP)) X=$((0+OFF_X+GAP/2)) Y=$((0+OFF_Y+GAP/2));; 11) # center - WIDTH=$((AVAIL_X/2-OFF_X)) - HEIGHT=$((AVAIL_Y/2-OFF_Y)) - X=$((AVAIL_X/4+OFF_X/2)) - Y=$((AVAIL_Y/4+OFF_Y/2));; + 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 - WIDTH=$((AVAIL_X/2)) - HEIGHT=$((AVAIL_Y-OFF_Y/2)) - X=$((AVAIL_X/2+OFF_X)) - Y=$((0+OFF_Y)) - ;; + W=$((AVAIL_X/2-GAP)) H=$((AVAIL_Y-T-GAP)) X=$((AVAIL_X/2+OFF_X+GAP/2)) Y=$((0+OFF_Y+GAP/2));; 02) # bottom-left - WIDTH=$((AVAIL_X/2)) - HEIGHT=$((AVAIL_Y/2-OFF_Y/2)) - X=$((0+OFF_X)) - Y=$((AVAIL_Y/2+OFF_Y)) - ;; + W=$((AVAIL_X/2-GAP)) H=$((AVAIL_Y/2-T-GAP)) X=$((0+OFF_X+GAP/2)) Y=$((AVAIL_Y/2+OFF_Y+GAP/2));; 12) # bottom - WIDTH=$((AVAIL_X)) - HEIGHT=$((AVAIL_Y/2-OFF_Y/2)) - X=$((0+OFF_X)) - Y=$((AVAIL_Y/2+OFF_Y)) - ;; + W=$((AVAIL_X-GAP)) H=$((AVAIL_Y/2-T-GAP)) X=$((0+OFF_X+GAP/2)) Y=$((AVAIL_Y/2+OFF_Y+GAP/2));; 22) # bottom-right - WIDTH=$((AVAIL_X/2)) - HEIGHT=$((AVAIL_Y/2-OFF_Y/2)) - X=$((AVAIL_X/2+OFF_X)) - Y=$((AVAIL_Y/2+OFF_Y)) - ;; + W=$((AVAIL_X/2-GAP)) H=$((AVAIL_Y/2-T-GAP)) X=$((AVAIL_X/2+OFF_X+GAP/2)) Y=$((AVAIL_Y/2+OFF_Y+GAP/2));; esac -xdotool windowsize $WINDOW $WIDTH $HEIGHT +xdotool windowsize $WINDOW $W $H xdotool windowmove $WINDOW $X $Y if [ $activate_window == "true" ]; then xdotool windowactivate $WINDOW; fi