From b227e8bf42a857806f9c078b079a65ae768eaf9f Mon Sep 17 00:00:00 2001
From: Ashish Kumar Yadav <ashishkumar.yadav@students.iiserpune.ac.in>
Date: Tue, 13 Jul 2021 20:01:03 +0530
Subject: [PATCH] Improved volume block - added one for pipewire users

---
 blocks.def/volume.pipewire.sh | 44 +++++++++++++++++++++
 blocks.def/volume.sh          | 72 +++++++++++++++++------------------
 2 files changed, 79 insertions(+), 37 deletions(-)
 create mode 100755 blocks.def/volume.pipewire.sh

diff --git a/blocks.def/volume.pipewire.sh b/blocks.def/volume.pipewire.sh
new file mode 100755
index 0000000..a3703cf
--- /dev/null
+++ b/blocks.def/volume.pipewire.sh
@@ -0,0 +1,44 @@
+#!/bin/sh
+# (for pipewire users)
+# This script parses the output of `pacmd list-sinks' to find volume and mute
+# status of the default audio sink and whether headphones are plugged in or not
+# Also see ../daemons/pulse_daemon.sh
+sink=$(pactl info | awk '$1 == "Default" && $2 == "Sink:" {print $3}')
+[ -n "$sink" ] || exit
+pactl list sinks | awk -v sink="$sink" '
+    BEGIN {
+        ICONsn = "\x0c\x0b" # headphone unplugged, not muted
+        ICONsm = "\x0d\x0b" # headphone unplugged, muted
+        ICONhn = "\x0c\x0b" # headphone plugged in, not muted
+        ICONhm = "\x0d\x0b" # headphone plugged in, muted
+    }
+    f {
+        if ($1 == "Mute:" && $2 == "yes") {
+            m = 1
+        } else if ($1 == "Volume:") {
+            if ($3 == $10) {
+                vb = $5
+            } else {
+                vl = $5
+                vr = $12
+            }
+        } else if ($1 == "Active" && $2 == "Port:") {
+            if (tolower($3) ~ /headphone/)
+                h = 1
+            exit
+        }
+        next
+    }
+    $1 == "Name:" && $2 == sink {
+        f = 1
+    }
+    END {
+        if (f) {
+            printf "%s", h ? (m ? ICONhm : ICONhn) : (m ? ICONsm : ICONsn)
+            if (vb)
+                print vb
+            else
+                printf "L%s R%s\n", vl, vr
+        }
+    }
+'
diff --git a/blocks.def/volume.sh b/blocks.def/volume.sh
index 6ff90e3..b74139d 100755
--- a/blocks.def/volume.sh
+++ b/blocks.def/volume.sh
@@ -1,44 +1,42 @@
 #!/bin/sh
+# (for pulseaudio users)
 # This script parses the output of `pacmd list-sinks' to find volume and mute
 # status of the default audio sink and whether headphones are plugged in or not
 # Also see ../daemons/pulse_daemon.sh
-pacmd list-sinks |
-    awk '
-        BEGIN {
-            ICONsn = "\x0c\x0b" # headphone unplugged, not muted
-            ICONsm = "\x0d\x0b" # headphone unplugged, muted
-            ICONhn = "\x0c\x0b" # headphone plugged in, not muted
-            ICONhm = "\x0d\x0b" # headphone plugged in, muted
-        }
-        {
-            if (f) {
-                if ($1 == "index:") {
-                    exit
-                }
-                if ($1 == "muted:" && $2 == "yes") {
-                    m = 1
-                } else if ($1 == "volume:") {
-                    if ($3 == $10) {
-                        vb = $5
-                    } else {
-                        vl = $5
-                        vr = $12
-                    }
-                } else if ($1 == "active" && $2 == "port:" && $3 ~ /headphone/) {
-                    h = 1
-                }
-            } else if ($1 == "*" && $2 == "index:") {
-                f = 1
+pacmd list-sinks | awk '
+    BEGIN {
+        ICONsn = "\x0c\x0b" # headphone unplugged, not muted
+        ICONsm = "\x0d\x0b" # headphone unplugged, muted
+        ICONhn = "\x0c\x0b" # headphone plugged in, not muted
+        ICONhm = "\x0d\x0b" # headphone plugged in, muted
+    }
+    f {
+        if ($1 == "muted:" && $2 == "yes") {
+            m = 1
+        } else if ($1 == "volume:") {
+            if ($3 == $10) {
+                vb = $5
+            } else {
+                vl = $5
+                vr = $12
             }
+        } else if ($1 == "active" && $2 == "port:") {
+            if (tolower($3) ~ /headphone/)
+                h = 1
+            exit
         }
-        END {
-            if (f) {
-                printf "%s", h ? (m ? ICONhm : ICONhn) : (m ? ICONsm : ICONsn)
-                if (vb) {
-                    print vb
-                } else {
-                    printf "L%s R%s\n", vl, vr
-                }
-            }
+        next
+    }
+    $1 == "*" && $2 == "index:" {
+        f = 1
+    }
+    END {
+        if (f) {
+            printf "%s", h ? (m ? ICONhm : ICONhn) : (m ? ICONsm : ICONsn)
+            if (vb)
+                print vb
+            else
+                printf "L%s R%s\n", vl, vr
         }
-    '
+    }
+'