mirror of
https://github.com/ItsDrike/dotfiles.git
synced 2025-04-18 09:12:27 +00:00
Add a script for swapping desktops across monitors on BSPWM
This commit is contained in:
parent
e80decb847
commit
a292d3e460
1 changed files with 53 additions and 0 deletions
53
home/.local/bin/scripts/gui/bspwm/swapdesktop
Executable file
53
home/.local/bin/scripts/gui/bspwm/swapdesktop
Executable file
|
@ -0,0 +1,53 @@
|
|||
#!/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
|
Loading…
Add table
Reference in a new issue