dotfiles/home/.local/bin/scripts/gui/bspwm/swapdesktop
2022-09-14 12:20:40 +02:00

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="$FOCUSED_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 "$FOCUSED_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 "$FOCUSED_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