#!/bin/sh

# example dkrc to show some basic command usage and error reporting

# determine where to place the log file
logfile="$HOME/.dkrc.log"
[ -d "$HOME/.local/share/xorg" ] && logfile="$HOME/.local/share/xorg/dkrc.log"
: > "$logfile"


# (re)load sxhkd for keybinds
if hash sxhkd >/dev/null 2>&1; then
	pkill sxhkd
	sxhkd -c "$HOME/.config/dk/sxhkdrc" &
fi

# Apps
conky -c ~/.conky/dknp &
conky -c ~/.conky/dkcover &
picom --config ~/.config/dk/picom.conf &
polybar -r dk &

# adjust border widths based on the DPI of the monitor
px=$(xrandr | grep ' connected' | tail -n1 | grep -o '[0-9]\+x[0-9]\+' | cut -d'x' -f2)
mm=$(xrandr | grep ' connected' | tail -n1 | grep -o '[0-9]\+mm' | tail -n1 | sed 's/mm//')
dpi=$(( (px / mm) * 25 ))

if [ $dpi -ge 140 ]; then
	border_width=5
	border_outer_width=1
elif [ $dpi -ge 120 ]; then
	border_width=3
	border_outer_width=1
else
	border_width=3
	border_outer_width=1
fi

{ # compound command to redirect all output

	# workspace settings
	# ------------------------

	# initialize 10 workspaces (1-10) (default: 1/monitor)
	dkcmd set numws=10

	# default workspace '_' values used when allocating new workspaces
	# can be applied to all existing workspaces when passed 'apply' after ws=_
	dkcmd set ws=_ apply layout=dwindle master=1 stack=3 gap=10 msplit=0.55 ssplit=0.5

	# use grid layout, padding, and gaps on workspace 10
	dkcmd set ws=10 layout=grid pad left=200 right=200 top=100 bottom=100 gap=50

	# change workspace names (default: number == name)
	dkcmd set \
	 	ws=1  name="" \
	 	ws=2  name="" \
	 	ws=3  name="" \
	 	ws=4  name="" \
	 	ws=5  name="" \
	 	ws=6  name="" \
	 	ws=7  name="" \
	 	ws=8  name="" \
	 	ws=9  name="" \
	 	ws=10 name=""

	# enable static workspaces and assign them to monitors (only relevant for multiple monitors)
	# aside -
	#       many that come from other workspace models tried dk and requested this feature
	#       try embracing the default behaviour and allow access to any workspace from any monitor
	#       you might end up liking it :)
	#
	# mon1='DisplayPort-0'
	# mon2='HDMI-A-0'
	# dkcmd set static_ws=true \
	# 	ws=1  mon=$mon1 \
	# 	ws=2  mon=$mon1 \
	# 	ws=3  mon=$mon1 \
	# 	ws=4  mon=$mon1 \
	# 	ws=5  mon=$mon1 \
	# 	ws=6  mon=$mon2 \
	# 	ws=7  mon=$mon2 \
	# 	ws=8  mon=$mon2 \
	# 	ws=9  mon=$mon2 \
	# 	ws=10 mon=$mon2


	# global settings
	# ---------------------

	# focus windows when receiving activation and enable focus-follows-mouse
	dkcmd set focus_open=true focus_urgent=true focus_mouse=true

	# place clients at the tail and ignore size hints on tiled windows
	dkcmd set tile_tohead=0 tile_hints=false

	# minimum width/height for resizing, and minimum allowed on-screen when moving
	dkcmd set win_minwh=50 win_minxy=10

	# disable gaps and borders in single window layouts
	dkcmd set smart_gap=true smart_border=true

	# define mouse mod and move/resize buttons
	dkcmd set mouse mod=mod4 move=button1 resize=button3


	# borders
	# ---------

	# traditional
	# set border width and colour for each window state
	# dkcmd set border width=$border_width colour focus='#6699cc' unfocus='#000000' urgent='#ee5555'

	# alternative
	# enable split borders and colours, width is overall width, outer_width consumes some of width.
	# outer_width must be less than width, outer_width of 0 will be single borders
	dkcmd set border width=$border_width outer_width=$border_outer_width \
		colour \
		focus='#505050' \
		unfocus='#202020' \
		urgent='#ee5555' \
		outer_focus='#505050' \
		outer_unfocus='#222222' \
		outer_urgent='#222222'


	# window rules
	# --------------

	# rule class, instance, and title regexes (*ALWAYS* CASE INSENSITIVE)

	# open window(s) on a specific workspace (assigned monitor)
	dkcmd rule class="^firefox$" ws=1
	dkcmd rule class="^alcritty$" ws=2
	dkcmd rule class="^ncmpcpp$" ws=4
	dkcmd rule class="^easytag$" ws=9
	dkcmd rule class="^thunar$" ws=5
	dkcmd rule class="^nano$" ws=7

	# open window(s) on a monitor by number or name (active workspace on monitor)
	dkcmd rule class="^chromium$" mon="HDMI-A-0"

	# open window(s) and use a callback function (user defined in config.h)
	# we also ignore=true to stop the window from being resized on it's own from events
	# eg. mpv --x11-name=albumart /path/to/media
	dkcmd rule class="^mpv$" instance="^albumart$" float=true ignore=true callback=albumart bw=0

	# open window(s) in a floating state
	dkcmd rule class="^(pavucontrol|transmission-gtk|steam|lxappearance)$" float=true

	# open window(s) with a specific geometry and coordinates (floating only!)
	dkcmd rule class="^google-chrome$" title="^open files$" float=true w=1280 h=720

	# open window(s) with sticky and floating enabled to view on all workspaces.
	dkcmd rule class="^stickyterm$" stick=true float=true w=1280 h=720

	# focus window and workspace on opening
	dkcmd rule class="^firefox$" ws=1 focus=true
	dkcmd rule class="^alacritty$" ws=2 focus=true
	dkcmd rule class="^Deluge$" ws=3 focus=true
	dkcmd rule class="^ncmpcpp$" ws=4 focus=true
	dkcmd rule class="^thunar$" ws=5 focus=true
	dkcmd rule class="^nano$" ws=7 focus=true
	dkcmd rule class="^easytag$" ws=9 focus=true

	# update or remove an existing rule with the same match patterns
	dkcmd rule class="^firefox$" mon="HDMI-A-0"
	dkcmd rule remove class="^firefox$"

	# apply current rule set to all existing windows (useful for WM reload/restart)
	dkcmd rule apply '*'

	# delete all rules
	# dkcmd rule remove '*'

} >> "$logfile" 2>&1 # append responses

# inform of any errors in a notification
if grep -q 'error:' "$logfile"; then
	hash notify-send && notify-send -t 0 -u critical "dkrc has errors" \
		"$(awk '/error:/ {sub(/^error: /, ""); gsub(/</, "\<"); print}' "$logfile")"
	exit 1
fi

exit 0
