From 635faf4dc3377b4fc9dfcda2eafed57e785b2b3a Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Wed, 31 Jul 2019 20:38:19 +0200 Subject: widgets/volume: use asynchronous API --- widgets/volume.lua | 115 +++++++++++++++++++++++++++-------------------------- 1 file changed, 59 insertions(+), 56 deletions(-) diff --git a/widgets/volume.lua b/widgets/volume.lua index 18bc2e2..e73ad37 100644 --- a/widgets/volume.lua +++ b/widgets/volume.lua @@ -1,5 +1,3 @@ --- Inspired by https://awesome.naquadah.org/wiki/Farhavens_volume_widget - local awful = require('awful') local wibox = require('wibox') local beautiful = require('beautiful') @@ -7,74 +5,79 @@ local beautiful = require('beautiful') local cardid = nil local channel = 'Master' --- command must start with a space! -local function mixercommand(w, command) - local cmd = 'amixer' - if cardid then - cmd = cmd .. ' -c ' .. cardid - end - local fd = io.popen(cmd .. command) - local status = fd:read('*all') - fd:close() - if status == '' then - w.visible = false - else - local p = w:get_children_by_id('p')[1] - local volume = string.match(status, '(%d?%d?%d)%%') - status = string.match(status, '%[(o[^%]]*)%]') - p.value = tonumber(volume) - if string.find(status, 'on', 1, true) then - p.border_color = beautiful.fg_normal - else - p.border_color = beautiful.bg_normal - end - end +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 ' .. channel) + mixercommand(w, 'sget') end local function up(w) - mixercommand(w, ' sset ' .. channel .. ' 10%+') + mixercommand(w, 'sset', '10%+') end local function down(w) - mixercommand(w, ' sset ' .. channel .. ' 10%-') + mixercommand(w, 'sset', '10%-') end local function toggle(w) - mixercommand(w, ' sset ' .. channel .. ' toggle') + 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, - }, + 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, + 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, }, - 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 + 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 -- cgit v1.2.3