#!/bin/sh
# env
# Written in 2019-2020,2022-2024 by Lucas
# CC0 1.0 Universal/Public domain - No rights reserved
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <http://creativecommons.org/publicdomain/zero/1.0/>.

if [ -f ~/.config/herbstluftwm/theme ]; then
	. ~/.config/herbstluftwm/theme
fi

hc() { herbstclient "$@"; }

hc emit_hook reload

# remove all existing keybindings
hc keyunbind --all

# keybindings
Mod=Mod4

hc keybind $Mod-Shift-q	quit
hc keybind $Mod-Shift-r	reload
hc keybind $Mod-Shift-c	close

# programs
hc keybind $Mod-g		spawn sh -c 'xclip -o | plumb'
hc keybind $Mod-Control-g	spawn sh -c 'xclip -sel clip -o | plumb'
hc keybind $Mod-Shift-g		spawn sh -c 'xclip -o | plumb -T'
hc keybind $Mod-Control-Shift-g	spawn sh -c 'xclip -sel clip -o | plumb -T'
hc keybind $Mod-p		spawn dmenu_run \
    -p run -fn "$hlwm_face" \
    -nb "$hlwm_background" -nf "$hlwm_foreground" \
    -sb "$hlwm_background" -sf "$hlwm_color14"
hc keybind $Mod-Shift-Return	spawn xterm
hc keybind $Mod-Control-Return	spawn xterm -geometry 80x40
hc keybind $Mod-Control-l	spawn xlock
hc keybind $Mod-Shift-z		spawn sh -c 'xlock & doas /usr/sbin/zzz'
hc keybind $Mod-Control-z	spawn sh -c 'xlock & doas /usr/sbin/ZZZ'
hc keybind $Mod-Print		spawn screenshot
hc keybind $Mod-Shift-Print	spawn screenshot -s

# basic movement
# focusing clients
hc keybind $Mod-Left	focus left
hc keybind $Mod-Down	focus down
hc keybind $Mod-Up	focus up
hc keybind $Mod-Right	focus right

# moving clients
hc keybind $Mod-Shift-Left	shift left
hc keybind $Mod-Shift-Down	shift down
hc keybind $Mod-Shift-Up	shift up
hc keybind $Mod-Shift-Right	shift right

# splitting frames
# create an empty frame at the specified direction
hc keybind $Mod-u	split bottom 0.5
hc keybind $Mod-o	split right 0.5
# let the current frame explode into subframes
hc keybind $Mod-Control-space	split explode

# resizing frames
resizestep=0.05
hc keybind $Mod-Control-Left	resize left +$resizestep
hc keybind $Mod-Control-Down	resize down +$resizestep
hc keybind $Mod-Control-Up	resize up +$resizestep
hc keybind $Mod-Control-Right	resize right +$resizestep

# tags
hc try rename default 1
for tag in 1:1 2:2 3:3 4:4 5:5 6:6 7:7 8:8 9:9 0:0; do
	name=${tag%:*}
	key=${tag#*:}
	hc try add $name
	hc keybind $Mod-$key use $name
	hc keybind $Mod-Shift-$key move $name
done
hc load 2 "(split horizontal:0.5:1 (clients max:0) (clients max:0))"
hc load 3 "(clients max:0)"

# cycle through tags
hc keybind $Mod-period	use_index +1 --skip-visible
hc keybind $Mod-comma	use_index -1 --skip-visible

# layouting
hc keybind $Mod-v	set_layout vertical
hc keybind $Mod-h	set_layout horizontal
hc keybind $Mod-m	set_layout max
hc keybind $Mod-r	remove
hc keybind $Mod-s	floating toggle
hc keybind $Mod-f	fullscreen toggle
hc keybind $Mod-Shift-s	pseudotile toggle
# The following cycles through the available layouts within a frame, but skips
# layouts, if the layout change wouldn't affect the actual window positions.
# I.e. if there are two windows within a frame, the grid layout is skipped.
hc keybind $Mod-space                                                           \
            or , and . compare tags.focus.curframe_wcount = 2                   \
                     . cycle_layout +1 vertical horizontal max vertical grid    \
               , cycle_layout +1

# mouse
hc mouseunbind --all
hc mousebind $Mod-Button1	move
hc mousebind $Mod-Button2	zoom
hc mousebind $Mod-Button3	resize

# focus
hc keybind $Mod-BackSpace	cycle_monitor
hc keybind $Mod-Tab		cycle_all +1
hc keybind $Mod-j		cycle +1
hc keybind $Mod-Shift-Tab	cycle_all -1
hc keybind $Mod-k		cycle -1
hc keybind $Mod-c		cycle
hc keybind $Mod-i		jumpto urgent

# theme
hc attr theme.tiling.reset	1
hc attr theme.floating.reset	1
hc attr theme.border_width	2
hc attr theme.inner_width	0
hc attr theme.outer_width	0
hc attr theme.background_color	"$hlwm_background"
hc attr theme.active.color	"$hlwm_color11"
hc attr theme.normal.color	"$hlwm_color8"
hc attr theme.urgent.color	"$hlwm_color9"

hc set frame_gap			0
hc set frame_padding			4
hc set window_gap			0
hc set frame_bg_transparent		1
hc set frame_transparent_width		0
hc set frame_border_width		0
hc set mouse_recenter_gap		0
hc set always_show_frame		0
hc set smart_frame_surroundings		0
hc set smart_window_surroundings	0
hc set pseudotile_center_threshold	0

# rules
hc unrule -F
#hc rule class=XTerm tag=3 # move all xterms to tag 3
hc rule focus=on # normally focus new clients
#hc rule focus=off # normally do not focus new clients
# give focus to most common terminals
#hc rule class~"(.*[Rr]xvt.*|.*[Tt]erm|Konsole)" focus=on
hc rule windowtype~"_NET_WM_WINDOW_TYPE_(DIALOG|UTILITY|SPLASH)" pseudotile=on
hc rule windowtype="_NET_WM_WINDOW_TYPE_DIALOG" focus=on
hc rule windowtype~"_NET_WM_WINDOW_TYPE_(NOTIFICATION|DOCK|DESKTOP)" manage=off

hc rule class=XTerm pseudotile=on
hc rule class~"[Ff]irefox.*" pseudotile=on tag=3
hc rule class~"[Ff]irefox.*" instance=Navigator fullscreen=on tag=3
hc rule class=tor-browser pseudotile=on tag=3
hc rule class=tor-browser instance=Navigator fullscreen=on tag=3
hc rule class=SshAskpass pseudotile=on
hc rule class=Snes9x-gtk pseudotile=on
hc rule class=Gajim pseudotile=on tag=7

hc set tree_style "╾│ ├└╼─┐"
#hc set tree_style "-| |'>-."

# unlock, just to be sure
hc unlock

hc detect_monitors

hc list_monitors | while IFS= read -r line; do
	m=${line%%:*}
	sh ~/.config/herbstluftwm/herbstpanel.sh "$m" &
done
