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
|