#              __      __          __
#             /\ \    /\ \        /\ \
#  ____  __  _\ \ \___\ \ \/'\    \_\ \
# /',__\/\ \/'\\ \  _ `\ \ , <    /'_` \
#/\__, `\/>  </ \ \ \ \ \ \ \\`\ /\ \L\ \
#\/\____//\_/\_\ \ \_\ \_\ \_\ \_\ \___,_\
# \/___/ \//\/_/  \/_/\/_/\/_/\/_/\/__,_ /
#

#---------------------------------------------------------------
#
# WM independent hotkeys
#

# Help
super + F1
  ~/.config/sxhkd/show_help.sh -m -3

# Application menu
super + a
	~/.config/polybar/scripts/menu.sh

# Shutdown menu
ctrl + alt + Delete
	~/.config/polybar/scripts/sysmenu.sh

# lockscreen
super + Escape
	betterlockscreen -l

# Program launcher
super + @space
	rofi -show drun

# Run launcher (commands)
super + r
	rofi -show run

# Task switcher
alt + Tab
	rofi -show window

# Turn off compositor
super + shift + p
	toggleprogram "picom" "--experimental-backends"

#picom-trans -c -10
#picom-trans -c +10

# Launch eww
#super + ctrl + a
#	~/.config/eww/launch_widgets.sh

# Terminal emulator
super + Return
	$TERMINAL

# Browser
super + w
	$BROWSER

# Show clipmenu
alt + x
    rofi -modi "clipboard:greenclip print" -show clipboard -run-command '{cmd}' \
        -location 1 \
        -m -3 \
        -no-show-icons \
        -theme-str '* \{ font: 10px; \}' \
        -theme-str 'listview \{ spacing: 0; \}' \
        -theme-str 'window \{ width: 20em; \}'

# Screenshots tool (selection)
ctrl + Print
	flameshot gui -p ~/pictures/screenshots

# Screenshots tool (screen)
shift + Print
	flameshot full -p ~/pictures/screenshots

# make sxhkd reload its configuration files:
super + ctrl + x
	pkill -USR1 -x sxhkd; dunstify "Sxhkd configuration reloaded"

#---------------------------------------------------------------
#
# bspwm hotkeys
#

# Quit/restart bspwm
super + alt + shift + {q,r}
	bspc {quit,wm -r}

# Close and kill
super + d
	bspc node -c

# Alternate between the tiled and monocle layout
super + m
	bspc desktop -l next
super + z
	bspc desktop -l next

# Send the newest marked node to the newest preselected node
super + y
	bspc node newest.marked.local -n newest.!automatic.local

# Swap the current node and the biggest window
super + g
	bspc node -s biggest.window


#---------------------------------------------------------------
#
# state/flags
#

# Set the window state
#super + {t,shift + t,s,f}
#	bspc node -t {tiled,pseudo_tiled,floating,fullscreen}

# Floating into monocle layout
super + shift + m
	bspc node -t pseudo_tiled; bspc node -t floating && wtp 10 40 1342 716 "$(pfw)"

# Set the window state
super + {t,shift + t,s}
	bspc node -t {tiled,pseudo_tiled,floating}; \
	xdo raise -N Plank; \
	xdo raise -N '*:*:Picture in picture'; \
  xdo raise -N "Picture-in-Picture"

# Toggle fullscreen
super + {f}
	bspc node -t \~fullscreen

# Toggle sticky
#super + q
#  bspc node -g sticky=on

# Set the node flags
super + ctrl + {m,x,y,z}
	bspc node -g {marked,locked,sticky,private}

# Move layers of windows above/below each other (script)
super + {equal,minus}
    layer.sh {+,-}


#---------------------------------------------------------------
#
# Focus/Swap
#

# Focus the node in the given direction
super + {_,shift + }{h,j,k,l}
	bspc node -{f,s} {west,south,north,east}

# Focus the node for the given path jump
#super + {p,b,comma,period}
#	bspc node -f @{parent,brother,first,second}

# Focus the next/previous window in the current desktop
super + {_,shift + }c
	bspc node -f {next,prev}.local.!hidden.window

# Focus the next/previous desktop in the current monitor
super + bracket{left,right}
	bspc desktop -f {prev,next}.local

# Focus the last node/desktop
super + {grave,Tab}
	bspc {node,desktop} -f last

