# Reference:
#     https://github.com/koekeishiya/skhd/blob/master/examples/skhdrc
#     https://github.com/koekeishiya/skhd/issues/1

# Applications without hotkeys
.blacklist [
    #"iTerm2"
    "Terminal"
    "MacVim"
    "Parallels Desktop"
    #"qutebrowser"
    #"cool-retro-term"
]

# Match Firefox's incognito shortcut to Chrome's
cmd + shift - n [
    "Firefox" : skhd -k "cmd + shift - p"
    * ~
]

cmd + ctrl - n [
    "Google Chrome" : skhd -k "cmd + shift - n" \
                      && skhd -t "~/Documents/other_stuff/canvas/Konachan.com - 320663 book dampi elaina_(majo_no_tabitabi) flowers gray_eyes gray_hair long_hair majo_no_tabitabi stairs witch.jpg" \
                      && skhd -k "return"
    * ~
]

# Prevent full quit
cmd - q [
    "Google Chrome": play_error_sound
    "Preview": play_error_sound
    * ~
]

cmd + ctrl - y : skhd -k "alt - left"\
              && skhd -t "~~"\
              && skhd -k "alt - right"\
              && skhd -t "~~"

cmd + ctrl - r : skhd -t "AsExpectedOfRust"

cmd + ctrl - a : open -na "Chromium" --args --incognito \
                 --window-size=1250,800 --window-position=200,140

# Rofi menu
#cmd + shift - space : ~/.configs_pointer/skhd/scripts/rofi_macos

#0x35 : skhd -k "0x32"

#cmd - r : skhd -t "step"; skhd -k "0x24"
#ctrl - h : skhd -k "backspace"


#default < escape : skhd -k "0x32"
#default < cmd - escape : skhd -k "cmd - 0x32"
#default < 0x35 : skhd -k "~"

#[ Never Quit ]
#@PassThroughOther
#@Include Google Chrome
#@Include Preview
#
#<M-q> :: play_error_sound

#╔─────────────────────────────────────────────────────────────────────────────╗
#│ Kεybδαrd δvεrr𝓲dεs                                                          |
#╚─────────────────────────────────────────────────────────────────────────────╝
# By letter ====
ctrl - j [
    "Alacritty" ~
    * : skhd -k "left"
]
ctrl - f [
    "Alacritty" ~
    * : skhd -k "right"
]
ctrl - h [
    "Alacritty" ~
    * : skhd -k "backspace"
]
ctrl - d [
    "Alacritty" ~
    "qutebrowser" ~
    * : skhd -k "delete"
]
# Vertically ====
ctrl - p [
    "Alacritty" ~
    * : skhd -k "up"
]
ctrl - n [
    "Alacritty" ~
    * : skhd -k "down"
]
# By word ====
ctrl - b [
    "Alacritty" ~
    * : skhd -k "alt - left"
]
ctrl - w [
    "Alacritty" ~
    * : skhd -k "alt - right"
]
ctrl - u [
    "Alacritty" ~
    "qutebrowser" ~
    * : skhd -k "alt + shift - left"
]
ctrl - r [
    "Alacritty" ~
    * : skhd -k "alt + shift - right"
]
# By line ====
ctrl - a [
    "Alacritty" ~
    * : skhd -k "cmd - left"
]
ctrl - e [
    "Alacritty" ~
    * : skhd -k "cmd - right"
]
ctrl - k [
    "Alacritty" ~
    "qutebrowser" ~
    * : skhd -k "cmd + shift - right"
]
# Other ====
ctrl - 0x21 [ # <C-[>
    "Alacritty" ~
    * : skhd -k "escape"
]
ctrl - y [
    "Alacritty" ~
    * : skhd -k "cmd - c"
]


#╔─────────────────────────────────────────────────────────────────────────────╗
#│ Gεnεrαl cδmmαnd mδdε                                                        |
#╚─────────────────────────────────────────────────────────────────────────────╝
:: general @ : sketchybar -m --bar color=0xFFFF8700 # \
            #ffplay -t '1000' -nodisp -autoexit -loglevel error \
            #~/.config/skhd/stutter-woosh.wav

