284 lines
6.3 KiB
Lua
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
|