You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.7 KiB
109 lines
3.7 KiB
local awful = require("awful")
|
|
local gears = require("gears")
|
|
local wibox = require("wibox")
|
|
local awmtk = require("awmtk")
|
|
|
|
return function(args)
|
|
local style = awmtk.style(awmtk.defaults, args.style or {},"volume_")
|
|
local device = args.device or "default"
|
|
local icons = args.icons or {
|
|
high = style.volume_icon_high,
|
|
medium = style.volume_icon_medium,
|
|
low = style.volume_icon_low,
|
|
muted = style.volume_icon_muted,
|
|
}
|
|
local controls = args.controls or {
|
|
"Master",
|
|
"Headphone"
|
|
}
|
|
local function get_icon(percent)
|
|
if percent >= 66 then
|
|
return icons.high
|
|
elseif percent >= 33 then
|
|
return icons.medium
|
|
elseif percent > 0 then
|
|
return icons.low
|
|
else
|
|
return icons.muted
|
|
end
|
|
end
|
|
local commands = args.commands or {
|
|
get_master = "amixer -D "..device.." sget Master",
|
|
set = "amixer -q -D "..device.." sset ",
|
|
get = "amixer -D "..device.." sget "
|
|
}
|
|
local list = {
|
|
layout = wibox.layout.fixed.vertical
|
|
}
|
|
for k,v in pairs(controls) do
|
|
local widget = wibox.widget({
|
|
{
|
|
widget = wibox.widget.textbox,
|
|
markup = v,
|
|
ellipsize = "end",
|
|
font = style.volume_font
|
|
},
|
|
{
|
|
widget = wibox.widget.slider,
|
|
id = "widget_slider",
|
|
handle_width = style.volume_handle_width or 6,
|
|
bar_height = style.volumer_bar_width or 5,
|
|
bar_color = style.volume_bar_color or "#55CC60",
|
|
bar_shape = style.bar_shape,
|
|
handler_shape = style.handle_shape,
|
|
value = 100,
|
|
},
|
|
layout = wibox.layout.fixed.vertical,
|
|
spacing = style.volume_container_spacing_horizontal,
|
|
forced_width = style.volume_slider_width or 180,
|
|
forced_height = style.volume_slider_height or 40
|
|
})
|
|
local slider = widget:get_children_by_id("widget_slider")[1]
|
|
awful.spawn.easy_async_with_shell(commands.get..v,function(out)
|
|
local volume_percent = out:match("%[(%d+)%%%]") or ""
|
|
volume_percent = tonumber(volume_percent)
|
|
if not volume_percent then
|
|
return
|
|
end
|
|
slider.value = volume_percent
|
|
end)
|
|
slider:connect_signal("widget::redraw_needed",function()
|
|
awful.spawn(commands.set..v.." "..slider.value.."%")
|
|
end)
|
|
table.insert(list,widget)
|
|
end
|
|
local tweaker_popup = awful.popup(style.container(list,{
|
|
visible = false,
|
|
ontop = true
|
|
}))
|
|
local icon = style.icon({
|
|
widget = wibox.widget.imagebox,
|
|
image = icons.muted,
|
|
id = "widget_icon"
|
|
},{},{
|
|
function()
|
|
if mouse.current_widget_geometry and (not tweaker_popup.visible) then
|
|
tweaker_popup:move_next_to(mouse.current_widget_geometry)
|
|
tweaker_popup.visible = true
|
|
else
|
|
tweaker_popup.visible = false
|
|
end
|
|
end
|
|
})
|
|
gears.timer {
|
|
autostart = true,
|
|
timeout = 0.5,
|
|
call_now = true,
|
|
callback = function()
|
|
awful.spawn.easy_async_with_shell(commands.get_master, function(out)
|
|
local volume_percent = out:match("%[(%d+)%%%]") or ""
|
|
volume_percent = tonumber(volume_percent)
|
|
if not volume_percent then
|
|
return
|
|
end
|
|
icon:get_children_by_id("widget_icon")[1].image = get_icon(volume_percent)
|
|
end)
|
|
end
|
|
}
|
|
return icon
|
|
end
|