X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/444ffd03c128f45ac1227b33ceb951ae12506a70..5318966270d86d52a2b9d7244b9336544a946d85:/widgets/alsabar.lua?ds=sidebyside

diff --git a/widgets/alsabar.lua b/widgets/alsabar.lua
index 15ba311..90c60b4 100644
--- a/widgets/alsabar.lua
+++ b/widgets/alsabar.lua
@@ -8,60 +8,58 @@
 --]]
 
 local helpers      = require("lain.helpers")
-
 local awful        = require("awful")
-local beautiful    = require("beautiful")
 local naughty      = require("naughty")
 local wibox        = require("wibox")
-
 local math         = { modf   = math.modf }
 local string       = { format = string.format,
                        match  = string.match,
                        rep    = string.rep }
-local tonumber     = tonumber
 local type         = type
-
+local tonumber     = tonumber
 local setmetatable = setmetatable
 
 -- ALSA volume bar
 -- lain.widgets.alsabar
 local alsabar = {
-    channel = "Master",
-    step    = "1%",
-
     colors = {
-        background = beautiful.bg_normal,
+        background = "#000000",
         mute       = "#EB8F8F",
         unmute     = "#A4CE8A"
     },
 
-    notifications = {
-        font      = beautiful.font:sub(beautiful.font:find(""), beautiful.font:find(" ")),
-        font_size = "11",
-        color     = beautiful.fg_normal,
-        screen    = 1
-    },
-
     _current_level = 0,
     _muted         = false
 }
 
 local function worker(args)
-    local args         = args or {}
-    local timeout      = args.timeout or 5
-    local settings     = args.settings or function() end
-    local width        = args.width or 63
-    local height       = args.heigth or 1
-    local ticks        = args.ticks or false
-    local ticks_size   = args.ticks_size or 7
-    local vertical     = args.vertical or false
-
-    alsabar.cmd           = args.cmd or "amixer"
-    alsabar.channel       = args.channel or alsabar.channel
-    alsabar.step          = args.step or alsabar.step
-    alsabar.colors        = args.colors or alsabar.colors
-    alsabar.notifications = args.notifications or alsabar.notifications
-    alsabar.followtag     = args.followtag or false
+    local args       = args or {}
+    local timeout    = args.timeout or 5
+    local settings   = args.settings or function() end
+    local width      = args.width or 63
+    local height     = args.height or 1
+    local ticks      = args.ticks or false
+    local ticks_size = args.ticks_size or 7
+    local vertical   = args.vertical or false
+
+    alsabar.cmd                 = args.cmd or "amixer"
+    alsabar.channel             = args.channel or "Master"
+    alsabar.togglechannel       = args.togglechannel
+    alsabar.colors              = args.colors or alsabar.colors
+    alsabar.followtag           = args.followtag or false
+    alsabar.notification_preset = args.notification_preset
+
+    if not alsabar.notification_preset then
+        alsabar.notification_preset      = {}
+        alsabar.notification_preset.font = "Monospace 10"
+    end
+
+    local format_cmd = string.format("%s get %s", alsabar.cmd, alsabar.channel)
+
+    if alsabar.togglechannel then
+        format_cmd = { awful.util.shell, "-c", string.format("%s get %s; %s get %s",
+        alsabar.cmd, alsabar.channel, alsabar.cmd, alsabar.togglechannel) }
+    end
 
     alsabar.bar = wibox.widget {
         forced_height    = height,
@@ -79,14 +77,12 @@ local function worker(args)
     alsabar.tooltip = awful.tooltip({ objects = { alsabar.bar } })
 
     function alsabar.update(callback)
-        helpers.async(alsabar.cmd, function(mixer)
+        helpers.async(format_cmd, function(mixer)
             local volu,mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
-            if (volu and tonumber(volu) ~= alsabar._current_level) or (mute and string.match(mute, "on") ~= alsabar._muted)
-            then
+            if (volu and tonumber(volu) ~= alsabar._current_level) or (mute and string.match(mute, "on") ~= alsabar._muted) then
                 alsabar._current_level = tonumber(volu) or alsabar._current_level
                 alsabar.bar:set_value(alsabar._current_level / 100)
-                if (not mute and tonumber(volu) == 0) or mute == "off"
-                then
+                if (not mute and tonumber(volu) == 0) or mute == "off" then
                     alsabar._muted = true
                     alsabar.tooltip:set_text ("[Muted]")
                     alsabar.bar.color = alsabar.colors.mute
@@ -109,15 +105,7 @@ local function worker(args)
 
     function alsabar.notify()
         alsabar.update(function()
-            local preset = {
-                title   = "",
-                text    = "",
-                timeout = 5,
-                screen  = alsabar.notifications.screen,
-                font    = string.format("%s %s", alsabar.notifications.font,
-                          alsabar.notifications.font_size),
-                fg      = alsabar.notifications.color
-            }
+            local preset = alsabar.notification_preset
 
             if alsabar._muted then
                 preset.title = string.format("%s - Muted", alsabar.channel)
@@ -131,19 +119,19 @@ local function worker(args)
 
             if alsabar.followtag then preset.screen = awful.screen.focused() end
 
-            if alsabar._notify then
-                alsabar._notify = naughty.notify ({
-                    replaces_id = alsabar._notify.id,
-                    preset      = preset,
-                })
+            if not alsabar.notification then
+                alsabar.notification = naughty.notify {
+                    preset  = preset,
+                    destroy = function() alsabar.notification = nil end
+                }
             else
-                alsabar._notify = naughty.notify ({ preset = preset })
+                naughty.replace_text(alsabar.notification, preset.title, preset.text)
+                naughty.reset_timeout(alsabar.notification, preset.timeout)
             end
         end)
     end
 
-    timer_id = string.format("alsabar-%s-%s", alsabar.cmd, alsabar.channel)
-    helpers.newtimer(timer_id, timeout, alsabar.update)
+    helpers.newtimer(string.format("alsabar-%s-%s", alsabar.cmd, alsabar.channel), timeout, alsabar.update)
 
     return alsabar
 end