From 35374800bf9ee67e2dc84d01a2a3e6d83bfe4efc Mon Sep 17 00:00:00 2001 From: thomas Date: Sun, 11 Oct 2026 17:28:55 +0100 Subject: [PATCH] Fix: Volume keys use wpctl instead of missing pamixer Quickshell's VolumeOsd now shows changes, so drop notify-send popups. Co-Authored-By: Claude Opus 5.5 --- dotfiles/.config/hypr/scripts/Volume.sh | 156 ++++-------------------- 1 file changed, 25 insertions(+), 131 deletions(-) diff --git a/dotfiles/.config/hypr/scripts/Volume.sh b/dotfiles/.config/hypr/scripts/Volume.sh index bf8f18c..1c2e9b4 100755 --- a/dotfiles/.config/hypr/scripts/Volume.sh +++ b/dotfiles/.config/hypr/scripts/Volume.sh @@ -1,143 +1,37 @@ #!/bin/bash -# HyprFlux — https://github.com/ahmad9059/HyprFlux -# Scripts for volume controls for audio and mic +# Volume controls for audio and mic via wpctl (PipeWire). +# Quickshell's VolumeOsd watches PipeWire directly, so no notifications here. -iDIR="$HOME/.config/swaync/icons" -sDIR="$HOME/.config/hypr/scripts" +SINK="@DEFAULT_AUDIO_SINK@" +SOURCE="@DEFAULT_AUDIO_SOURCE@" +STEP="5%" -# Get Volume +# Print volume as an integer percent, or "Muted" get_volume() { - volume=$(pamixer --get-volume) - if [[ "$volume" -eq "0" ]]; then + local out + out=$(wpctl get-volume "$1") + if [[ "$out" == *MUTED* ]]; then echo "Muted" else - echo "$volume %" + awk '{ printf "%d %%\n", $2 * 100 + 0.5 }' <<< "$out" fi } -# Get icons -get_icon() { - current=$(get_volume) - if [[ "$current" == "Muted" ]]; then - echo "$iDIR/volume-mute.png" - elif [[ "${current%\%}" -le 30 ]]; then - echo "$iDIR/volume-low.png" - elif [[ "${current%\%}" -le 60 ]]; then - echo "$iDIR/volume-mid.png" - else - echo "$iDIR/volume-high.png" - fi +is_muted() { + [[ "$(wpctl get-volume "$1")" == *MUTED* ]] } -# Notify -notify_user() { - if [[ "$(get_volume)" == "Muted" ]]; then - notify-send -e -h string:x-canonical-private-synchronous:volume_notif -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$(get_icon)" " Volume:" " Muted" - else - notify-send -e -h int:value:"$(get_volume | sed 's/%//')" -h string:x-canonical-private-synchronous:volume_notif -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$(get_icon)" " Volume Level:" " $(get_volume)" && - "$sDIR/Sounds.sh" --volume - fi -} +# Raising/lowering while muted unmutes first, matching the old behaviour +inc() { is_muted "$1" && wpctl set-mute "$1" 0 || wpctl set-volume -l 1.0 "$1" "$STEP+"; } +dec() { is_muted "$1" && wpctl set-mute "$1" 0 || wpctl set-volume "$1" "$STEP-"; } -# Increase Volume -inc_volume() { - if [ "$(pamixer --get-mute)" == "true" ]; then - toggle_mute - else - pamixer -i 5 --allow-boost --set-limit 150 && notify_user - fi -} - -# Decrease Volume -dec_volume() { - if [ "$(pamixer --get-mute)" == "true" ]; then - toggle_mute - else - pamixer -d 5 && notify_user - fi -} - -# Toggle Mute -toggle_mute() { - if [ "$(pamixer --get-mute)" == "false" ]; then - pamixer -m && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$iDIR/volume-mute.png" " Mute" - elif [ "$(pamixer --get-mute)" == "true" ]; then - pamixer -u && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$(get_icon)" " Volume:" " Switched ON" - fi -} - -# Toggle Mic -toggle_mic() { - if [ "$(pamixer --default-source --get-mute)" == "false" ]; then - pamixer --default-source -m && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$iDIR/microphone-mute.png" " Microphone:" " Switched OFF" - elif [ "$(pamixer --default-source --get-mute)" == "true" ]; then - pamixer -u --default-source u && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$iDIR/microphone.png" " Microphone:" " Switched ON" - fi -} -# Get Mic Icon -get_mic_icon() { - current=$(pamixer --default-source --get-volume) - if [[ "$current" -eq "0" ]]; then - echo "$iDIR/microphone-mute.png" - else - echo "$iDIR/microphone.png" - fi -} - -# Get Microphone Volume -get_mic_volume() { - volume=$(pamixer --default-source --get-volume) - if [[ "$volume" -eq "0" ]]; then - echo "Muted" - else - echo "$volume %" - fi -} - -# Notify for Microphone -notify_mic_user() { - volume=$(get_mic_volume) - icon=$(get_mic_icon) - notify-send -e -h int:value:"$volume" -h "string:x-canonical-private-synchronous:volume_notif" -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$icon" " Mic Level:" " $volume" -} - -# Increase MIC Volume -inc_mic_volume() { - if [ "$(pamixer --default-source --get-mute)" == "true" ]; then - toggle_mic - else - pamixer --default-source -i 5 && notify_mic_user - fi -} - -# Decrease MIC Volume -dec_mic_volume() { - if [ "$(pamixer --default-source --get-mute)" == "true" ]; then - toggle-mic - else - pamixer --default-source -d 5 && notify_mic_user - fi -} - -# Execute accordingly -if [[ "$1" == "--get" ]]; then - get_volume -elif [[ "$1" == "--inc" ]]; then - inc_volume -elif [[ "$1" == "--dec" ]]; then - dec_volume -elif [[ "$1" == "--toggle" ]]; then - toggle_mute -elif [[ "$1" == "--toggle-mic" ]]; then - toggle_mic -elif [[ "$1" == "--get-icon" ]]; then - get_icon -elif [[ "$1" == "--get-mic-icon" ]]; then - get_mic_icon -elif [[ "$1" == "--mic-inc" ]]; then - inc_mic_volume -elif [[ "$1" == "--mic-dec" ]]; then - dec_mic_volume -else - get_volume -fi \ No newline at end of file +case "$1" in + --inc) inc "$SINK" ;; + --dec) dec "$SINK" ;; + --toggle) wpctl set-mute "$SINK" toggle ;; + --toggle-mic) wpctl set-mute "$SOURCE" toggle ;; + --mic-inc) inc "$SOURCE" ;; + --mic-dec) dec "$SOURCE" ;; + --get-mic) get_volume "$SOURCE" ;; + *) get_volume "$SINK" ;; +esac