Add volume control to status bar, and update it to support forced

updates (idea is to send updates after manually making changes to
        volume/brightness for a more responsive ui etc)
This commit is contained in:
Martin Larsson 2025-05-09 01:03:15 +02:00
parent 2f4f053c11
commit 32c7f4ad75

View file

@ -6,8 +6,15 @@ brightness_icon=""
bluetooth_icon=""
keyboard_icon="⌨"
date_icon=""
volume_icon=""
muted_icon=""
while true; do
# --- Added for Signal Handling ---
# File to store the PID of this script
status_pid_file="/tmp/swaybar_status_pid"
# Function to update the status and print it
update_status() {
# VPN (Mullvad)
vpn_status=$(mullvad status)
is_connected=$(echo "$vpn_status" | grep -c "Connected")
@ -51,26 +58,55 @@ while true; do
if [ "$language_index" -eq 0 ]; then
keyboard_layout="US"
else
keyboard_layout="SE"
keyboard_layout="SE" # Assuming SE is index 1
fi
keyboard_display="$keyboard_icon $keyboard_layout"
# Combine all statuses, separated by tabs (\t).
# - In zsh, you can do literal tabs with $'\t'
volume_output=$(wpctl get-volume @DEFAULT_AUDIO_SINK@)
is_muted=$(echo "$volume_output" | grep -c "MUTED")
if [ "$is_muted" -eq 1 ]; then
volume_display="$muted_icon Muted"
else
# Extract decimal volume (e.g., 0.75) and convert to percentage
volume_decimal=$(echo "$volume_output" | awk '{print $2}')
# Use awk to multiply by 100 and format as an integer percentage
volume_percent=$(awk -v vol="$volume_decimal" 'BEGIN {printf "%.0f", vol * 100}')
volume_display="$volume_icon $volume_percent%"
fi
# Combine all statuses
final_status=""
if [ -n "$bluetooth_display" ]; then
final_status="$bluetooth_display"
fi
space=" "
space=" " # Using standard spaces for separation
final_status="$final_status$space$volume_display"
final_status="$final_status$space$brightness_display"
final_status="$final_status$space$battery"
final_status="$final_status$space$keyboard_display"
final_status="$final_status$space$vpn_display"
final_status="$final_status$space$network_display"
final_status="$final_status$space$date_time_icon"
final_status="$final_status "
final_status="$final_status " # Trailing space
# Print the status followed by a newline
echo "$final_status"
}
# --- Added for Signal Handling ---
# Write the script's PID to the file so we can signal it
echo $$ > "$status_pid_file"
# Trap a real-time signal (e.g., SIGRTMIN+8) to trigger an immediate update
# When this signal is received, the 'update_status' function is executed
trap 'update_status' 42
# Main loop
while true; do
update_status # Perform the regular update
sleep 1
done
# Clean up the PID file on exit (optional but good practice)
trap 'rm "$status_pid_file"' EXIT