#! /bin/bash # # monitorset.sh # Copyright (C) 2018 salt # # Distributed under terms of the MIT license. # if ! pgrep bspwm > /dev/null 2>&1; then tsk_log "Not under bspwm" 1 exit 1 fi 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=$(($desktops_total - $desktops_primary)) # Sanity checks if ! [[ "$desktops_total" -ge 1 ]]; then tsk_log "desktops_total cannot be $desktops_total, defaulting to 8" 0 desktops_total=8 fi if ! [[ "$desktops_primary" -ge 1 ]]; then tsk_log "desktops_primary cannot be $desktops_primary, defaulting to 6" 0 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 tsk_log "Configuration would leave some monitors without desktops; adding more" 0 desktops_secondary=${#monitors_secondary[@]} desktops_total=$(($desktops_secondary + $desktops_primary)) deskpermon=1 tsk_log "Remaining desktops set to $desktops_secondary, highest desktop is now $desktops_total" 0 fi # Can we actually reach all of these desktops via keybinds? if [[ $desktops_total -gt 10 ]]; then tsk_log "More than ten desktops were allocated! Not all of these can be reached via keybinds!" 0 if [[ $(($desktops_total - $desktops_secondary)) -gt 0 ]]; then tsk_log "Adjusting primary desktop reservation" 0 desktops_primary=$(($desktops_total - $desktops_secondary)) tsk_log "Set reserved desktops to $desktops_primary" 0 else tsk_log "Cannot resolve this situation without starving the primary monitor of desktops!" 1 tsk_log "This may result in desktops being allocated that cannot be easily accessed!" 1 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) tsk_log "Found one monitor: $monitor_primary, so giving it layout \"$layout\"" bspc monitor $monitor_primary -d $layout else deskpermon=$(($desktops_secondary / ${#monitors_secondary[@]})) layout=$(seq --separator=" " 1 $desktops_primary) tsk_log "Giving primary monitor $monitor_primary layout \"$layout\"" bspc monitor $monitor_primary -d $layout unset layout tsk_log "Attempting to put $desktops_secondary desktops across ${#monitors_secondary[@]} monitors, $deskpermon each" 0 for m in $(seq 0 $((${#monitors_secondary[@]} - 1))); do layout=$(seq --separator=" " $((1 + $m + $desktops_primary)) ${#monitors_secondary[@]} "$desktops_total") tsk_log "Giving monitor $m (${monitors_secondary[$m]}) layout \"$layout\"" bspc monitor ${monitors_secondary[$m]} -d $layout done fi unset monitor_primary unset monitors_secondary unset desktops_total unset desktops_primary unset desktops_secondary