From 231c94abb1f22bd4e1472662bfa9fdf56ce71c14 Mon Sep 17 00:00:00 2001 From: Daniel Napora Date: Thu, 20 May 2021 14:15:45 +0200 Subject: [PATCH] clicksnap->snapwin, deskmngr upd --- bin/deskmngr | 27 +++++++++- bin/snapwin | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 bin/snapwin diff --git a/bin/deskmngr b/bin/deskmngr index b4a9d87..2d17f9d 100755 --- a/bin/deskmngr +++ b/bin/deskmngr @@ -1,11 +1,24 @@ #!/bin/bash -# Daniel Napora 2021 +# Copyright (C) Daniel Napora 2021 #: deskmngr - save all programs (windows) running on current desktop in session file. #: With windows positions and state (decorated or not) #: Usage: #: -s|save - save session from current desktop #: -r|restore sesionfile desktop_nr - restore session from sessionfile on desktop #: +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + SESSIONDIR="$HOME/.config/deskmngr/" mkdir -p $SESSIONDIR @@ -40,9 +53,19 @@ savesession() { sd -s "geany" "geany -i" "$SESSIONDIR/${filename// /_}.desk" sd -s "cherrytree" "cherrytree --new-window" "$SESSIONDIR/${filename// /_}.desk" sd -s "pcmanfm -d" "pcmanfm -n" "$SESSIONDIR/${filename// /_}.desk" + sd -s "Thunar --daemon" "thunar" "$SESSIONDIR/${filename// /_}.desk" + else + sed -i '/usr/lib/chromium/chromium,chromium --new-window,' "$SESSIONDIR/${filename// /_}.desk" + sed -i '/usr/lib/firefox/firefox,firefox --new-window,' "$SESSIONDIR/${filename// /_}.desk" + sed -i '/usr/bin/python3 /usr/bin/terminator,terminator,' "$SESSIONDIR/${filename// /_}.desk" + sed -i 'geany,geany -i,' "$SESSIONDIR/${filename// /_}.desk" + sed -i 'cherrytree,cherrytree --new-window,' "$SESSIONDIR/${filename// /_}.desk" + sed -i 'pcmanfm -d,pcmanfm -n,' "$SESSIONDIR/${filename// /_}.desk" + sed -i 'Thunar --daemon,thunar,' "$SESSIONDIR/${filename// /_}.desk" fi - + if command -v geany 1>/dev/null; then geany "$SESSIONDIR/${filename// /_}.desk" + fi } } diff --git a/bin/snapwin b/bin/snapwin new file mode 100644 index 0000000..f14d89b --- /dev/null +++ b/bin/snapwin @@ -0,0 +1,145 @@ +#!/bin/bash +### snapwin - click on the appropriate area of the window to snap it in a given direction. +# Works with active and inactive windows. +# Same actions are available for kebindings: topleft, top, topright, left, center, right, +# bottomleft, bottom and bottomright. +# Copyright (C) Daniel Napora 2021 +# https://maboxlinux.org +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +_config() { +CONFIG_DIR="$HOME/.config/deskgrid" +CONFIG_FILE="$CONFIG_DIR/deskgrid.conf" +mkdir -p $CONFIG_DIR +if [ ! -f $CONFIG_FILE ]; then +cat < ${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} + +## OUTER GAP + if [[ "$show_outer_gap" == "true" ]]; then OUT_GAP="$GAP" ; else OUT_GAP="0" ; fi + + 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#*,}" +} + +_getwin() { #get active window (only when invoked by keyboard) + _config + WINDOW=$(xdotool getactivewindow) + HEX_ID=$(printf '0x%x\n' $WINDOW) + #####echo "$HEX_ID" + if xwininfo -id $HEX_ID -wm |grep Undecorated ; then # Undecorated + T="0" + else # Decorated + T="$TITLEBAR_HEIGHT" + fi + #####echo "$T" + +} + +_movewin() { +case $POS_CODE in + 00|topleft) # 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) # 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|topright) # 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) # 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) # 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) # 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|bottomleft) # 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) # 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|bottomright) # 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 +} + +clicksnap() { + _config + ### Clicksnap mouse action start + 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" + _movewin +} + +moveto() { + _getwin + POS_CODE="$1" + _movewin +} + + +case "$1" in + "") clicksnap ;; + topleft|top|topright|left|center|right|bottomleft|bottom|bottomright) moveto "$1" ;; + *) usage ;; +esac