X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/52deb6911957f840a0191f73c8a9626bd9ff5086..98977a1888c57a00dbefcbf83c4e598daeab33aa:/widgets/alsabar.lua?ds=sidebyside

diff --git a/widgets/alsabar.lua b/widgets/alsabar.lua
index f504cc0..fc45c72 100644
--- a/widgets/alsabar.lua
+++ b/widgets/alsabar.lua
@@ -8,12 +8,12 @@
 --]]
 
 local newtimer     = require("lain.helpers").newtimer
+local read_pipe    = require("lain.helpers").read_pipe
 
 local awful        = require("awful")
 local beautiful    = require("beautiful")
 local naughty      = require("naughty")
 
-local io           = { popen  = io.popen }
 local math         = { modf   = math.modf }
 local mouse        = mouse
 local string       = { format = string.format,
@@ -47,7 +47,8 @@ local alsabar = {
     },
 
     _current_level = 0,
-    _muted         = false
+    _muted         = false,
+    _status        = "off"
 }
 
 function alsabar.notify()
@@ -56,7 +57,7 @@ function alsabar.notify()
     local preset = {
         title   = "",
         text    = "",
-        timeout = 5,
+        timeout = 1,
         screen  = alsabar.notifications.screen,
         font    = alsabar.notifications.font .. " " ..
                   alsabar.notifications.font_size,
@@ -94,7 +95,7 @@ end
 
 local function worker(args)
     local args       = args or {}
-    local timeout    = args.timeout or 5
+    local timeout    = args.timeout or 1
     local settings   = args.settings or function() end
     local width      = args.width or 63
     local height     = args.heigth or 1
@@ -122,35 +123,38 @@ local function worker(args)
 
     function alsabar.update()
         -- Get mixer control contents
-        local f = assert(io.popen(string.format("%s get %s", alsabar.cmd, alsabar.channel)))
-        local mixer = f:read("*all")
-        f:close()
+        local mixer = read_pipe(string.format("%s get %s", alsabar.cmd, alsabar.channel))
 
         -- Capture mixer control state:          [5%] ... ... [on]
         local volu, mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
 
-        if volu == nil then
-            volu = 0
-            mute = "off"
-        end
+        volu = tonumber(volu) or 0
+        if mute == "" then mute = "off"
 
-        alsabar._current_level = tonumber(volu)
-        alsabar.bar:set_value(alsabar._current_level / 100)
-        if not mute and tonumber(volu) == 0 or mute == "off"
-        then
-            alsabar._muted = true
-            alsabar.tooltip:set_text (" [Muted] ")
-            alsabar.bar:set_color(alsabar.colors.mute)
-        else
-            alsabar._muted = false
-            alsabar.tooltip:set_text(string.format(" %s:%s ", alsabar.channel, volu))
-            alsabar.bar:set_color(alsabar.colors.unmute)
-        end
+        if alsabar._current_level ~= volu or alsabar._status ~= mute then
+
+            alsabar._current_level = volu
+            alsabar._status = mute
+
+            alsabar.bar:set_value(alsabar._current_level / 100)
 
-        volume_now = {}
-        volume_now.level = tonumber(volu)
-        volume_now.status = mute
-        settings()
+            if not mute and volu == 0 or mute == "off"
+            then
+                alsabar._muted = true
+                alsabar.tooltip:set_text (" [Muted] ")
+                alsabar.bar:set_color(alsabar.colors.mute)
+            else
+                alsabar._muted = false
+                alsabar.tooltip:set_text(string.format(" %s:%s ", alsabar.channel, volu))
+                alsabar.bar:set_color(alsabar.colors.unmute)
+            end
+
+            volume_now = {}
+            volume_now.level = volu
+            volume_now.status = mute
+
+            settings()
+        end
     end
 
     alsabar.bar:buttons (awful.util.table.join (