# Toggle general mode ====
default < cmd - g ; general
general < escape       ; default
general < ctrl - 0x21  : sketchybar -m --bar color=0x44000000; \
                         skhd -k "escape"

# Shrink screenshot and save to desktop ====
general < 0 : skhd -k "ctrl - 0x21"; shrink_screenshot_clipboard 100 # Save clipboard to desktop
general < 9 : skhd -k "ctrl - 0x21"; shrink_screenshot_clipboard 90  # Shrink from clipboard
general < 8 : skhd -k "ctrl - 0x21"; shrink_screenshot_clipboard 80
general < 7 : skhd -k "ctrl - 0x21"; shrink_screenshot_clipboard 70
general < 6 : skhd -k "ctrl - 0x21"; shrink_screenshot_clipboard 60
general < 5 : skhd -k "ctrl - 0x21"; shrink_screenshot_clipboard 50
general < 4 : skhd -k "ctrl - 0x21"; shrink_screenshot_clipboard 40
general < 3 : skhd -k "ctrl - 0x21"; shrink_screenshot_clipboard 30
#general < d : skhd -k "ctrl - 0x21"; shrink_screenshot_desktop    # Lastest screenshot on ~/Desktop

# Vi-like scrolling for browsers ====
general <        g : skhd -k "ctrl - 0x21"; skhd -k "cmd - up";   skhd -k "cmd + ctrl - g"
general < shift- g : skhd -k "ctrl - 0x21"; skhd -k "cmd - down"; skhd -k "cmd + ctrl - g"
general < ctrl - u : skhd -k "ctrl - 0x21"; skhd -k "alt - up";   skhd -k "cmd + ctrl - g"
general < ctrl - d : skhd -k "ctrl - 0x21"; skhd -k "alt - down"; skhd -k "cmd + ctrl - g"
general <        k : skhd -k "ctrl - 0x21"; skhd -k "up";         skhd -k "cmd + ctrl - g"
general <        j : skhd -k "ctrl - 0x21"; skhd -k "down";       skhd -k "cmd + ctrl - g"
general < shift- h : skhd -k "ctrl - 0x21"; skhd -k "cmd - left"; skhd -k "cmd + ctrl - g"
general < shift- l : skhd -k "ctrl - 0x21"; skhd -k "cmd - right";skhd -k "cmd + ctrl - g"
general < shift- j : skhd -k "ctrl - 0x21"; skhd -k "cmd + alt - left"; skhd -k "cmd + ctrl - g"
general < shift- k : skhd -k "ctrl - 0x21"; skhd -k "cmd + alt - right";skhd -k "cmd + ctrl - g"


cmd + ctrl - q : record_audio_line 10  # Audio capture while watching on vlc


# Other convenience tools ====
### Upload clipboard to pastebin
cmd + ctrl - x : pbpaste | ix

### Backup and restore chrome incognito windows
cmd + ctrl - e : chrome_session close \
    ~/.config/skhd/last_incognito_window.chrome \
    && osascript -e \
        'display notification "Chrome window backed up" with title "Skhd"'

cmd + ctrl - r : chrome_session restore \
    ~/.config/skhd/last_incognito_window.chrome


#╔─────────────────────────────────────────────────────────────────────────────╗
#│ Yαbαi ωiηdδω mαηαgεr                                                        |
#╚─────────────────────────────────────────────────────────────────────────────╝
# Keybind methodology:
# In general
#   Spaces use gamer-style `wasd`
#   Windows use vim-style  `hjkl`
#
# <<Default mode>>:
# All default mode bindings are indentically available in yabai mode
# cmd shift {a,d}  : switches to adjacent space
# cmd shift {h,j,k,l} : switches to window in that direction
# cmd {[, ]}       : move window onto left or right stack
# cmd shift {[, ]} : move window onto top or bottom stack
# cmd tab : cycle across stacks clockwise
# cmd `   : cycle within stack
#
#
# <<Yabai mode>>:
# Prefix : cmd e
# Escape : esc, enter, <M-[>
#
# x : close window
#
# = : Balance bsp tree on y axis
#
# === Stacks
#
# === Resize window
# {q,w,e,r} : Resize window on horizontally. qw resize left, er resize right
# lcmd {q,w,e,r} : Resize window on vertically. qw resize top, er resize bottom
# Add shift to the above for a smaller increment
#
# === Spaces
# shift {a,d} : Move window to adjacent space, and switch to that space
# ctrl {a,d} : Reorder space
# n : Create new space on right, move current window and switch to it
# ctrl q : Close space
#
# === Floating
# ctrl [0-9] : Set numpad position of floating window TODO
#
# === Pinning
# m : Swap to pinning mode
# c : From pinning mode, clears pin list
# [0-9] : From pinning mode, pins current window to specified number
# alt [0-9] : From default mode, switch to pinned window
# shift cmd space : From default mode pulls up rofi menu for pinned windows
#
# Oneshots
default < cmd + shift - a : yabai -m space --focus prev
default < cmd + shift - d : yabai -m space --focus next
#default < cmd - h : # Stop accidentally hiding windows
## Switching windows
default < lcmd - h : yabai -m window --focus west
default < lcmd - j : yabai -m window --focus south
default < lcmd - k : yabai -m window --focus north
default < lcmd - l : yabai -m window --focus east

