48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| 
 | |
| # Script: bspc-focus
 | |
| # Author: Henrik Lissner
 | |
| # Usage:
 | |
| #   bspc-focus [-m] (west|south|north|east)
 | |
| #   bspc-focus south
 | |
| #   bspc-focus -m west
 | |
| #
 | |
| # Focus the next window in direction. If -m is supplied, jump to the next
 | |
| # monitor in that direction.
 | |
| #
 | |
| # The behavior of the base 'bspc node -f' is odd when crossing screens. It will
 | |
| # focus 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; shift
 | |
| fi
 | |
| dir=$1
 | |
| opposite=
 | |
| 
 | |
| case $dir in
 | |
|   west)  opposite=east  ;;
 | |
|   east)  opposite=west  ;;
 | |
|   north) opposite=north ;;
 | |
|   south) opposite=south ;;
 | |
|   *) >&2 echo "Not a valid direction: $dir"
 | |
|      exit 1
 | |
| esac
 | |
| 
 | |
| if [[ -n $leap ]]; then
 | |
|   # jump to monitor in direction
 | |
|   bspc monitor -f "$dir"
 | |
| else
 | |
|   # jump to window in direction (unless at edge of last monitor)
 | |
|   if ! bspc node -f "$dir.local"; then
 | |
|     if [[ $(bspc query -M -m "$dir") ]]; then
 | |
|       bspc monitor -f "$dir"
 | |
|       # Ensure we start at the edge of the window we arrived from
 | |
|       while bspc node -f "$opposite.local"; do :; done
 | |
|     fi
 | |
|   fi
 | |
| fi
 |