#!/usr/bin/env bash # mutes the pipewire sink of the active window, if we can find it. # $1: if non-empty, applies the specified shader # 1: get activewindow pid # 2 match to pactl source # 2a: try directly against pid # 2b: if fails: run through fallbacks for specific windows # 3 toggle pactl source mute # 4 set window tag for custom shading # Toggle mute a pactl sink # $1 int: id of sink to toggle function toggle_sink { pactl set-sink-input-mute "$1" toggle } # Toggle mute for an array of pactl sinks # $1 string: space separated list of sink ids function toggle_multiple { for i in $1; do toggle_sink "$i" done } case "$XDG_CURRENT_DESKTOP" in "Hyprland") activePid=$(hyprctl activewindow -j | jq ".pid") tagCmd="hyprctl dispatch 'hl.dsp.window.tag({ tag = \"shader/$1\" })'" class=$(hyprctl activewindow -j | jq ".class") ;; *) dunstify -u low -t 2000 -i ~/.icons/candy-icons/apps/scalable/yast-sound.svg "muteActive does not support the current desktop." exit ;; esac sinks=$(pactl -f json list sink-inputs) binary=$(ps -q "$activePid" -o comm=) windowName="$binary" mutableSinks=$(printf "%s" "$sinks" | jq -r ".[] | select(.properties.\"application.process.id\" == \"$activePid\") | .index") # fallbacks if [[ -z "$mutableSinks" ]]; then # feishin mutableSinks=$(printf "%s" "$sinks" | jq -r ".[] | select(.properties.\"application.process.binary\" == \"$binary\") | .index") windowName="Feishin" fi if [[ -z "$mutableSinks" ]]; then # mpv mutableSinks=$(printf "%s" "$sinks" | jq -r ".[] | select(.properties.\"application.id\" == \"$binary\") | .index") windowName="Mpv" fi if [[ -z "$mutableSinks" && "$class" = \"tf_linux64\" ]]; then # tf2 mutableSinks=$(printf "%s" "$sinks" | jq -r ".[] | select(.properties.\"application.name\" == \"tf_linux64\" ) .index") windowName="TF2" fi if [[ -z "$mutableSinks" ]]; then # still no matched sink; give up printf "Couldn't match activeWindow to any pipewire sinks!\n" dunstify -u low \ -a Mute \ -r 35 \ -i ~/.icons/candy-icons/apps/scalable/yast-sound.svg \ "Could not match active window to pipewire input" exit 1 else printf "Matched activeWindow | class | %s\n |binary| %s\n | sink | %s | to pipewire sink" "$class" "$binary" "$mutableSinks" | column -ts '|' dunstify -u low \ -a Mute \ -r 35 \ -i ~/.icons/candy-icons/apps/scalable/yast-sound.svg \ "Toggled mute on active window ($windowName)" fi toggle_multiple "$mutableSinks" [ -n "$1" ] && eval "$tagCmd"