# Moving windows onto stacks <M-{[,]}>
default <         lcmd - 0x21 : ~/.config/yabai/move_to_stack.sh 'west'
default <         lcmd - 0x1E : ~/.config/yabai/move_to_stack.sh 'east'
default < shift + lcmd - 0x21 : ~/.config/yabai/move_to_stack.sh 'north'
default < shift + lcmd - 0x1E : ~/.config/yabai/move_to_stack.sh 'south'

# Cycle within stack with  <M-`>  <M-S-`>
#default < lcmd         - 0x32 : yabai -m window --focus stack.prev\
#                             || yabai -m window --focus stack.last
#default < lcmd + shift - 0x32 : yabai -m window --focus stack.next\
#                             || yabai -m window --focus stack.first
## Cycle between stacks with  <M-Tab>
#default < cmd - 0x30 : yabai -m window --focus \
#    "$(yabai -m query --windows --space | ~/.config/yabai/cycle_stack.js)"


# Pop out window
cmd + ctrl - p : yabai -m window --toggle float && \
                 yabai -m window --grid 40:40:0:2:33:38
# Center window
cmd + ctrl - c : yabai -m window --toggle float && \
                 yabai -m window --grid 80:80:11:2:58:71

# Yabai Mode ========================================================
# Assumes enter and exit sounds are set up
:: yabai @ : sketchybar -m --bar color=0xFFC8CB36; #\
             #ffplay -nodisp -autoexit -t "1000" \
             #~/.config/skhd/slow_air_woosh.wav &>/dev/null

default < lcmd - e ; yabai
yabai < escape     ; default
yabai < return : sketchybar -m --bar color=0x44000000; \
                 skhd -k "escape" #&&\
                 #ffplay -nodisp -autoexit -t "700"\
                 #~/.config/skhd/correct_ping.wav &>/dev/null
yabai < ctrl - k    : sketchybar -m --bar color=0x44000000; skhd -k "escape"
yabai < ctrl - 0x21 : sketchybar -m --bar color=0x44000000; skhd -k "escape"
                 #ffplay -nodisp -autoexit -t "700"\
                 #~/.config/skhd/correct_ping.wav &>/dev/null


#╔─────────────────────────────────────────────────────────────────────╗
#│ Wiηdδωs                                                             |
#╚─────────────────────────────────────────────────────────────────────╝
# Window switching
yabai < lcmd - h : yabai -m window --focus west
yabai < lcmd - j : yabai -m window --focus south
yabai < lcmd - k : yabai -m window --focus north
yabai < lcmd - l : yabai -m window --focus east

# Move windows within a space
# Lcmd: Move   |   Rcmd: Swap
yabai < lcmd + shift - h : yabai -m window --warp west
yabai < lcmd + shift - j : yabai -m window --warp south
yabai < lcmd + shift - k : yabai -m window --warp north
yabai < lcmd + shift - l : yabai -m window --warp east

yabai < rcmd - h : yabai -m window --swap west
yabai < rcmd - j : yabai -m window --swap south
yabai < rcmd - k : yabai -m window --swap north
yabai < rcmd - l : yabai -m window --swap east

