madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

{alsa,pulse}bar: notification fixes and logic simplified
[etc/awesome.git] / widget / alsabar.lua
1
2 --[[
3                                                   
4      Licensed under GNU General Public License v2 
5       * (c) 2013, Luke Bonham                     
6       * (c) 2013, Rman                            
7                                                   
8 --]]
9
10 local helpers        = require("lain.helpers")
11 local awful          = require("awful")
12 local naughty        = require("naughty")
13 local wibox          = require("wibox")
14 local math           = { modf   = math.modf }
15 local string         = { format = string.format,
16                          match  = string.match,
17                          rep    = string.rep }
18 local type, tonumber = type, tonumber
19
20 -- ALSA volume bar
21 -- lain.widget.alsabar
22
23 local function factory(args)
24     local alsabar = {
25         colors = {
26             background = "#000000",
27             mute       = "#EB8F8F",
28             unmute     = "#A4CE8A"
29         },
30
31         _current_level = 0,
32         _mute          = "off"
33     }
34
35     local args       = args or {}
36     local timeout    = args.timeout or 5
37     local settings   = args.settings or function() end
38     local width      = args.width or 63
39     local height     = args.height or 1
40     local ticks      = args.ticks or false
41     local ticks_size = args.ticks_size or 7
42
43     alsabar.cmd                 = args.cmd or "amixer"
44     alsabar.channel             = args.channel or "Master"
45     alsabar.togglechannel       = args.togglechannel
46     alsabar.colors              = args.colors or alsabar.colors
47     alsabar.followtag           = args.followtag or false
48     alsabar.notification_preset = args.notification_preset
49
50     if not alsabar.notification_preset then
51         alsabar.notification_preset      = {}
52         alsabar.notification_preset.font = "Monospace 10"
53     end
54
55     local format_cmd = string.format("%s get %s", alsabar.cmd, alsabar.channel)
56
57     if alsabar.togglechannel then
58         format_cmd = { awful.util.shell, "-c", string.format("%s get %s; %s get %s",
59         alsabar.cmd, alsabar.channel, alsabar.cmd, alsabar.togglechannel) }
60     end
61
62     alsabar.bar = wibox.widget {
63         forced_height    = height,
64         forced_width     = width,
65         color            = alsabar.colors.unmute,
66         background_color = alsabar.colors.background,
67         margins          = 1,
68         paddings         = 1,
69         ticks            = ticks,
70         ticks_size       = ticks_size,
71         widget           = wibox.widget.progressbar
72     }
73
74     alsabar.tooltip = awful.tooltip({ objects = { alsabar.bar } })
75
76     function alsabar.update(callback)
77         helpers.async(format_cmd, function(mixer)
78             local volu, mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
79
80             if not volu or not mute then return end
81
82             if volu ~= alsabar._current_level or mute ~= alsabar._mute then
83                 alsabar._current_level = tonumber(volu)
84                 alsabar.bar:set_value(alsabar._current_level / 100)
85                 if alsabar._current_level == 0 or mute == "off" then
86                     alsabar._mute = mute
87                     alsabar.tooltip:set_text("[Muted]")
88                     alsabar.bar.color = alsabar.colors.mute
89                 else
90                     alsabar._mute = "on"
91                     alsabar.tooltip:set_text(string.format("%s: %s", alsabar.channel, volu))
92                     alsabar.bar.color = alsabar.colors.unmute
93                 end
94
95                 volume_now = {
96                     level  = alsabar._current_level,
97                     status = alsabar._mute
98                 }
99
100                 settings()
101
102                 if type(callback) == "function" then callback() end
103             end
104         end)
105     end
106
107     function alsabar.notify()
108         alsabar.update(function()
109             local preset = alsabar.notification_preset
110
111             if alsabar._mute == "on" then
112                 preset.title = string.format("%s - Muted", alsabar.channel)
113             else
114                 preset.title = string.format("%s - %s%%", alsabar.channel, alsabar._current_level)
115             end
116
117             int = math.modf((alsabar._current_level / 100) * awful.screen.focused().mywibox.height)
118             preset.text = string.format("[%s%s]", string.rep("|", int),
119                           string.rep(" ", awful.screen.focused().mywibox.height - int))
120
121             if alsabar.followtag then preset.screen = awful.screen.focused() end
122
123             if not alsabar.notification then
124                 alsabar.notification = naughty.notify {
125                     preset  = preset,
126                     destroy = function() alsabar.notification = nil end
127                 }
128             else
129                 naughty.replace_text(alsabar.notification, preset.title, preset.text)
130             end
131         end)
132     end
133
134     helpers.newtimer(string.format("alsabar-%s-%s", alsabar.cmd, alsabar.channel), timeout, alsabar.update)
135
136     return alsabar
137 end
138
139 return factory