]> 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:

4ae12e563bf170fb9c38dab9f39e49e5e63ee139
[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 newtimer     = require("lain.helpers").newtimer
11
12 local awful        = require("awful")
13 local beautiful    = require("beautiful")
14 local naughty      = require("naughty")
15
16 local io           = { popen  = io.popen }
17 local math         = { modf   = math.modf }
18 local string       = { format = string.format,
19                        match  = string.match,
20                        rep    = string.rep }
21 local tonumber     = tonumber
22
23 local setmetatable = setmetatable
24
25 -- ALSA volume bar
26 -- lain.widgets.alsabar
27 local alsabar =
28 {
29   channel = "Master",
30   step    = "5%",
31
32   colors =
33   {
34      background = beautiful.bg_normal,
35      mute       = "#EB8F8F",
36      unmute     = "#A4CE8A"
37   },
38
39   terminal = terminal or "xterm",
40   mixer    = terminal .. " -e alsamixer",
41
42   notifications =
43   {
44      font      = beautiful.font:sub(beautiful.font:find(""), beautiful.font:find(" ")),
45      font_size = "11",
46      color     = beautiful.fg_normal,
47      bar_size  = 18
48   },
49
50   _current_level = 0,
51   _muted         = false
52 }
53
54 function alsabar.notify()
55   alsabar.update()
56
57     local preset =
58     {
59       title   = "",
60       text    = "",
61       timeout = 4,
62       font    = alsabar.notifications.font .. " " ..
63                 alsabar.notifications.font_size,
64       fg      = alsabar.notifications.color
65     }
66
67     if alsabar._muted
68   then
69         preset.title = alsabar.channel .. " - Muted"
70     else
71         preset.title = alsabar.channel .. " - " .. alsabar._current_level * 100 .. "%"
72     end
73
74   int = math.modf(alsabar._current_level * alsabar.notifications.bar_size)
75   preset.text = "["
76                 .. string.rep("|", int)
77                 .. string.rep(" ", alsabar.notifications.bar_size - int)
78                 .. "]"
79
80   if alsabar._notify ~= nil then
81         alsabar._notify = naughty.notify ({
82         replaces_id = alsabar._notify.id,
83         preset      = preset,
84         screen = client.focus and client.focus.screen or 1
85     })
86     else
87         alsabar._notify = naughty.notify ({
88         preset = preset,
89         screen = client.focus and client.focus.screen or 1
90     })
91     end
92 end
93
94 local function worker(args)
95     local args = args or {}
96     local timeout = args.timeout or 4
97     local settings = args.settings or function() end
98     local width = args.width or 63
99     local height = args.heigth or 1
100     local ticks = args.ticks or false
101     local ticks_size = args.ticks_size or 7
102     local vertical = args.vertical or false
103
104     alsabar.channel = args.channel or alsabar.channel
105     alsabar.step = args.step or alsabar.step
106     alsabar.colors = args.colors or alsabar.colors
107     alsabar.notifications = args.notifications or alsabar.notifications
108
109     alsabar.bar = awful.widget.progressbar()
110
111     alsabar.bar:set_background_color(alsabar.colors.background)
112     alsabar.bar:set_color(alsabar.colors.unmute)
113     alsabar.tooltip = awful.tooltip({ objects = { alsabar.bar } })
114     alsabar.bar:set_width(width)
115     alsabar.bar:set_height(height)
116     alsabar.bar:set_ticks(ticks)
117     alsabar.bar:set_ticks_size(ticks_size)
118     alsabar.bar:set_vertical(vertical)
119
120     function alsabar.update()
121         -- Get mixer control contents
122         local f = io.popen("amixer get " .. alsabar.channel)
123         local mixer = f:read("*all")
124         f:close()
125
126         -- Capture mixer control state:          [5%] ... ... [on]
127         local volu, mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
128
129         if volu == nil then
130             volu = 0
131             mute = "off"
132         end
133
134         alsabar._current_level = tonumber(volu) / 100
135         alsabar.bar:set_value(alsabar._current_level)
136
137         if not mute and tonumber(volu) == 0 or mute == "off"
138         then
139             alsabar._muted = true
140             alsabar.tooltip:set_text (" [Muted] ")
141             alsabar.bar:set_color(alsabar.colors.mute)
142         else
143             alsabar._muted = false
144             alsabar.tooltip:set_text(string.format(" %s:%s ", alsabar.channel, volu))
145             alsabar.bar:set_color(alsabar.colors.unmute)
146         end
147
148         volume_now = {}
149         volume_now.level = tonumber(volu)
150         volume_now.status = mute
151         settings()
152     end
153
154     newtimer("alsabar", timeout, alsabar.update)
155
156     alsabar.bar:buttons (awful.util.table.join (
157           awful.button ({}, 1, function()
158             awful.util.spawn(alsabar.mixer)
159           end),
160           awful.button ({}, 3, function()
161             awful.util.spawn(string.format("amixer set %s toggle", alsabar.channel))
162             alsabar.update()
163           end),
164           awful.button ({}, 4, function()
165             awful.util.spawn(string.format("amixer set %s %s+", alsabar.channel, alsabar.step))
166             alsabar.update()
167           end),
168           awful.button ({}, 5, function()
169             awful.util.spawn(string.format("amixer set %s %s-", alsabar.channel, alsabar.step))
170             alsabar.update()
171           end)
172     ))
173
174     return alsabar
175 end
176
177 return setmetatable(alsabar, { __call = function(_, ...) return worker(...) end })