#!/bin/bash # Launch the Station Menu or takes a parameter to jump straight to a submenu. Set to true when going directly to a submenu, so we can exit directly BACK_TO_EXIT=false back_to() { local parent_menu="$1" if [[ $BACK_TO_EXIT == "true" ]]; then exit 0 elif [[ -n $parent_menu ]]; then "$parent_menu" else show_main_menu fi } toggle_existing_menu() { if pgrep -f "walker.*--dmenu" > /dev/null; then walker --close > /dev/null 2>&1 exit 0 fi } menu() { local prompt="$1" local options="$2" local extra="$3" local preselect="$4" read -r -a args <<<"$extra" if [[ -n $preselect ]]; then local index index=$(echo -e "$options" | grep -nxF "$preselect" | cut -d: -f1) if [[ -n $index ]]; then args+=("-c" "$index") fi fi echo -e "$options" | station-launch-walker --dmenu --width 295 --minheight 1 --maxheight 630 -p "$prompt…" "${args[@]}" 2>/dev/null } terminal() { xdg-terminal-exec --app-id=org.station.terminal "$@" } present_terminal() { station-launch-floating-terminal-with-presentation $1 } open_in_editor() { notify-send "Editing config file" "$1" station-launch-editor "$1" } show_trigger_menu() { case $(menu "Trigger" " Capture\n Share\n󰔎 Toggle\n Hardware") in *Capture*) show_capture_menu ;; *Share*) show_share_menu ;; *Toggle*) show_toggle_menu ;; *Hardware*) show_hardware_menu ;; *) show_main_menu ;; esac } show_capture_menu() { case $(menu "Capture" " Screenshot\n Screenrecord\n󰃉 Color") in *Screenshot*) station-cmd-screenshot ;; *Screenrecord*) show_screenrecord_menu ;; *Color*) pkill hyprpicker || hyprpicker -a ;; *) back_to show_trigger_menu ;; esac } get_webcam_list() { v4l2-ctl --list-devices 2>/dev/null | while IFS= read -r line; do if [[ $line != $'\t'* && -n $line ]]; then local name="$line" IFS= read -r device || break device=$(echo "$device" | tr -d '\t' | head -1) [[ -n $device ]] && echo "$device $name" fi done } show_webcam_select_menu() { local devices=$(get_webcam_list) local count=$(echo "$devices" | grep -c . 2>/dev/null || echo 0) if [[ -z $devices ]] || ((count == 0)); then notify-send "No webcam devices found" -u critical -t 3000 return 1 fi if ((count == 1)); then echo "$devices" | awk '{print $1}' else menu "Select Webcam" "$devices" | awk '{print $1}' fi } show_screenrecord_menu() { station-cmd-screenrecord --stop-recording && exit 0 case $(menu "Screenrecord" " With no audio\n With desktop audio\n With desktop + microphone audio\n With desktop + microphone audio + webcam") in *"With no audio") station-cmd-screenrecord ;; *"With desktop audio") station-cmd-screenrecord --with-desktop-audio ;; *"With desktop + microphone audio") station-cmd-screenrecord --with-desktop-audio --with-microphone-audio ;; *"With desktop + microphone audio + webcam") local device=$(show_webcam_select_menu) || { back_to show_capture_menu return } station-cmd-screenrecord --with-desktop-audio --with-microphone-audio --with-webcam --webcam-device="$device" ;; *) back_to show_capture_menu ;; esac } # show_share_menu() { # case $(menu "Share" " Clipboard\n File \n Folder") in # *Clipboard*) station-cmd-share clipboard ;; # *File*) terminal bash -c "station-cmd-share file" ;; # *Folder*) terminal bash -c "station-cmd-share folder" ;; # *) back_to show_trigger_menu ;; # esac # } # # show_toggle_menu() { # case $(menu "Toggle" "󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Display Scaling") in # # *Screensaver*) station-toggle-screensaver ;; # *Nightlight*) station-toggle-nightlight ;; # *Idle*) station-toggle-idle ;; # *Bar*) station-toggle-waybar ;; # *Layout*) station-hyprland-workspace-layout-toggle ;; # *Ratio*) station-hyprland-window-single-square-aspect-toggle ;; # *Gaps*) station-hyprland-window-gaps-toggle ;; # *Scaling*) station-hyprland-monitor-scaling-cycle ;; # *) back_to show_trigger_menu ;; # esac # } # # show_hardware_menu() { # case $(menu "Toggle" " Hybrid GPU") in # *"Hybrid GPU"*) present_terminal station-toggle-hybrid-gpu ;; # *) show_trigger_menu ;; # esac # } # # show_style_menu() { # case $(menu "Style" " Background\n Hyprland\n󱄄 Screensaver") in # *Background*) show_background_menu ;; # *Hyprland*) open_in_editor ~/.config/hypr/looknfeel.conf ;; # *Screensaver*) open_in_editor ~/.config/station/branding/screensaver.txt ;; # *) show_main_menu ;; # esac # } # # show_background_menu() { # station-launch-walker -m menus:stationBackgroundSelector --width 800 --minheight 400 # } # # show_setup_menu() { # local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors" # [[ -f ~/.config/hypr/bindings.conf ]] && options="$options\n Keybindings" # [[ -f ~/.config/hypr/input.conf ]] && options="$options\n Input" # options="$options\n󰱔 DNS\n Security\n Config" # # case $(menu "Setup" "$options") in # *Audio*) station-launch-audio ;; # *Wifi*) station-launch-wifi ;; # *Bluetooth*) station-launch-bluetooth ;; # *Power*) show_setup_power_menu ;; # *System*) show_setup_system_menu ;; # *Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;; # *Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;; # *Input*) open_in_editor ~/.config/hypr/input.conf ;; # *DNS*) present_terminal station-setup-dns ;; # *Security*) show_setup_security_menu ;; # *Config*) show_setup_config_menu ;; # *) show_main_menu ;; # esac # } # # show_setup_power_menu() { # profile=$(menu "Power Profile" "$(station-powerprofiles-list)" "" "$(powerprofilesctl get)") # # if [[ $profile == "CNCLD" || -z $profile ]]; then # back_to show_setup_menu # else # powerprofilesctl set "$profile" # fi # } # # show_setup_security_menu() { # case $(menu "Setup" "󰈷 Fingerprint\n Fido2") in # *Fingerprint*) present_terminal station-setup-fingerprint ;; # *Fido2*) present_terminal station-setup-fido2 ;; # *) show_setup_menu ;; # esac # } # # show_setup_config_menu() { # case $(menu "Setup" " Defaults\n Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in # *Defaults*) open_in_editor ~/.config/uwsm/default ;; # *Hyprland*) open_in_editor ~/.config/hypr/hyprland.conf ;; # *Hypridle*) open_in_editor ~/.config/hypr/hypridle.conf && station-restart-hypridle ;; # *Hyprlock*) open_in_editor ~/.config/hypr/hyprlock.conf ;; # *Hyprsunset*) open_in_editor ~/.config/hypr/hyprsunset.conf && station-restart-hyprsunset ;; # *Swayosd*) open_in_editor ~/.config/swayosd/config.toml && station-restart-swayosd ;; # *Walker*) open_in_editor ~/.config/walker/config.toml && station-restart-walker ;; # *Waybar*) open_in_editor ~/.config/waybar/config.jsonc && station-restart-waybar ;; # *XCompose*) open_in_editor ~/.config/xcompose && station-restart-xcompose ;; # *) show_setup_menu ;; # esac # } # # show_setup_system_menu() { # local options="" # # if [[ -f ~/.local/state/station/toggles/suspend-off ]]; then # options="$options󰒲 Enable Suspend" # else # options="$options󰒲 Disable Suspend" # fi # # if station-hibernation-available; then # options="$options\n󰤁 Disable Hibernate" # else # options="$options\n󰤁 Enable Hibernate" # fi # # case $(menu "System" "$options") in # *Suspend*) station-toggle-suspend ;; # *"Enable Hibernate"*) present_terminal station-hibernation-setup ;; # *"Disable Hibernate"*) present_terminal station-hibernation-remove ;; # *) show_setup_menu ;; # esac # } # # show_update_menu() { # case $(menu "Update" " Config\n Process\n󰇅 Hardware\n Firmware\n Password\n Timezone\n Time") in # *Config*) show_update_config_menu ;; # *Process*) show_update_process_menu ;; # *Hardware*) show_update_hardware_menu ;; # *Firmware*) present_terminal station-update-firmware ;; # *Timezone*) present_terminal station-tz-select ;; # *Time*) present_terminal station-update-time ;; # *Password*) show_update_password_menu ;; # *) show_main_menu ;; # esac # } # # show_update_process_menu() { # case $(menu "Restart" " Hypridle\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar") in # *Hypridle*) station-restart-hypridle ;; # *Hyprsunset*) station-restart-hyprsunset ;; # *Swayosd*) station-restart-swayosd ;; # *Walker*) station-restart-walker ;; # *Waybar*) station-restart-waybar ;; # *) show_update_menu ;; # esac # } # # show_update_config_menu() { # case $(menu "Use default config" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n󱣴 Plymouth\n Swayosd\n Tmux\n󰌧 Walker\n󰍜 Waybar") in # *Hyprland*) present_terminal station-refresh-hyprland ;; # *Hypridle*) present_terminal station-refresh-hypridle ;; # *Hyprlock*) present_terminal station-refresh-hyprlock ;; # *Hyprsunset*) present_terminal station-refresh-hyprsunset ;; # *Plymouth*) present_terminal station-refresh-plymouth ;; # *Swayosd*) present_terminal station-refresh-swayosd ;; # *Tmux*) present_terminal station-refresh-tmux ;; # *Walker*) present_terminal station-refresh-walker ;; # *Waybar*) present_terminal station-refresh-waybar ;; # *) show_update_menu ;; # esac # } # # show_update_hardware_menu() { # case $(menu "Restart" " Audio\n󱚾 Wi-Fi\n󰂯 Bluetooth") in # *Audio*) present_terminal station-restart-pipewire ;; # *Wi-Fi*) present_terminal station-restart-wifi ;; # *Bluetooth*) present_terminal station-restart-bluetooth ;; # *) show_update_menu ;; # esac # } # # show_update_password_menu() { # case $(menu "Update Password" " Drive Encryption\n User") in # *Drive*) present_terminal station-drive-set-password ;; # *User*) present_terminal passwd ;; # *) show_update_menu ;; # esac # } # # show_system_menu() { # local options="󱄄 Screensaver\n Lock\n󰒲 Suspend" # station-hibernation-available && options="$options\n󰤁 Hibernate" # options="$options\n󰍃 Logout\n󰜉 Restart\n󰐥 Shutdown" # # case $(menu "System" "$options") in # *Screensaver*) station-launch-screensaver force ;; # *Lock*) station-lock-screen ;; # *Suspend*) systemctl suspend ;; # *Hibernate*) systemctl hibernate ;; # *Logout*) station-system-logout ;; # *Restart*) station-system-reboot ;; # *Shutdown*) station-system-shutdown ;; # *) back_to show_main_menu ;; # esac # } show_main_menu() { go_to_menu "$(menu "Go" "󰀻 Apps\n󱓞 Trigger\n Setup\n Update\n About\n System")" } go_to_menu() { case "${1,,}" in *apps*) walker -p "Launch…" ;; *trigger*) show_trigger_menu ;; # *toggle*) show_toggle_menu ;; # *share*) show_share_menu ;; # *background*) show_background_menu ;; # *capture*) show_capture_menu ;; # *theme*) show_theme_menu ;; # *screenrecord*) show_screenrecord_menu ;; # *setup*) show_setup_menu ;; # *power*) show_setup_power_menu ;; # *update*) show_update_menu ;; # *system*) show_system_menu ;; esac } toggle_existing_menu if [[ -n $1 ]]; then BACK_TO_EXIT=true go_to_menu "$1" else show_main_menu fi