home/.config/bspwm/monitorset.sh

79 lines
3.2 KiB
Bash
Executable File

#! /bin/bash
#
# monitorset.sh
# Copyright (C) 2018 salt <salt@dsk-cstm-0>
#
# Distributed under terms of the MIT license.
#
printf "[INFO] Setting up monitors\n"
# Get the primary first, to ensure it's the first element
monitor_primary=$(xrandr -q | awk '/primary/{print $1}')
monitors_secondary=($(xrandr -q | grep ' connected' | grep -v 'primary' | awk '{print $1}'))
desktops_total=${BSPWM_DESKTOPS_TOTAL:-8}
desktops_primary=${BSPWM_DESKTOPS_PRIMARY:-6}
desktops_secondary=$(expr $desktops_total - $desktops_primary)
# Sanity checks
if ! [[ "$desktops_total" -ge 1 ]]; then
printf " [ERROR] desktops_total cannot be $desktops_total, defaulting to 8\n" 1>&2
desktops_total=8
fi
if ! [[ "$desktops_primary" -ge 1 ]]; then
printf " [ERROR] desktops_primary cannot be $desktops_primary, defaulting to 6\n" 1>&2
desktops_primary=6
fi
# Do we have enough desktops for all monitors?
# We can correct this without defaulting, so don't error
if [[ $desktops_secondary -lt ${#monitors_secondary[@]} ]]; then
printf " [WARN] Configuration would leave some monitors without desktops!\n" 1>&2
printf " [INFO] Adding more desktops\n"
desktops_secondary=${#monitors_secondary[@]}
desktops_total=$(expr $desktops_secondary + $desktops_primary)
deskpermon=1
printf " [INFO] Remaining desktops set to $desktops_secondary, highest desktop is now $desktops_total\n"
fi
# Can we actually reach all of these desktops via keybinds?
if [[ $desktops_total -gt 10 ]]; then
printf " [WARN] More than ten desktops were allocated! Not all of these can be reached via keybinds!\n" 1>&2
if [[ $(expr $desktops_total - $desktops_secondary) -gt 0 ]]; then
printf " [INFO] Adjusting primary desktop reservation\n"
desktops_primary=$(expr $desktops_total - $desktops_secondary)
printf " [INFO] Set reserved desktops to $desktops_primary\n"
else
printf " [WARN] Cannot resolve this situation without starving the primary monitor of desktops!\n"
printf " [WARN] This may result in desktops being allocated that cannot be easily accessed!\n"
fi
fi
# The code that actually sets the monitors up
# First, do we actually have any secondaries?
if [[ $(echo ${monitors_secondary:-0}) == "0" ]]; then
# We only have one monitor, so give it everything
layout=$(seq --separator=" " 1 $desktops_total)
printf " [INFO] Found one monitor: $monitor_primary, so giving it layout \"$layout\"\n"
bspc monitor $monitor_primary -d $layout
else
deskpermon=$(expr $desktops_secondary / ${#monitors_secondary[@]})
layout=$(seq --separator=" " 1 $desktops_primary)
printf " [INFO] Giving primary monitor $monitor_primary layout \"$layout\"\n"
bspc monitor $monitor_primary -d $layout
unset layout
printf " [INFO] Attempting to put $desktops_secondary desktops across ${#monitors_secondary[@]} monitors, $deskpermon each\n"
for m in $(seq 0 $(expr ${#monitors_secondary[@]} - 1)); do
layout=$(seq --separator=" " $(expr 1 + $m + $desktops_primary) ${#monitors_secondary[@]} $(expr $desktops_total ))
printf " [INFO] Giving monitor $m (${monitors_secondary[$m]}) layout \"$layout\"\n"
bspc monitor ${monitors_secondary[$m]} -d $layout
done
fi
unset monitor_primary
unset monitors_secondary
unset desktops_total
unset desktops_primary
unset desktops_secondary