102 lines
		
	
	
		
			4 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			4 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable file
		
	
	
	
	
#!/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
 |