#!/usr/bin/env zsh # Utility functions function map () { local riverctl="${4}" if [[ "${riverctl}" = 'sd-spawn' ]]; then riverctl map "${1}" "${2}" "${3}" spawn \ "systemd-run --user --ignore-failure -- ${5}" else riverctl map "${@}" fi } function nmap () { map normal "${@}" } function input() { local pattern="${1}" for prop value in ${@:2}; do riverctl input "${pattern}" "${prop}" "${value}" done } function spawn () { riverctl spawn "${${@}}" } function sd-spawn () { riverctl spawn "systemd-run --user --G -- %{%{@}}" } local SCRIPT_DIR="${HOME}/scripts/" local RIVER_CONFIG="${HOME}/.config/river/config/" local mod=Super # Some standard programs nmap ${mod} R spawn 'systemd-run --user -G --scope fuzzel --launch-prefix="systemd-run --user -G --"' nmap ${mod}+Shift Return sd-spawn 'kitty -1' nmap ${mod}+Shift E sd-spawn 'emacsclient -nc' nmap ${mod}+Shift B sd-spawn 'mullvad-browser' # nmap ${mod}+Shift D spawn 'gtk-pipe-viewer' nmap ${mod}+Shift D sd-spawn 'freetube --new-window' nmap ${mod}+Shift O sd-spawn 'loginctl lock-session' nmap ${mod}+Shift P sd-spawn 'keepassxc' nmap ${mod}+Shift M sd-spawn 'emacsclient -nc --eval "(mu4e)"' nmap ${mod}+Shift C sd-spawn 'kitty -1 ikhal' nmap ${mod}+Shift R sd-spawn "${SCRIPT_DIR}/wayland-screenshot.sh" nmap ${mod}+Shift N sd-spawn "${SCRIPT_DIR}/system-menu/system-menu.sh" # Fcitx5 (this also works for waybar) nmap ${mod} Space spawn "${SCRIPT_DIR}/status-bar/sb-fcitx5-toggle ${RIVER_CONFIG}" # Dunst bindings nmap ${mod} U spawn 'dunstctl close' nmap ${mod}+Shift U spawn 'dunstctl context' nmap ${mod}+Control U spawn 'dunstctl history-pop' nmap ${mod}+Control+Shift U spawn 'dunstctl close-all' # ${mod}+Shift+T to show the systray nmap ${mod}+Shift T spawn "pkill -RTMIN+4 waybar" # ${mod}+X to close the focused view nmap ${mod} X close # ${mod}+Shift+Q to exit river nmap ${mod}+Shift Q sd-spawn "${SCRIPT_DIR}/system-menu/confirm-logout.sh" # ${mod}+J and ${mod}+K to focus the next/previous view in the layout stack nmap ${mod} J focus-view next nmap ${mod} K focus-view previous # ${mod}+Shift+J and ${mod}+Shift+K to swap the focused view with the next/previous # view in the layout stack nmap ${mod}+Shift J swap next nmap ${mod}+Shift K swap previous # ${mod}+Period and ${mod}+Comma to focus the next/previous output nmap ${mod} Period focus-output previous nmap ${mod} Comma focus-output next # ${mod}+Shift+{Period,Comma} to send the focused view to the next/previous output nmap ${mod}+Shift Period send-to-output -current-tags previous nmap ${mod}+Shift Comma send-to-output -current-tags next # ${mod}+Return to bump the focused view to the top of the layout stack nmap ${mod} Return zoom # ${mod}+H and ${mod}+L to decrease/increase the main ratio of rivertile(1) nmap ${mod} H send-layout-cmd rivertile "main-ratio -0.05" nmap ${mod} L send-layout-cmd rivertile "main-ratio +0.05" # ${mod}+Shift+H and ${mod}+Shift+L to increment/decrement the main count of rivertile(1) nmap ${mod}+Shift H send-layout-cmd rivertile "main-count +1" nmap ${mod}+Shift L send-layout-cmd rivertile "main-count -1" # ${mod}+Alt+{H,J,K,L} to move views nmap ${mod}+Alt H move left 100 nmap ${mod}+Alt J move down 100 nmap ${mod}+Alt K move up 100 nmap ${mod}+Alt L move right 100 # ${mod}+Alt+Control+{H,J,K,L} to snap views to screen edges nmap ${mod}+Alt+Control H snap left nmap ${mod}+Alt+Control J snap down nmap ${mod}+Alt+Control K snap up nmap ${mod}+Alt+Control L snap right # ${mod}+Alt+Shift+{H,J,K,L} to resize views nmap ${mod}+Alt+Shift H resize horizontal -100 nmap ${mod}+Alt+Shift J resize vertical 100 nmap ${mod}+Alt+Shift K resize vertical -100 nmap ${mod}+Alt+Shift L resize horizontal 100 # ${mod} + Left Mouse Button to move views riverctl map-pointer normal ${mod} BTN_LEFT move-view # ${mod} + Right Mouse Button to resize views riverctl map-pointer normal ${mod} BTN_RIGHT resize-view # ${mod} + Middle Mouse Button to toggle float riverctl map-pointer normal ${mod} BTN_MIDDLE toggle-float # ${mod} + Tab to switch between two sets of tags nmap ${mod} Tab focus-previous-tags for ((i = 1; i <= 9; ++i)); do let tags=$((1 << (${i} - 1))) # ${mod}+[1-9] to focus tag [0-8] nmap ${mod} ${i} set-focused-tags ${tags} # ${mod}+Shift+[1-9] to tag focused view with tag [0-8] nmap ${mod}+Shift ${i} set-view-tags ${tags} # ${mod}+Control+[1-9] to toggle focus of tag [0-8] nmap ${mod}+Control ${i} toggle-focused-tags ${tags} # ${mod}+Shift+Control+[1-9] to toggle tag [0-8] of focused view nmap ${mod}+Shift+Control ${i} toggle-view-tags ${tags} done # ${mod}+0 to focus all tags # ${mod}+Shift+0 to tag focused view with all tags let all_tags=$(((1 << 32) - 1)) nmap ${mod} 0 set-focused-tags ${all_tags} nmap ${mod}+Shift 0 set-view-tags ${all_tags} # ${mod}+Space to toggle float nmap ${mod}+Shift Space toggle-float # ${mod}+F to toggle fullscreen nmap ${mod} F toggle-fullscreen # ${mod}+{Up,Right,Down,Left} to change layout orientation nmap ${mod} Up send-layout-cmd rivertile "main-location top" nmap ${mod} Right send-layout-cmd rivertile "main-location right" nmap ${mod} Down send-layout-cmd rivertile "main-location bottom" nmap ${mod} 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 # ${mod}+F11 to enter passthrough mode nmap ${mod} F11 enter-mode passthrough # ${mod}+F11 to return to normal mode map passthrough ${mod} F11 enter-mode normal # Control volume nmap None XF86AudioRaiseVolume spawn "${SCRIPT_DIR}/sound-control.sh up 5%" nmap Shift XF86AudioRaiseVolume spawn "${SCRIPT_DIR}/sound-control.sh up 1%" nmap None XF86AudioLowerVolume spawn "${SCRIPT_DIR}/sound-control.sh down 5%" nmap Shift XF86AudioLowerVolume spawn "${SCRIPT_DIR}/sound-control.sh down 1%" nmap None XF86AudioMute spawn "${SCRIPT_DIR}/sound-control.sh mute" map locked None XF86AudioRaiseVolume spawn "${SCRIPT_DIR}/sound-control.sh -n up 5%" map locked Shift XF86AudioRaiseVolume spawn "${SCRIPT_DIR}/sound-control.sh -n up 1%" map locked None XF86AudioLowerVolume spawn "${SCRIPT_DIR}/sound-control.sh -n down 5%" map locked Shift XF86AudioLowerVolume spawn "${SCRIPT_DIR}/sound-control.sh -n down 1%" map locked None XF86AudioMute spawn "${SCRIPT_DIR}/sound-control.sh -n mute" nmap None KP_Prior spawn "${SCRIPT_DIR}/sound-control.sh up 5%" nmap Shift KP_Prior spawn "${SCRIPT_DIR}/sound-control.sh up 1%" nmap None KP_Home spawn "${SCRIPT_DIR}/sound-control.sh down 5%" nmap Shift KP_Home spawn "${SCRIPT_DIR}/sound-control.sh down 1%" nmap None KP_Up spawn "${SCRIPT_DIR}/sound-control.sh mute" map locked None KP_Prior spawn "${SCRIPT_DIR}/sound-control.sh -n up 5%" map locked Shift KP_Prior spawn "${SCRIPT_DIR}/sound-control.sh -n up 1%" map locked None KP_Home spawn "${SCRIPT_DIR}/sound-control.sh -n down 5%" map locked Shift KP_Home spawn "${SCRIPT_DIR}/sound-control.sh -n down 1%" map locked None KP_Up spawn "${SCRIPT_DIR}/sound-control.sh -n mute" # Control screen backlight brightness nmap None XF86MonBrightnessUp spawn "${SCRIPT_DIR}/brightness-control.sh up 5%" nmap None XF86MonBrightnessDown spawn "${SCRIPT_DIR}/brightness-control.sh down 5%" map locked None XF86MonBrightnessUp spawn "${SCRIPT_DIR}/brightness-control.sh -n up 5%" map locked None XF86MonBrightnessDown spawn "${SCRIPT_DIR}/brightness-control.sh -n down 5%" for mode in normal locked; do # Control MPRIS aware media players with playerctl map ${mode} None XF86AudioMedia spawn 'playerctl play-pause' map ${mode} None XF86AudioPlay spawn 'playerctl play-pause' map ${mode} None XF86AudioPrev spawn 'playerctl previous' map ${mode} None XF86AudioNext spawn 'playerctl next' done # Use server-side decorations for everything by default riverctl rule-add 'ssd' # Set background and border color riverctl background-color '0x002b36' riverctl border-color-focused '0xff0000' riverctl border-color-unfocused '0x586e75' # Set keyboard repeat rate riverctl set-repeat 50 300 # Some cursor options riverctl focus-follows-cursor "normal" riverctl set-cursor-warp "on-focus-change" # Input options input '*_Touchpad' \ disable-while-typing 'disabled' \ click-method 'clickfinger' \ drag 'enabled' \ middle-emulation 'enabled' \ natural-scroll 'enabled' \ tap 'enabled' \ tap-button-map 'left-right-middle' \ scroll-method 'two-finger' input '*' \ accel-profile 'flat' # Make caps lock act as control riverctl keyboard-layout \ -options 'caps:ctrl_modifier' \ 'us' # 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 rivertile -view-padding 3 -outer-padding 3 -main-ratio 0.5 & # Update the some environment variables systemctl --user import-environment WAYLAND_DISPLAY DISPLAY dbus-update-activation-environment WAYLAND_DISPLAY DISPLAY # Notify systemd that we have setup River systemd-notify --ready "${SCRIPT_DIR}/emacs-server-set-wayland-display.zsh" # Start some programs # spawn "waybar" # spawn 'env -u GTK_IM_MODULE fcitx5 -rd' # prevent warnings # spawn 'dunst' # spawn '/usr/lib/mate-polkit/polkit-mate-authentication-agent-1' # spawn 'kanshi' # spawn 'systembus-notify' # case "${HOST}" in # *-desktop) # spawn "swayidle -w -C '${RIVER_CONFIG}/swayidle-desktop.conf'" # spawn "swaybg -o DP-1 -m fill -i '${WALLPAPERS_DIR}/fapta.png' "\ # "-o DP-3 -m fill -i '${WALLPAPERS_DIR}/Veko and Friend.png'" # ;; # *-portable) # spawn "${SCRIPT_DIR}/laptop-lid-daemon" # spawn "swayidle -w -C '${RIVER_CONFIG}/swayidle-laptop.conf'" # spawn "swaybg -m fill -o '*' -i '${WALLPAPERS_DIR}/Girls Last Tour 2.jpg'" # ;; # esac # "${SCRIPT_DIR}/cl/bin/khal-notify" & # "${SCRIPT_DIR}/cl/bin/inhibit-sleep-for-audio" & # "${SCRIPT_DIR}/notify-tasks.hy" & # "${SCRIPT_DIR}/usbguard-notify.py" & # { # # try to make sure these start after waybar opens # let i=0 # while ! pgrep waybar >/dev/null 2>&1; do # if ((${i} >= 8)); then # exit # fi # sleep 0.25s # done # sleep 1s # spawn "keepassxc" # spawn "nextcloud" # spawn "corectrl --minimize-systray" # spawn "solaar -w hide" # spawn "protonmail-bridge --no-window" # spawn "mullvad-vpn" # spawn "blueman-applet" # } &