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

diff --git a/widgets/alsa.lua b/widgets/alsa.lua
index 7c26908..7500097 100644
--- a/widgets/alsa.lua
+++ b/widgets/alsa.lua
@@ -1,101 +1,57 @@
 
 --[[
-                                                      
-     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 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
+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 = "" }
 
-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.togglechannel = args.togglechannel
+    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
+        -- HDMIs can have a channel different from Master for toggling mute
+        if alsa.togglechannel then
+            s = string.match(read_pipe(string.format("%s get %s", alsa.cmd, alsa.togglechannel)), "%[(%a+)%]")
         end
 
-        if mute == nil or mute == 'on'
-        then
-            alsa.mute = true
-            mute = ''
-        else
-            alsa.mute = false
-            mute = 'M'
-        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
 
-        local ret = markup(color, string.format("%d%s", volume, mute))
-        myvolume:set_markup(markup(header_color, header) .. ret .. " ")
+            widget = alsa.widget
+            settings()
+        end
     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)
-    ))
-
-    alsa.widget = myvolume
-    alsa.channel = channel
-    alsa.step = step
-    alsa.notify = myvolumeupdate
+    timer_id = string.format("alsa-%s-%s", alsa.cmd, alsa.channel)
+    newtimer(timer_id, timeout, alsa.update)
 
     return setmetatable(alsa, { __index = alsa.widget })
 end