dotfiles/awesome/components/volume-adjust.lua

110 lines
3.6 KiB
Lua
Raw Normal View History

2022-07-19 19:45:11 +02:00
-- ██╗ ██╗ ██████╗ ██╗ ██╗ ██╗███╗ ███╗███████╗
-- ██║ ██║██╔═══██╗██║ ██║ ██║████╗ ████║██╔════╝
-- ██║ ██║██║ ██║██║ ██║ ██║██╔████╔██║█████╗
-- ╚██╗ ██╔╝██║ ██║██║ ██║ ██║██║╚██╔╝██║██╔══╝
-- ╚████╔╝ ╚██████╔╝███████╗╚██████╔╝██║ ╚═╝ ██║███████╗
-- ╚═══╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝
-- ===================================================================
-- Initialization
-- ===================================================================
local wibox = require("wibox")
local awful = require("awful")
local gears = require("gears")
local beautiful = require("beautiful")
local dpi = beautiful.xresources.apply_dpi
local offsetx = dpi(56)
local offsety = dpi(300)
local screen = awful.screen.focused()
local icon_dir = gears.filesystem.get_configuration_dir() .. "/icons/volume/" .. beautiful.name .. "/"
-- ===================================================================
-- Appearance & Functionality
-- ===================================================================
local volume_icon = wibox.widget {
widget = wibox.widget.imagebox
}
-- create the volume_adjust component
local volume_adjust = wibox({
screen = awful.screen.focused(),
x = screen.geometry.width - offsetx,
y = (screen.geometry.height / 2) - (offsety / 2),
width = dpi(48),
height = offsety,
shape = gears.shape.rounded_rect,
visible = false,
ontop = true
})
local volume_bar = wibox.widget{
widget = wibox.widget.progressbar,
shape = gears.shape.rounded_bar,
color = "#efefef",
background_color = beautiful.bg_focus,
max_value = 100,
value = 0
}
volume_adjust:setup {
layout = wibox.layout.align.vertical,
{
wibox.container.margin(
volume_bar, dpi(14), dpi(20), dpi(20), dpi(20)
),
forced_height = offsety * 0.75,
direction = "east",
layout = wibox.container.rotate
},
wibox.container.margin(
volume_icon
)
}
-- create a 4 second timer to hide the volume adjust
-- component whenever the timer is started
local hide_volume_adjust = gears.timer {
timeout = 4,
autostart = true,
callback = function()
volume_adjust.visible = false
end
}
-- show volume-adjust when "volume_change" signal is emitted
awesome.connect_signal("volume_change",
function()
-- set new volume value
awful.spawn.easy_async_with_shell(
"amixer sget Master | grep 'Right:' | awk -F '[][]' '{print $2}'| sed 's/[^0-9]//g'",
function(stdout)
local volume_level = tonumber(stdout)
volume_bar.value = volume_level
if (volume_level > 40) then
volume_icon:set_image(icon_dir .. "volume.png")
elseif (volume_level > 0) then
volume_icon:set_image(icon_dir .. "volume-low.png")
else
volume_icon:set_image(icon_dir .. "volume-off.png")
end
end,
false
)
-- make volume_adjust component visible
if volume_adjust.visible then
hide_volume_adjust:again()
else
volume_adjust.visible = true
hide_volume_adjust:start()
end
end
)