]> git.madduck.net Git - etc/awesome.git/blob - widgets/alsabar.lua

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:

alsabar: forgot callback
[etc/awesome.git] / widgets / 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         = type
19 local tonumber     = tonumber
20 local setmetatable = setmetatable
21
22 -- ALSA volume bar
23 -- lain.widgets.alsabar
24 local alsabar = {
25     colors = {
26         background = "#000000",
27         mute       = "#EB8F8F",
28         unmute     = "#A4CE8A"
29     },
30
31     _current_level = 0,
32     _muted         = false
33 }
34
35 local function worker(args)
36     local args       = args or {}
37     local timeout    = args.timeout or 5
38     local settings   = args.settings or function() end
39     local width      = args.width or 63
40     local height     = args.height or 1
41     local ticks      = args.ticks or false
42     local ticks_size = args.ticks_size or 7
43     local vertical   = args.vertical or false
44
45     alsabar.cmd                 = args.cmd or "amixer"
46     alsabar.channel             = args.channel or "Master"
47     alsabar.colors              = args.colors or alsabar.colors
48     alsabar.followtag           = args.followtag or false
49     alsabar._notify             = args.notify or "on"
50     alsabar.notification_preset = args.notification_preset
51
52     if not alsabar.notification_preset then
53         alsabar.notification_preset      = naughty.config.defaults
54         alsabar.notification_preset.font = "Monospace 11"
55     end
56
57     alsabar.bar = wibox.widget {
58         forced_height    = height,
59         forced_width     = width,
60         color            = alsabar.colors.unmute,
61         background_color = alsabar.colors.background,
62         margins          = 1,
63         paddings         = 1,
64         ticks            = ticks,
65         ticks_size       = ticks_size,
66         widget           = wibox.widget.progressbar,
67         layout           = vertical and wibox.container.rotate
68     }
69
70     alsabar.tooltip = awful.tooltip({ objects = { alsabar.bar } })
71
72     function alsabar.update(callback)
73         helpers.async(alsabar.cmd, function(mixer)
74             local volu,mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
75             if (volu and tonumber(volu) ~= alsabar._current_level) or (mute and string.match(mute, "on") ~= alsabar._muted) then
76                 alsabar._current_level = tonumber(volu) or alsabar._current_level
77                 alsabar.bar:set_value(alsabar._current_level / 100)
78                 if (not mute and tonumber(volu) == 0) or mute == "off" then
79                     alsabar._muted = true
80                     alsabar.tooltip:set_text ("[Muted]")
81                     alsabar.bar.color = alsabar.colors.mute
82                 else
83                     alsabar._muted = false
84                     alsabar.tooltip:set_text(string.format("%s: %s", alsabar.channel, volu))
85                     alsabar.bar.color = alsabar.colors.unmute
86                 end
87
88                 volume_now = {}
89                 volume_now.level = tonumber(volu)
90                 volume_now.status = mute
91
92                 settings()
93
94                 if type(callback) == "function" then callback() end
95             end
96         end)
97     end
98
99     function alsabar.notify()
100         alsabar.update(function()
101             local preset = alsabar.notification_preset
102
103             if alsabar._muted then
104                 preset.title = string.format("%s - Muted", alsabar.channel)
105             else
106                 preset.title = string.format("%s - %s%%", alsabar.channel, alsabar._current_level)
107             end
108
109             int = math.modf((alsabar._current_level / 100) * awful.screen.focused().mywibox.height)
110             preset.text = string.format("[%s%s]", string.rep("|", int),
111                           string.rep(" ", awful.screen.focused().mywibox.height - int))
112
113             if alsabar.followtag then preset.screen = awful.screen.focused() end
114
115             alsabar.id = naughty.notify ({
116                 replaces_id = alsabar.id,
117                 preset      = preset
118             }).id
119         end)
120     end
121
122     timer_id = string.format("alsabar-%s-%s", alsabar.cmd, alsabar.channel)
123
124     helpers.newtimer(timer_id, timeout, alsabar.update)
125
126     return alsabar
127 end
128
129 return setmetatable(alsabar, { __call = function(_, ...) return worker(...) end })