# Focus the older or newer node in the focus history
#super + {o,i}
#	bspc wm -h off; \
#	bspc node {older,newer} -f; \
#	bspc wm -h on

# Focus or send to the given desktop
super + {_,shift + }{1-9,0}
	bspc {desktop -f,node -d} '^{1-9,10}'

# Hide window
super + comma
    bspc node -g hidden

# Unhide window (script)
super + period
    ${HOME}/.config/bspwm/bspcmd unhide


#---------------------------------------------------------------
#
# Preselect
#

# Preselect the direction
super + ctrl + {h,j,k,l}
	bspc node -p {west,south,north,east}

# Preselect the ratio
super + ctrl + {1-9}
	bspc node -o 0.{1-9}

# Cancel the preselection for the focused node
super + ctrl + space
	bspc node -p cancel

# Cancel the preselection for the focused desktop
super + ctrl + shift + space
	bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel

# Close all receptacle
super + shift + i
   for win in `bspc query -N -n .leaf.\!window`; do bspc node $win -k ; done;

# Insert receptacle
super + i; {h,j,k,l}
   bspc node --presel-dir {west,south,north,east} -i

# Move to rectacle
super + ctrl + i
   bspreceptacle

# Balance nodes
super + alt + i
   bspc node @/ -B

#---------------------------------------------------------------
#
# Move/resize
#

# Move a floating window or swap with any other adjacent tiled/pseudo_tiled window
ctrl + alt + {h,j,k,l}
    { dir=west  dx=-20 dy=0 \
    , dir=south dx=0   dy=20 \
    , dir=north dx=0   dy=-20 \
    , dir=east  dx=20  dy=0 \
    }; \
    bspc node --move "$dx" "$dy" || bspc node --swap $dir

# Move a tiled window to any direction
super + shift + {h,j,k,l}
	/path/to/bspwm_smart_move {west,south,north,east}

# Rotate windows to different nodes
super + ctrl + r
  bspc node @parent -R 90

# Resize tiled/floating windows (script)
shift + alt + {h,j,k,l}
	bspwm_resize.sh {west,south,north,east}

# Resize window into predefined pseudo_tiled window
super + shift + s
	bspc node -t pseudo_tiled; bspc node -t floating && wtp 340 40 680 700 "$(pfw)"

# Spawn next window/program into predefined floating window
ctrl + alt + 1
	bspc rule -a '*' -o state=floating rectangle=680x700+340+40

# Spawn next window/program into predefined smaller Heads-Up-Display like floating window
ctrl + alt + 2
	bspc rule -a '*' -o state=floating rectangle=320x140+1030+32



#---------------------------------------------------------------
#
#	Multimedia
#
# Multimedia control
{XF86AudioStop,XF86AudioPlay,XF86AudioPrev,XF86AudioNext}
	playerctl {stop,play-pause,previous,next}

# Use arrow keys as multimedia keys
alt + shift + {Left,Up,Right}
	playerctl {previous,play-pause,next}

# Brightness control
XF86MonBrightness{Up,Down}
	brightnessctl s 5%{+,-}

# Use arrow keys as brightness keys
alt + {Up,Down}
	brightnessctl s 5%{+,-}

# Volume control
XF86Audio{Raise,Lower}Volume
	pulsemixer --change-volume {+,-}10

# Use arrow keys as volume keys
alt + {Right,Left}
	pulsemixer --change-volume {+,-}10


#---------------------------------------------------------------
#
# Programs
#

# Scratchpad
super + semicolon
	~/.local/bin/scripts/scratchpad

super + x
	~/.local/bin/scripts/scratchpad

# Heads-Up-Display scratchpad terminal
super + e
	~/.local/bin/scripts/Heads-Up-Display

# File manager nnn
super + n
	$TERMINAL -e nnn

# File manager pcmanfm (GUI)
super + shift + f
	pcmanfm

# Bitwarden-rofi
super + shift + b
  rofi-rbw

# Thunderbird mail
#super + shift + m
#    thunderbird

# Discord
super + shift + d
    discord

# Spotify
super + shift + y
	spotify

# Book reader (zathura)
super + shift + z
	zathura

# Dictionary
super + ctrl + w
	goldendict

# Thesaurus
super + shift + w
	artha


