#!/bin/bash
#
# bspwmrc
# bspwm configuration file
#

## Start a hotkey daemon
pgrep sxhkd -u "$UID" || sxhkd &

## Monitor allocation
# Honestly pretty complex
setmon() {
	desktops_total=10
	desktops_primary=8
	desktops_secondary=$(( desktops_total - desktops_primary ))

	monitor_primary="$(xrandr -q | awk '/primary/{print $1}')"
	monitors_secondary=($(xrandr -q | grep ' connected' | grep -v 'primary' | awk '{print $1}'))
	# Ensure we have enough for every monitor
	if (( desktops_secondary < ${#monitors_secondary[@]} )); then
		echo "Adding more desktops to match connected monitors"
		desktops_secondary=${#monitors_secondary[@]}
		desktops_total=$(( desktops_secondary + desktops_primary ))
	fi
	if (( ${#monitors_secondary[@]} == 0 )); then
		echo "Only one monitor allocated"
		layout=$(seq --separator=" " 1 $desktops_total)
		echo "Setting layout $layout"
		bspc monitor $monitor_primary -d $layout
	else
		echo "${#monitors_secondary[@]} monitors connected"
		deskpermon=$(( desktops_secondary / ${#monitors_secondary[@]} ))
		layout=$(seq --separator=" " 1 $desktops_primary)
		echo "Setting primary layout $layout"
		bspc monitor $monitor_primary -d $layout

		for m in $(seq 0 $(( ${#monitors_secondary[@]} - 1 ))); do
			layout=$(seq --separator=" " \
				$(( 1 + m + desktops_primary )) \
				${#monitors_secondary[@]} \
				"$desktops_total" \
				)
			echo "Setting layout for ${monitors_secondary[$m]} to $layout"
			bspc monitor ${monitors_secondary[$m]} -d $layout
		done
	fi
}
setmon

## Behavior
# Tiling behavior
bspc config split_ratio			0.50
bspc config remove_disabled_monitors	false
bspc config remove_unplugged_monitors	true

# Pointer behavior
bspc config click_to_focus		any
bspc config focus_follows_pointer	true
bspc config pointer_follows_monitor	true
bspc config pointer_modifier		mod1
bspc config pointer_action1		move #LMB
bspc config pointer_action2		resize_corner #RMB

# ewmh behavior
bspc config ignore_ewmh_focus		true # Fuck you, Discord

## Looks
# Padding
bspc config border_width		6
bspc config window_gap			8
bspc config single_monocle		false
bspc config borderless_monocle		false
bspc config gapless_monocle		false
# Colors
case $THEME in
	light)
		bspc config normal_border_color			"#f2e5bc" #Unfocused
		bspc config active_border_color			"#8ec07c" #Focused, but current monitor isn't
		bspc config focused_border_color		"#83a598" #Focused completely
		bspc config presel_feedback_color		"#ebdbb2" #???
		;;
	*)
		bspc config normal_border_color			"#32302f" #Unfocused
		bspc config active_border_color			"#8ec07c" #Focused, but current monitor isn't
		bspc config focused_border_color		"#83a598" #Focused completely
		bspc config presel_feedback_color		"#ebdbb2" #???
		;;
esac

## Rules
bspc rule -r '*'
case $HOSTNAME in
	dsk-ryzen-0*)
		# Big boy gets pseudotiled Firefox
		bspc rule -a Firefox state=pseudo_tiled rectangle=1920x1080+0+0
		;;
	*)
		;;
esac
bspc rule -a Steam desktop=7
bspc rule -a KeePassXC desktop=8
bspc rule -a slack desktop=9
bspc rule -a Riot desktop=9
bspc rule -a Element desktop=9
bspc rule -a discord desktop=9
bspc rule -a spotify desktop=10
bspc rule -a cantata desktop=10
bspc rule -a 'Minecraft 1.7.10' state=fullscreen
bspc rule -a 'NieR:Automata' state=fullscreen
bspc rule -a modloader64-gui state=floating border=off
# Plasma rules
bspc rule -a plasmashell state=floating sticky=on border=off
bspc rule -a krunner state=floating layer=above sticky=on border=off
# Widgets
bspc rule -a Conky state=floating layer=below sticky=on
bspc rule -a pavucontrol-qt state=floating layer=above sticky=on