128 lines
4.1 KiB
Bash
Executable File
128 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -u
|
|
|
|
strict_delivery() {
|
|
[[ ${PANAMA_OSD_STRICT:-false} == true || ${PANAMA_OSD_STRICT:-false} == 1 ]]
|
|
}
|
|
|
|
show_progress() {
|
|
if ! qs ipc call osd progress "$1" "$2" 100 "$3" >/dev/null 2>&1; then
|
|
strict_delivery && return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
show_message() {
|
|
if ! qs ipc call osd message "$1" "$2" >/dev/null 2>&1; then
|
|
strict_delivery && return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
volume_state() {
|
|
local target="$1" output level percent muted=false
|
|
output="$(wpctl get-volume "$target" 2>/dev/null)" || return 1
|
|
if [[ $output =~ Volume:[[:space:]]*([0-9]+([.][0-9]+)?) ]]; then
|
|
level="${BASH_REMATCH[1]}"
|
|
else
|
|
return 1
|
|
fi
|
|
[[ $output == *"[MUTED]"* ]] && muted=true
|
|
percent="$(awk -v value="$level" 'BEGIN { printf "%d", value * 100 + 0.5 }')"
|
|
printf '%s %s\n' "$percent" "$muted"
|
|
}
|
|
|
|
show_volume() {
|
|
local target="$1" kind="$2" state percent muted label
|
|
state="$(volume_state "$target")" || return 0
|
|
read -r percent muted <<<"$state"
|
|
if [[ $muted == true ]]; then
|
|
show_progress "${kind}-muted" "$percent" "Muted"
|
|
else
|
|
label="${percent}%"
|
|
show_progress "$kind" "$percent" "$label"
|
|
fi
|
|
}
|
|
|
|
adjust_volume() {
|
|
local action="${1:-}" step="${2:-6}" target="@DEFAULT_AUDIO_SINK@"
|
|
case "$action" in
|
|
up) wpctl set-volume -l 1 "$target" "${step}%+" || return ;;
|
|
down) wpctl set-volume "$target" "${step}%-" || return ;;
|
|
toggle) wpctl set-mute "$target" toggle || return ;;
|
|
*) printf 'Usage: panama-osd volume up|down|toggle [step]\n' >&2; return 2 ;;
|
|
esac
|
|
show_volume "$target" volume
|
|
}
|
|
|
|
adjust_microphone() {
|
|
local action="${1:-}" step="${2:-6}" target="@DEFAULT_AUDIO_SOURCE@"
|
|
case "$action" in
|
|
up) wpctl set-volume -l 1 "$target" "${step}%+" || return ;;
|
|
down) wpctl set-volume "$target" "${step}%-" || return ;;
|
|
toggle) wpctl set-mute "$target" toggle || return ;;
|
|
*) printf 'Usage: panama-osd microphone up|down|toggle [step]\n' >&2; return 2 ;;
|
|
esac
|
|
show_volume "$target" microphone
|
|
}
|
|
|
|
adjust_brightness() {
|
|
local action="${1:-}" step="${2:-5}" output percent
|
|
case "$action" in
|
|
up) brightnessctl -e4 -n2 set "${step}%+" >/dev/null || return ;;
|
|
down) brightnessctl -e4 -n2 set "${step}%-" >/dev/null || return ;;
|
|
*) printf 'Usage: panama-osd brightness up|down [step]\n' >&2; return 2 ;;
|
|
esac
|
|
|
|
output="$(brightnessctl -m -c backlight 2>/dev/null)" || return 0
|
|
percent="$(awk -F, 'NR == 1 { value=$5; gsub(/%/, "", value); print value }' <<<"$output")"
|
|
[[ $percent =~ ^[0-9]+$ ]] || return 0
|
|
show_progress brightness "$percent" "${percent}%"
|
|
}
|
|
|
|
media_action() {
|
|
local action="${1:-}" kind label fallback
|
|
case "$action" in
|
|
play-pause)
|
|
playerctl play-pause || return
|
|
if [[ $(playerctl status 2>/dev/null) == "Playing" ]]; then
|
|
kind="media-play"
|
|
fallback="Playing"
|
|
else
|
|
kind="media-pause"
|
|
fallback="Paused"
|
|
fi
|
|
;;
|
|
next) playerctl next || return; kind="media-next"; fallback="Next track" ;;
|
|
previous) playerctl previous || return; kind="media-previous"; fallback="Previous track" ;;
|
|
stop) playerctl stop || return; kind="media-stop"; fallback="Stopped" ;;
|
|
*) printf 'Usage: panama-osd media play-pause|next|previous|stop\n' >&2; return 2 ;;
|
|
esac
|
|
|
|
label="$(playerctl metadata --format '{{ title }} — {{ artist }}' 2>/dev/null)"
|
|
[[ -n $label ]] || label="$fallback"
|
|
show_message "$kind" "$label"
|
|
}
|
|
|
|
case "${1:-}" in
|
|
volume) shift; adjust_volume "$@" ;;
|
|
microphone) shift; adjust_microphone "$@" ;;
|
|
brightness) shift; adjust_brightness "$@" ;;
|
|
media) shift; media_action "$@" ;;
|
|
message)
|
|
shift
|
|
kind="${1:-}"
|
|
[[ -n $kind && $# -ge 2 ]] || {
|
|
printf 'Usage: panama-osd message ICON LABEL\n' >&2
|
|
exit 2
|
|
}
|
|
shift
|
|
show_message "$kind" "$*"
|
|
;;
|
|
*)
|
|
printf 'Usage: panama-osd volume|microphone|brightness|media|message ACTION [value]\n' >&2
|
|
exit 2
|
|
;;
|
|
esac
|