2021-11-29 19:57:00 +11:00

181 lines
3.3 KiB
Lua

local wibox = require('wibox')
local gears = require('gears')
local awful = require('awful')
local beautiful = require('beautiful')
local spawn = awful.spawn
local dpi = beautiful.xresources.apply_dpi
local icons = require('theme.icons')
local clickable_container = require('widget.clickable-container')
local icon = wibox.widget {
layout = wibox.layout.align.vertical,
expand = 'none',
nil,
{
image = icons.volume,
resize = true,
widget = wibox.widget.imagebox
},
nil
}
local action_level = wibox.widget {
{
icon,
widget = clickable_container,
},
bg = beautiful.transparent,
shape = gears.shape.circle,
widget = wibox.container.background
}
local slider = wibox.widget {
nil,
{
id = 'volume_slider',
bar_shape = gears.shape.rounded_rect,
bar_height = dpi(2),
bar_color = '#ffffff20',
bar_active_color = '#f2f2f2EE',
handle_color = '#ffffff',
handle_shape = gears.shape.circle,
handle_width = dpi(15),
handle_border_color = '#00000012',
handle_border_width = dpi(1),
maximum = 100,
widget = wibox.widget.slider,
},
nil,
forced_height = dpi(24),
expand = 'none',
layout = wibox.layout.align.vertical
}
local volume_slider = slider.volume_slider
volume_slider:connect_signal(
'property::value',
function()
local volume_level = volume_slider:get_value()
spawn('amixer -D pulse sset Master ' ..
volume_level .. '%',
false
)
-- Update volume osd
awesome.emit_signal(
'module::volume_osd',
volume_level
)
end
)
volume_slider:buttons(
gears.table.join(
awful.button(
{},
4,
nil,
function()
if volume_slider:get_value() > 100 then
volume_slider:set_value(100)
return
end
volume_slider:set_value(volume_slider:get_value() + 5)
end
),
awful.button(
{},
5,
nil,
function()
if volume_slider:get_value() < 0 then
volume_slider:set_value(0)
return
end
volume_slider:set_value(volume_slider:get_value() - 5)
end
)
)
)
local update_slider = function()
awful.spawn.easy_async_with_shell(
[[bash -c "amixer -D pulse sget Master"]],
function(stdout)
local volume = string.match(stdout, '(%d?%d?%d)%%')
volume_slider:set_value(tonumber(volume))
end
)
end
-- Update on startup
update_slider()
local action_jump = function()
local sli_value = volume_slider:get_value()
local new_value = 0
if sli_value >= 0 and sli_value < 50 then
new_value = 50
elseif sli_value >= 50 and sli_value < 100 then
new_value = 100
else
new_value = 0
end
volume_slider:set_value(new_value)
end
action_level:buttons(
awful.util.table.join(
awful.button(
{},
1,
nil,
function()
action_jump()
end
)
)
)
-- The emit will come from the global keybind
awesome.connect_signal(
'widget::volume',
function()
update_slider()
end
)
-- The emit will come from the OSD
awesome.connect_signal(
'widget::volume:update',
function(value)
volume_slider:set_value(tonumber(value))
end
)
local volume_setting = wibox.widget {
{
{
action_level,
top = dpi(12),
bottom = dpi(12),
widget = wibox.container.margin
},
slider,
spacing = dpi(24),
layout = wibox.layout.fixed.horizontal
},
left = dpi(24),
right = dpi(24),
forced_height = dpi(48),
widget = wibox.container.margin
}
return volume_setting