49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
# Script: bspc-swap
 | 
						|
# Author: Henrik Lissner
 | 
						|
# Usage:
 | 
						|
#   bspc-swap [-m] (west|south|north|east)
 | 
						|
#   bspc-swap south
 | 
						|
#   bspc-swap -m west
 | 
						|
#
 | 
						|
# Swaps current window with the window in a direction. If -m is set, move window
 | 
						|
# to the next monitor in that direction.
 | 
						|
#
 | 
						|
# The behavior of the base 'bspc node -s' is odd when crossing screens. It will
 | 
						|
# swaps with the last selected window on that screen, rather than the window on
 | 
						|
# the connecting edge, which is unintuitive.
 | 
						|
 | 
						|
set -e
 | 
						|
 | 
						|
leap=
 | 
						|
if [[ $1 == -m ]]; then
 | 
						|
    leap=1
 | 
						|
    dir=$2
 | 
						|
else
 | 
						|
    dir=$1
 | 
						|
fi
 | 
						|
 | 
						|
case $dir in west|south|north|east) ;;
 | 
						|
    *) >&2 echo "Not a valid direction: $dir"
 | 
						|
        exit 1
 | 
						|
esac
 | 
						|
 | 
						|
if [[ -n $leap ]]; then
 | 
						|
    # move window to monitor in direction
 | 
						|
    old_id=$(bspc query -N -n focused)
 | 
						|
    if [[ $(bspc query -M -m "$dir") ]]; then
 | 
						|
        bspc node -m "$dir"
 | 
						|
        bspc node -f "$old_id"
 | 
						|
    fi
 | 
						|
else
 | 
						|
    # move window in direction
 | 
						|
    old_id=$(bspc query -N -n focused)
 | 
						|
    if bspc node -s "$dir.local"; then
 | 
						|
        bspc node -f "$old_id"
 | 
						|
    elif [[ -n $(bspc query -M -m "$dir") ]]; then
 | 
						|
        bspc node -m "$dir"
 | 
						|
        bspc node -f "$old_id"
 | 
						|
    fi
 | 
						|
fi
 |