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