X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/046b0279b0f3eb827bcc2b2e395e6ea69c019733..b6e357e2849271c156dfe2589147e692cb8387e7:/widgets/alsa.lua?ds=inline

diff --git a/widgets/alsa.lua b/widgets/alsa.lua
index 7c26908..bb54942 100644
--- a/widgets/alsa.lua
+++ b/widgets/alsa.lua
@@ -1,101 +1,52 @@
 
 --[[
-                                                      
-     Licensed under GNU General Public License v2     
-      * (c) 2013,      Luke Bonham                    
-      * (c) 2010-2012, Peter Hofmann                  
-      * (c) 2010,      Adrian C. <anrxc@sysphere.org> 
-                                                      
+                                                  
+     Licensed under GNU General Public License v2 
+      * (c) 2013, Luke Bonham                     
+      * (c) 2010, Adrian C. <anrxc@sysphere.org>  
+                                                  
 --]]
 
-local markup          = require("lain.util.markup")
-local run_in_terminal = require("lain.helpers").run_in_terminal
+local newtimer        = require("lain.helpers").newtimer
+local read_pipe       = require("lain.helpers").read_pipe
 
-local awful           = require("awful")
-local beautiful       = require("beautiful")
 local wibox           = require("wibox")
 
-local io              = io
-local string          = { format = string.format,
-                          match  = string.match }
+local string          = { match  = string.match,
+                          format = string.format }
 
 local setmetatable    = setmetatable
 
--- ALSA volume infos
--- nain.widgets.alsa
-local alsa = {
-    volume = 0,
-    mute = false,
-}
+-- ALSA volume
+-- lain.widgets.alsa
+local alsa = { last_level = "0", last_status = "off" }
 
-function worker(args)
-    local args = args or {}
-    local channel = args.channel or "Master"
-    local step = args.step or "1%"
-    local header = args.header or " Vol "
-    local header_color = args.header_color or beautiful.fg_normal or "#FFFFFF"
-    local color = args.color or beautiful.fg_focus or "#FFFFFF"
+local function worker(args)
+    local args     = args or {}
+    local timeout  = args.timeout or 5
+    local settings = args.settings or function() end
 
-    local myvolume = wibox.widget.textbox()
-    local myvolumeupdate = function()
-        local f = io.popen('amixer get ' .. channel)
-        local mixer = f:read("*all")
-        f:close()
+    alsa.cmd     = args.cmd or "amixer"
+    alsa.channel = args.channel or "Master"
+    alsa.widget  = wibox.widget.textbox('')
 
-        local volume, mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
+    function alsa.update()
+        mixer = read_pipe(string.format("%s get %s", alsa.cmd, alsa.channel))
+        l, s = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
 
-        if volume == nil
-        then
-            alsa.volume = 0
-        else
-            alsa.volume = volume
-        end
+        if alsa.last_level ~= l or alsa.last_status ~= s then
+            volume_now = { level = l, status = s }
+            alsa.last_level = l
+            alsa.last_status = s
 
-        if mute == nil or mute == 'on'
-        then
-            alsa.mute = true
-            mute = ''
-        else
-            alsa.mute = false
-            mute = 'M'
+            widget = alsa.widget
+            settings()
         end
-
-        local ret = markup(color, string.format("%d%s", volume, mute))
-        myvolume:set_markup(markup(header_color, header) .. ret .. " ")
     end
 
-    local myvolumetimer = timer({ timeout = 5 })
-    myvolumetimer:connect_signal("timeout", myvolumeupdate)
-    myvolumetimer:start()
-    myvolumetimer:emit_signal("timeout")
-
-    myvolume:buttons(awful.util.table.join(
-        awful.button({}, 1,
-            function()
-                run_in_terminal('alsamixer')
-             end),
-        awful.button({}, 3,
-            function()
-                awful.util.spawn('amixer sset ' .. channel ' toggle')
-            end),
-
-        awful.button({}, 4,
-            function()
-                awful.util.spawn('amixer sset ' .. channel .. ' ' .. step '+')
-                myvolumeupdate()
-            end),
-
-        awful.button({}, 5,
-            function()
-                awful.util.spawn('amixer sset ' .. channel .. ' ' .. step '-')
-                myvolumeupdate()
-            end)
-    ))
+    timer_id = string.format("alsa-%s-%s", alsa.cmd, alsa.channel)
 
-    alsa.widget = myvolume
-    alsa.channel = channel
-    alsa.step = step
-    alsa.notify = myvolumeupdate
+    newtimer(timer_id, timeout, alsa.update)
 
     return setmetatable(alsa, { __index = alsa.widget })
 end