102 lines
4 KiB
Plaintext
102 lines
4 KiB
Plaintext
|
#!/usr/bin/env cached-nix-shell
|
||
|
#! nix-shell -i zsh -p jshon wmutils-core
|
||
|
|
||
|
# Script: bspc-subtract-presel
|
||
|
# Author: Henrik Lissner (w/ credit to @Chrysostomus)
|
||
|
# Usage:
|
||
|
# bspc-resize-to-presel
|
||
|
#
|
||
|
# (Adapted from Chrysostomus/bspwm-scripts/bin/resizetopresel.sh)
|
||
|
#
|
||
|
# This script resizes the current window by "subtracting" the bspwm preselection
|
||
|
# on the current node. In English, that means this will reduce the window's
|
||
|
# width by 20%:
|
||
|
#
|
||
|
# bspc node -p east -o 0.2 && bspc-subtract-presel
|
||
|
#
|
||
|
# NOTE: We use zsh for this because bash chokes on float arithmetic.
|
||
|
|
||
|
# Check if the brother node is a receptacle
|
||
|
if [[ $(bspc query -T -n @brother/ | jshon -e client) = null ]]; then
|
||
|
# Yep, it's a receptacle. Get the real dimensions
|
||
|
eval $(grep "window_gap" ~/.config/bspwm/rc.d/theme | tr -cd [0-9])
|
||
|
# Get orientation
|
||
|
wattr xywh $(pfw) | read focused_x focused_y focused_width focused_height
|
||
|
receptacle_y=$(bspc query -T -n @brother/ | jshon -e rectangle -e y)
|
||
|
if [[ "$focused_y" -eq "$receptacle_y" ]]; then
|
||
|
receptacle_width=$(bspc query -T -n @brother/ | jshon -e rectangle -e width)
|
||
|
receptacle_x=$(bspc query -T -n @brother/ | jshon -e rectangle -e x)
|
||
|
# receptacle and window have the same height, so they are side by side
|
||
|
if [[ receptacle_x -gt focused_x ]]; then
|
||
|
echo "receptacle is right of the window"
|
||
|
# get the true window dimension
|
||
|
true_dim=$(( receptacle_width + gap ))
|
||
|
# kill the repectacle
|
||
|
for i in $(bspc query -N -n .leaf.!window.local); do bspc node $i -k; done
|
||
|
# resize the window
|
||
|
bspc node @east -r -$true_dim || bspc node @west -r +$true_dim
|
||
|
else
|
||
|
echo "receptacle is left of the window"
|
||
|
# get the true window dimension
|
||
|
true_dim=$(( receptacle_width + gap ))
|
||
|
# kill the repectacle
|
||
|
for i in $(bspc query -N -n .leaf.!window.local); do bspc node $i -k; done
|
||
|
# resize the window
|
||
|
bspc node @west -r +$true_dim || bspc node @east -r -$true_dim
|
||
|
fi
|
||
|
else
|
||
|
receptacle_height=$(bspc query -T -n @brother/ | jshon -e rectangle -e height)
|
||
|
# width is necessarily equal if height is not, because the nodes are
|
||
|
# brothers Window are on the top of each other
|
||
|
if [[ receptacle_y -gt focused_y ]]; then
|
||
|
echo "receptacle is below the window"
|
||
|
# get the true window dimension
|
||
|
true_dim=$(( receptacle_height + gap))
|
||
|
# kill the repectacle
|
||
|
for i in $(bspc query -N -n .leaf.!window.local); do bspc node $i -k; done
|
||
|
# resize the window
|
||
|
bspc node @south -r -$true_dim || bspc node @north -r +$true_dim
|
||
|
else
|
||
|
echo "receptacle is above the window"
|
||
|
# get the true window dimension
|
||
|
true_dim=$(( receptacle_height + gap))
|
||
|
# kill the repectacle
|
||
|
for i in $(bspc query -N -n .leaf.!window.local); do bspc node $i -k; done
|
||
|
# resize the window
|
||
|
bspc node @north -r +$true_dim || bspc node @south -r -$true_dim
|
||
|
fi
|
||
|
fi
|
||
|
echo $true_dim
|
||
|
exit 0
|
||
|
fi
|
||
|
|
||
|
# If the focused window is not preselected, do nothing
|
||
|
[[ "$(bspc query -T -n focused | jshon -e presel)" == null ]] && exit 0
|
||
|
|
||
|
dir=$(bspc query -T -n focused | jshon -e presel -e splitDir | tr -d \")
|
||
|
ratio=$(bspc query -T -n focused | jshon -e presel -e splitRatio)
|
||
|
case "$dir" in
|
||
|
west)
|
||
|
cur=$(bspc query -T -n focused | jshon -e rectangle -e width)
|
||
|
bspc node @west -r +$((${cur}*${ratio})) || \
|
||
|
bspc node @east -r -$((${cur}*${ratio}))
|
||
|
;;
|
||
|
east)
|
||
|
cur=$(bspc query -T -n focused | jshon -e rectangle -e width)
|
||
|
bspc node @east -r -$((${cur}*(1.0-${ratio}))) || \
|
||
|
bspc node @west -r +$((${cur}*${ratio}))
|
||
|
;;
|
||
|
|
||
|
north)
|
||
|
cur=$(bspc query -T -n focused | jshon -e rectangle -e height)
|
||
|
bspc node @north -r +$((${cur}*${ratio})) || \
|
||
|
bspc node @south -r -$((${cur}*${ratio}))
|
||
|
;;
|
||
|
south)
|
||
|
cur=$(bspc query -T -n focused | jshon -e rectangle -e height)
|
||
|
bspc node @south -r -$(( ${cur} * (1.0 - ${ratio}) )) || \
|
||
|
bspc node @north -r +$(( ${cur} * ${ratio} ))
|
||
|
esac
|
||
|
|
||
|
bspc node -p cancel
|