73 lines
2.1 KiB
Lua
73 lines
2.1 KiB
Lua
local awful = require("awful")
|
|
local gears = require("gears")
|
|
local wibox = require("wibox")
|
|
local beautiful = require("beautiful")
|
|
local xresources = require("beautiful.xresources")
|
|
local dpi = xresources.apply_dpi
|
|
|
|
-- Set colors
|
|
local active_color = beautiful.volume_bar_active_color or "#5AA3CC"
|
|
local muted_color = beautiful.volume_bar_muted_color or "#666666"
|
|
local active_background_color = beautiful.volume_bar_active_background_color or "#222222"
|
|
local muted_background_color = beautiful.volume_bar_muted_background_color or "#222222"
|
|
|
|
local volume_bar = wibox.widget{
|
|
max_value = 100,
|
|
value = 50,
|
|
forced_height = dpi(10),
|
|
margins = {
|
|
top = dpi(8),
|
|
bottom = dpi(8),
|
|
},
|
|
forced_width = dpi(200),
|
|
shape = gears.shape.rounded_bar,
|
|
bar_shape = gears.shape.rounded_bar,
|
|
color = active_color,
|
|
background_color = active_background_color,
|
|
border_width = 0,
|
|
border_color = beautiful.border_color,
|
|
widget = wibox.widget.progressbar,
|
|
}
|
|
|
|
local function update_widget()
|
|
awful.spawn.easy_async({"sh", "-c", "pactl list sinks"},
|
|
function(stdout)
|
|
local volume = stdout:match('(%d+)%% /')
|
|
local muted = stdout:match('Mute:(%s+)[yes]')
|
|
local fill_color
|
|
local bg_color
|
|
if muted ~= nil then
|
|
fill_color = muted_color
|
|
bg_color = muted_background_color
|
|
else
|
|
fill_color = active_color
|
|
bg_color = active_background_color
|
|
end
|
|
volume_bar.value = tonumber(volume)
|
|
volume_bar.color = fill_color
|
|
volume_bar.background_color = bg_color
|
|
end
|
|
)
|
|
end
|
|
|
|
update_widget()
|
|
|
|
-- Sleeps until pactl detects an event (volume up/down/toggle mute)
|
|
local volume_script = [[
|
|
bash -c '
|
|
pactl subscribe 2> /dev/null | grep --line-buffered "sink #0"
|
|
']]
|
|
|
|
|
|
-- Kill old pactl subscribe process
|
|
awful.spawn.easy_async_with_shell("ps x | grep \"pactl subscribe\" | grep -v grep | awk '{print $1}' | xargs kill", function ()
|
|
-- Update volume with each line printed
|
|
awful.spawn.with_line_callback(volume_script, {
|
|
stdout = function(line)
|
|
update_widget()
|
|
end
|
|
})
|
|
end)
|
|
|
|
return volume_bar
|