mirror of
				https://github.com/ItsDrike/dotfiles.git
				synced 2025-11-04 09:16:36 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			53 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/bin/sh
 | 
						|
#
 | 
						|
# This is a simple way of switching between multiple BSPWM desktops, even if they're
 | 
						|
# present on a different monitor. Instead of the default BSPWM behavior where when
 | 
						|
# we switch to a desktop that belongs to another monitor, it brings it into focus 
 | 
						|
# on that monitor, this script will instead move that desktop on the focused monitor,
 | 
						|
# and bring it into focus here.
 | 
						|
#
 | 
						|
# This is similar to how different window managers with unified workspaces/desktops
 | 
						|
# across all monitors work (such as qtile or xmonad).
 | 
						|
 | 
						|
SELECTED_DESKTOP="$(bspc query -D -d "$1")"
 | 
						|
SELECTED_MONITOR="$(bspc query -M -d "$1")"  # Monitor the selected workspace is on
 | 
						|
FOCUSED_DESKTOP="$(bspc query -D -d focused)"
 | 
						|
FOCUSED_MONITOR="$(bspc query -M -d focused)"
 | 
						|
 | 
						|
if [ "$SELECTED_MONITOR" == "$FOCUSED_MONITOR" ]; then
 | 
						|
  # If the desktop we're switching to lives on the same monitor as the desktop 
 | 
						|
  # we have focused, simply switch to that desktop without worrying about other
 | 
						|
  # monitor(s).
 | 
						|
  bspc desktop "$SELECTED_DESKTOP" -f
 | 
						|
else
 | 
						|
  # Otherwise, if the desktops are on different monitors, we need some more logic.
 | 
						|
  # In this case, we'll want to move this selected desktop onto the focused monitor
 | 
						|
  # so that we can then bring the desktop into focus on this focused monitor.
 | 
						|
 | 
						|
  # Since we will be moving desktops around, we should store the currently active
 | 
						|
  # one on the monitor that owns the selected desktop, so that after the moving is
 | 
						|
  # done, we can make sure the same desktop stays active on that other monitor.
 | 
						|
  ACTIVE_OTHER="$(bspc query -D -m "$SELECTED_MONITOR" -d .active)"
 | 
						|
 | 
						|
  # In case the active desktop on the other monitor is the desktop we will be moving
 | 
						|
  # away into this monitor, we will want to focus the current desktop on the other
 | 
						|
  # monitor instead. Essentially, we simply swap them in this case.
 | 
						|
  [ "$ACTIVE_OTHER" == "$SELECTED_DESKTOP" ] && ACTIVE_OTHER="$CURRENT_DESKTOP"
 | 
						|
 | 
						|
  # Move currently focused desktop into the monitor where the other desktop is.
 | 
						|
  # This is necessary, because BSPWM require each monitor to have at least 1 desktop,
 | 
						|
  # so since we're moving a desktop away, we should first move one in, to avoid failures.
 | 
						|
  # It also allows us to later bring the current desktop into focus on the other monitor.
 | 
						|
  bspc desktop "$CURRENT_DESKTOP" --to-monitor "$SELECTED_MONITOR"
 | 
						|
 | 
						|
  # Now we can move the selected desktop from the other monitor onto this one.
 | 
						|
  bspc desktop "$SELECTED_DESKTOP" --to-monitor "$CURRENT_MONITOR"
 | 
						|
 | 
						|
  # Ensure the previoulsy active desktop on the other monitor is active by bringing it
 | 
						|
  # into focus now. If this was the desktop we moved, this will instead be the desktop
 | 
						|
  # whcih we had focused originally.
 | 
						|
  bspc desktop "$ACTIVE_OTHER" -f
 | 
						|
 | 
						|
  # Bring the selected desktop (that's now on this monitor) into focus here.
 | 
						|
  bspc desktop "$SELECTED_DESKTOP" -f
 | 
						|
fi
 |