dotfiles/dot_config/awesome/ui/popups/volume/init.lua
2024-04-14 18:41:15 -07:00

284 lines
6.3 KiB
Lua

local gears = require("gears")
local awful = require("awful")
local beautiful = require("beautiful")
local wibox = require("wibox")
local helpers = require("helpers")
local theme = beautiful.get()
local dpi = beautiful.xresources.apply_dpi
--- Volume OSD
--- ~~~~~~~~~~
local icon = wibox.widget({
{
id = "icon2",
image = theme.volume_on,
resize = true,
widget = wibox.widget.imagebox,
},
forced_height = dpi(150),
top = dpi(12),
bottom = dpi(12),
widget = wibox.container.margin,
})
local icon3 = icon.icon2
local osd_header = wibox.widget({
text = "Volume",
font = helpers.ui.set_font("Bold 12"),
halign = "left",
valign = "center",
widget = wibox.widget.textbox,
})
local osd_value = wibox.widget({
text = "0%",
font = helpers.ui.set_font("Bold 12"),
halign = "center",
valign = "center",
widget = wibox.widget.textbox,
})
local slider_osd = wibox.widget({
nil,
{
id = "vol_osd_slider",
bar_shape = gears.shape.rounded_rect,
bar_height = dpi(12),
bar_color = theme.color.surface0,
bar_active_color = theme.color.blue,
handle_color = theme.color.blue,
handle_shape = gears.shape.circle,
handle_width = dpi(24),
handle_border_color = "#00000012",
handle_border_width = dpi(1),
maximum = 100,
widget = wibox.widget.slider,
},
nil,
expand = "none",
layout = wibox.layout.align.vertical,
})
local vol_osd_slider = slider_osd.vol_osd_slider
vol_osd_slider:buttons(gears.table.join(
awful.button({}, 4, nil, function()
if vol_osd_slider:get_value() > 100 then
vol_osd_slider:set_value(100)
return
end
vol_osd_slider:set_value(vol_osd_slider:get_value() + 5)
end),
awful.button({}, 5, nil, function()
if vol_osd_slider:get_value() < 0 then
vol_osd_slider:set_value(0)
return
end
vol_osd_slider:set_value(vol_osd_slider:get_value() - 5)
end)
))
helpers.ui.add_hover_cursor(vol_osd_slider, "hand1")
local update_volume = function() -- Sets the Volume Correct
awful.spawn.easy_async_with_shell("pamixer --get-volume", function(stdout)
vol_osd_slider.value = tonumber(stdout:match("%d+"))
end)
end
awesome.connect_signal("widget::update_vol", function()
update_volume()
end)
update_volume()
vol_osd_slider:connect_signal("property::value", function(_, new_value)
local volume_level = vol_osd_slider:get_value()
awful.spawn("pamixer --set-volume " .. new_value, false)
-- Update textbox widget text
osd_value.text = volume_level .. "%"
-- Update the volume slider if values here change
awesome.emit_signal("widget::update_vol_pulse")
awesome.emit_signal("widget::update_vol_slider", volume_level)
if awful.screen.focused().show_vol_osd then
awesome.emit_signal("module::volume_osd:show", true)
end
end)
vol_osd_slider:connect_signal("button::press", function()
awful.screen.focused().show_vol_osd = true
end)
vol_osd_slider:connect_signal("mouse::enter", function()
awful.screen.focused().show_vol_osd = true
end)
-- The emit will come from the volume-slider
awesome.connect_signal("module::volume_osd", function(volume)
vol_osd_slider:set_value(volume)
end)
local volume_osd_height = dpi(250)
local volume_osd_width = dpi(250)
screen.connect_signal("request::desktop_decoration", function(s)
s = s or {}
s.show_vol_osd = false
s.volume_osd_overlay = awful.popup({
type = "notification",
screen = s,
shape = helpers.ui.rrect(15),
height = volume_osd_height,
width = volume_osd_width,
maximum_height = volume_osd_height,
maximum_width = volume_osd_width,
bg = theme.color.transparent,
offset = dpi(5),
border_width = dpi(3),
border_color = theme.color.surface0,
ontop = true,
visible = false,
preferred_anchors = "middle",
preferred_positions = { "left", "right", "top", "bottom" },
widget = {
{
{
layout = wibox.layout.fixed.vertical,
{
{
layout = wibox.layout.align.horizontal,
expand = "none",
nil,
icon,
nil,
},
{
layout = wibox.layout.fixed.vertical,
spacing = dpi(5),
{
layout = wibox.layout.align.horizontal,
expand = "none",
osd_header,
nil,
osd_value,
},
slider_osd,
},
spacing = dpi(10),
layout = wibox.layout.fixed.vertical,
},
},
left = dpi(24),
right = dpi(24),
widget = wibox.container.margin,
},
bg = theme.color.base,
widget = wibox.container.background,
},
})
-- Reset timer on mouse hover
s.volume_osd_overlay:connect_signal("mouse::enter", function()
awful.screen.focused().show_vol_osd = true
awesome.emit_signal("module::volume_osd:rerun")
end)
end)
local hide_osd = gears.timer({
timeout = 1,
autostart = true,
callback = function()
local focused = awful.screen.focused()
focused.volume_osd_overlay.visible = false
focused.show_vol_osd = false
end,
})
awesome.connect_signal("module::volume_osd:rerun", function()
if hide_osd.started then
hide_osd:again()
else
hide_osd:start()
end
end)
local placement_placer = function()
local focused = awful.screen.focused()
local volume_osd = focused.volume_osd_overlay
awful.placement.centered(volume_osd)
end
-- Get Vol
local function get_vol()
local script = "pamixer --get-volume"
local script2 = "pamixer --get-mute"
awful.spawn.easy_async_with_shell(script, function()
awful.spawn.easy_async_with_shell(script2, function(is_mute)
local muted
if is_mute:match("true") then
muted = true
else
muted = false
end
if muted then
vol_osd_slider.bar_active_color = theme.color.red
vol_osd_slider.handle_color = theme.color.red
icon3.image = theme.volume_off
else
vol_osd_slider.bar_active_color = theme.color.blue
vol_osd_slider.handle_color = theme.color.blue
icon3.image = theme.volume_on
end
end)
end)
end
awesome.connect_signal("module::volume_osd:show", function(bool)
placement_placer()
awful.screen.focused().volume_osd_overlay.visible = bool
if bool then
awesome.emit_signal("module::volume_osd:rerun")
awesome.emit_signal("module::brightness_osd:show", false)
else
if hide_osd.started then
hide_osd:stop()
end
end
end)
local volume = {}
volume.increase = function()
local script = "pamixer -i 5"
awful.spawn(script, false)
get_vol()
end
volume.decrease = function()
local script = "pamixer -d 5"
awful.spawn(script, false)
get_vol()
end
volume.mute = function()
local script = "pamixer -t"
awful.spawn(script, false)
get_vol()
end
return volume