# Manipulate bsp
yabai < ctrl - b : yabai -m space --layout bsp; ~/.config/yabai/toggle_outline.bash
yabai < ctrl - f : yabai -m space --layout float
yabai < ctrl - y : yabai -m space --mirror y-axis
yabai < ctrl - x : yabai -m space --mirror x-axis
yabai < ctrl - r : yabai -m space --rotate 270
yabai < ctrl - s : yabai -m window --toggle split
yabai < ctrl - o : ~/.config/yabai/toggle_border.bash
yabai < 0x18 : yabai -m space --balance  # = sign

# Swapping stacks <M-S-[> <M-]>
# --swap moves target window onto current window. We want the opposite
yabai <         cmd - 0x21 : ~/.config/yabai/move_to_stack.sh 'west'
yabai <         cmd - 0x1E : ~/.config/yabai/move_to_stack.sh 'east'
yabai < shift + cmd - 0x21 : ~/.config/yabai/move_to_stack.sh 'north'
yabai < shift + cmd - 0x1E : ~/.config/yabai/move_to_stack.sh 'south'

# Cycle within stack with  <M-`>  <M-S-`>
yabai < lcmd         - 0x32 : yabai -m window --focus stack.prev\
                           || yabai -m window --focus stack.last
yabai < lcmd + shift - 0x32 : yabai -m window --focus stack.next\
                           || yabai -m window --focus stack.first
# Cycle between stacks with  <M-Tab>
#TODO: Depreciate or fix
#yabai < cmd - 0x30 : yabai -m window --focus \
#    "$(yabai -m query --windows --space | ~/.config/yabai/cycle_stack.js)"

yabai < x : yabai -m window --close
yabai < 0x1B : yabai -m window --minimize  # Uses -

# Rofi select windows with ;
yabai < 0x29 : skhd -k "return" && ~/.config/yabai/rofi_window.js

# Move window between spaces
yabai < shift - a : yabai -m window --space prev && \
                    yabai -m space --focus prev
yabai < shift - d : yabai -m window --space next && \
                    yabai -m space --focus next

# Resize window
    # Horizontal
yabai <        q : yabai -m window --resize  left:-30:0
yabai <        w : yabai -m window --resize   left:30:0
yabai <        e : yabai -m window --resize right:-30:0
yabai <        r : yabai -m window --resize  right:30:0
    # Vertical
yabai < lcmd - q : yabai -m window --resize    top:0:-30
yabai < lcmd - w : yabai -m window --resize     top:0:30
yabai < lcmd - e : yabai -m window --resize bottom:0:-30
yabai < lcmd - r : yabai -m window --resize  bottom:0:30
    # Horizontal - fine
yabai < shift - q : yabai -m window --resize  left:-10:0
yabai < shift - w : yabai -m window --resize   left:10:0
yabai < shift - e : yabai -m window --resize right:-10:0
yabai < shift - r : yabai -m window --resize  right:10:0
    # Vertical - fine
yabai < lcmd + shift - q : yabai -m window --resize    top:0:-10
yabai < lcmd + shift - w : yabai -m window --resize     top:0:10
yabai < lcmd + shift - e : yabai -m window --resize bottom:0:-10
yabai < lcmd + shift - r : yabai -m window --resize  bottom:0:10

# Pinning windows ===
:: pinning @ : sketchybar -m --bar color=0xFFB8BB26
yabai < m ; pinning
pinning < escape      ; default
pinning < ctrl - 0x21 ; yabai

pinning < c : ~/.config/yabai/pin_window.js --clear; skhd -k "ctrl - 0x21"

pinning < 1 : ~/.config/yabai/pin_window.js --set 1 \
            $(yabai -m query --windows --space | jq '.[0]["id"]'); \
            skhd -k "ctrl - 0x21"
pinning < 2 : ~/.config/yabai/pin_window.js --set 2 \
            $(yabai -m query --windows --space | jq '.[0]["id"]'); \
            skhd -k "ctrl - 0x21"
pinning < 3 : ~/.config/yabai/pin_window.js --set 3 \
            $(yabai -m query --windows --space | jq '.[0]["id"]'); \
            skhd -k "ctrl - 0x21"
