local awful = require('awful') local wibox = require('wibox') local beautiful = require('beautiful') local cardid = nil local channel = 'Master' local function mixercommand(w, command, arg) local cmd = {'amixer'} if cardid then table.insert(cmd, '-c') table.insert(cmd, cardid) end table.insert(cmd, command) table.insert(cmd, channel) if arg then table.insert(cmd, arg) end awful.spawn.easy_async(cmd, function(out) if out == '' then w.visible = false else local p = w:get_children_by_id('p')[1] local volume = string.match(out, '(%d?%d?%d)%%') local status = string.match(out, '%[(o[^%]]*)%]') p.value = tonumber(volume) if status == 'on' then p.border_color = beautiful.fg_normal else p.border_color = beautiful.bg_normal end end end) end local function update(w) mixercommand(w, 'sget') end local function up(w) mixercommand(w, 'sset', '10%+') end local function down(w) mixercommand(w, 'sset', '10%-') end local function toggle(w) mixercommand(w, 'sset', 'toggle') end local function new(args) local args = args or {} local w = wibox.widget{ { image = beautiful.widget_vol, widget = wibox.widget.imagebox, }, { { id = 'p', forced_height = args.width or 8, forced_width = args.height or beautiful.wibox_height or 16, border_width = 1, color = beautiful.fg_normal, background_color = beautiful.bg_normal, value = 10, max_value = 100, widget = wibox.widget.progressbar, }, direction = 'east', layout = wibox.container.rotate, }, layout = wibox.layout.fixed.horizontal, } w:buttons(awful.util.table.join( awful.button({}, 1, nil, function () toggle(w) end), awful.button({}, 4, nil, function () up(w) end), awful.button({}, 5, nil, function () down(w) end) )) update(w) return w end return new