#!/bin/sh

riverctl map normal Super+Shift Return spawn alacritty
riverctl map normal Super D spawn 'wofi --show drun'
riverctl map normal Super+Shift D spawn 'wofi --show run'
riverctl map normal Super P spawn wofi-pass
riverctl map normal Super+Shift S spawn 'wl-copy < "$(grimshot --notify save window)"'
riverctl map normal Super+Control S spawn 'wl-copy < "$(grimshot --notify save area)"'
riverctl map normal Super+Shift P spawn swaylock


riverctl map normal Super+Shift Q close
riverctl map normal Super+Shift E exit
riverctl map normal Super+Shift C spawn 'RIVER_RELOAD=1 ~/.config/river/init'

riverctl map normal Super J focus-view next
riverctl map normal Super K focus-view previous

riverctl map normal Super+Shift J swap next
riverctl map normal Super+Shift K swap previous

riverctl map normal Super M focus-output next
riverctl map normal Super Period focus-output previous

riverctl map normal Super+Shift M send-to-output next
riverctl map normal Super+Shift Period send-to-output previous

riverctl map normal Super Return zoom

riverctl map normal Super H send-layout-cmd rivertile "main-ratio -0.05"
riverctl map normal Super L send-layout-cmd rivertile "main-ratio +0.05"

riverctl map normal Super+Shift H send-layout-cmd rivertile "main-count +1"
riverctl map normal Super+Shift L send-layout-cmd rivertile "main-count -1"

riverctl map normal Super+Alt H move left 100
riverctl map normal Super+Alt J move down 100
riverctl map normal Super+Alt K move up 100
riverctl map normal Super+Alt L move right 100

riverctl map normal Super+Alt+Control H snap left
riverctl map normal Super+Alt+Control J snap down
riverctl map normal Super+Alt+Control K snap up
riverctl map normal Super+Alt+Control L snap right

riverctl map normal Super+Alt+Shift H resize horizontal -100
riverctl map normal Super+Alt+Shift J resize vertical 100
riverctl map normal Super+Alt+Shift K resize vertical -100
riverctl map normal Super+Alt+Shift L resize horizontal 100

riverctl map-pointer normal Super BTN_LEFT move-view
riverctl map-pointer normal Super BTN_RIGHT resize-view
riverctl map-pointer normal Super BTN_MIDDLE toggle-float

riverctl map-pointer normal Super KEY_SCROLLUP carousel "scroll -0.01"
riverctl map-pointer normal Super KEY_SCROLLDOWN send-layout-cmd carousel "scroll 0.01"

for i in $(seq 1 9)
do
    tags=$((1 << ($i - 1)))

    riverctl map normal Super $i set-focused-tags $tags
    riverctl map normal Super+Shift $i set-view-tags $tags

    riverctl map normal Super+Control $i toggle-focused-tags $tags
    riverctl map normal Super+Shift+Control $i toggle-view-tags $tags
done

all_tags=$(((1 << 32) - 1))
riverctl map normal Super 0 set-focused-tags $all_tags
riverctl map normal Super+Shift 0 set-view-tags $all_tags

riverctl map normal Super Space toggle-float
riverctl map normal Super F toggle-fullscreen

riverctl map normal Super Up    send-layout-cmd rivertile "main-location top"
riverctl map normal Super Right send-layout-cmd rivertile "main-location right"
riverctl map normal Super Down  send-layout-cmd rivertile "main-location bottom"
riverctl map normal Super Left  send-layout-cmd rivertile "main-location left"

# Declare a passthrough mode. This mode has only a single mapping to return to
# normal mode. This makes it useful for testing a nested wayland compositor
riverctl declare-mode passthrough
riverctl map normal Super F11 enter-mode passthrough
riverctl map passthrough Super F11 enter-mode normal

# Various media key mapping examples for both normal and locked mode which do
# not have a modifier
for mode in normal locked
do
    riverctl map $mode None XF86Eject spawn 'eject -T'

    riverctl map $mode None XF86AudioRaiseVolume  spawn 'pamixer -i 5'
    riverctl map $mode None XF86AudioLowerVolume  spawn 'pamixer -d 5'
    riverctl map $mode None XF86AudioMute         spawn 'pamixer --toggle-mute'

    riverctl map $mode None XF86AudioMedia spawn 'playerctl play-pause'
    riverctl map $mode None XF86AudioPlay  spawn 'playerctl play-pause'
    riverctl map $mode None XF86AudioPrev  spawn 'playerctl previous'
    riverctl map $mode None XF86AudioNext  spawn 'playerctl next'

    # Control screen backlight brightness with light (https://github.com/haikarainen/light)
    # Currently handled by acpid
    #riverctl map $mode None XF86MonBrightnessUp   spawn 'light -A 5'
    #riverctl map $mode None XF86MonBrightnessDown spawn 'light -U 5'
done

# Set background and border color
riverctl background-color 0x002b36
riverctl border-color-focused 0x93a1a1
riverctl border-color-unfocused 0x586e75

# Set keyboard repeat rate
riverctl set-repeat 50 300

# Make certain views start floating
#riverctl float-filter-add app-id float
#riverctl float-filter-add title "popup title with spaces"

# Set app-ids and titles of views which should use client side decorations
#riverctl csd-filter-add app-id "gedit"

# Set the default layout generator to be rivertile and start it.
# River will send the process group of the init executable SIGTERM on exit.
riverctl default-layout rivertile

riverctl map normal Super E output-layout bsp-layout
riverctl map normal Super W output-layout rivertile
riverctl map normal Super G output-layout uniform-grid
riverctl map normal Super S output-layout secondary-grid

# TODO: automated script to register windows to always float
riverctl rule-add -app-id wsjtx -title "* Wide Graph" float
riverctl rule-add -app-id GridTracker -title Alerts float
riverctl rule-add -app-id wsjtx -title "* Log QSO" float

# Only run these at the first load.
if [ -z $RIVER_RELOAD ]
then
    dbus-update-activation-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=river
    
    # Layout engines
    rivertile -view-padding 6 -outer-padding 6 &
    river-bsp-layout &
    river-uniform-grid-layout &
    river-secondary-grid-layout &

    # Daemons
    pipewire &
    wireplumber &
    pipewire-pulse &
    dunst & 
    udiskie &
    swayidle &

    # Bar
    i3bar-river &
fi