pinning < 4 : ~/.config/yabai/pin_window.js --set 4 \
            $(yabai -m query --windows --space | jq '.[0]["id"]'); \
            skhd -k "ctrl - 0x21"
pinning < 5 : ~/.config/yabai/pin_window.js --set 5 \
            $(yabai -m query --windows --space | jq '.[0]["id"]'); \
            skhd -k "ctrl - 0x21"
pinning < 6 : ~/.config/yabai/pin_window.js --set 6 \
            $(yabai -m query --windows --space | jq '.[0]["id"]'); \
            skhd -k "ctrl - 0x21"
pinning < 7 : ~/.config/yabai/pin_window.js --set 7 \
            $(yabai -m query --windows --space | jq '.[0]["id"]'); \
            skhd -k "ctrl - 0x21"
pinning < 8 : ~/.config/yabai/pin_window.js --set 8 \
            $(yabai -m query --windows --space | jq '.[0]["id"]'); \
            skhd -k "ctrl - 0x21"
pinning < 9 : ~/.config/yabai/pin_window.js --set 9 \
            $(yabai -m query --windows --space | jq '.[0]["id"]'); \
            skhd -k "ctrl - 0x21"

# Focuses pinned window
yabai < alt - 1 : ~/.config/yabai/pin_window.js --focus 1
yabai < alt - 2 : ~/.config/yabai/pin_window.js --focus 2
yabai < alt - 3 : ~/.config/yabai/pin_window.js --focus 3
yabai < alt - 4 : ~/.config/yabai/pin_window.js --focus 4
yabai < alt - 5 : ~/.config/yabai/pin_window.js --focus 5
yabai < alt - 6 : ~/.config/yabai/pin_window.js --focus 6
yabai < alt - 7 : ~/.config/yabai/pin_window.js --focus 7
yabai < alt - 8 : ~/.config/yabai/pin_window.js --focus 8
yabai < alt - 9 : ~/.config/yabai/pin_window.js --focus 9

default < alt - 1 : ~/.config/yabai/pin_window.js --focus 1
default < alt - 2 : ~/.config/yabai/pin_window.js --focus 2
default < alt - 3 : ~/.config/yabai/pin_window.js --focus 3
default < alt - 4 : ~/.config/yabai/pin_window.js --focus 4
default < alt - 5 : ~/.config/yabai/pin_window.js --focus 5
default < alt - 6 : ~/.config/yabai/pin_window.js --focus 6
default < alt - 7 : ~/.config/yabai/pin_window.js --focus 7
default < alt - 8 : ~/.config/yabai/pin_window.js --focus 8
default < alt - 9 : ~/.config/yabai/pin_window.js --focus 9

default < cmd + shift - space : ~/.config/yabai/pin_window.js --rofi

yabai < f : yabai -m window --toggle float

# Spaces ====
# Switch space
yabai < cmd + shift - a : yabai -m space --focus prev && yabai -m window --focus
yabai < cmd + shift - d : yabai -m space --focus next && yabai -m window --focus

default < cmd + shift - 1 : yabai -m space --focus 1 && yabai -m window --focus
default < cmd + shift - 2 : yabai -m space --focus 2 && yabai -m window --focus
default < cmd + shift - 3 : yabai -m space --focus 3 && yabai -m window --focus
default < cmd + shift - 4 : yabai -m space --focus 4 && yabai -m window --focus
default < cmd + shift - 9 : yabai -m space --focus last && yabai -m window --focus

# Reorder space
yabai < ctrl - a : yabai -m space --move prev && ~/.config/sketchybar/plugins/yabai_spaces.js --update
yabai < ctrl - d : yabai -m space --move next && ~/.config/sketchybar/plugins/yabai_spaces.js --update
yabai < n        : ~/.config/yabai/new_space.js && ~/.config/sketchybar/plugins/yabai_spaces.js --update
yabai < ctrl - q : ~/.config/yabai/close_space.js && ~/.config/sketchybar/plugins/yabai_spaces.js --update

# Float ====
# Center window
yabai < c : yabai -m window --toggle float && \
           yabai -m window --grid 80:80:11:2:58:71

# Picture in picture
yabai < p : yabai -m window --toggle sticky && \
            yabai -m window --toggle pip