Files
dotfiles/.local/bin/station-menu
2026-03-06 21:09:52 +00:00

347 lines
12 KiB
Bash
Executable File

#!/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