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.
146 lines
5.4 KiB
146 lines
5.4 KiB
-- This file is part of Reno desktop.
|
|
--
|
|
-- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
--
|
|
-- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
--
|
|
-- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see <https://www.gnu.org/licenses/>.
|
|
-- Pulseaudio per-client volume setting
|
|
local awful = require("awful")
|
|
local gears = require("gears")
|
|
local wibox = require("wibox")
|
|
local awmtk2 = require("awmtk2")
|
|
local beautiful = require("beautiful")
|
|
local ask = require("asckey")
|
|
|
|
local test_pactl = os.execute("pactl --version")
|
|
local pactl_found = test_pactl
|
|
if _VERSION:match("5.1") then
|
|
pactl_found = (test_pactl == 0)
|
|
end
|
|
local test_amixer = os.execute("amixer --version")
|
|
local amixer_found = test_amixer
|
|
if _VERSION:match("5.1") then
|
|
amixer_found = (test_amixer == 0)
|
|
end
|
|
if (not (amixer_found or pactl_found)) then
|
|
return
|
|
end
|
|
|
|
local try_launch = "pavucontrol"
|
|
local function get_icon(percent)
|
|
if percent >= 66 then
|
|
return beautiful["volume-high-symbolic"]
|
|
elseif percent >= 33 then
|
|
return beautiful["volume-medium-symbolic"]
|
|
elseif percent > 0 then
|
|
return beautiful["volume-low-symbolic"]
|
|
else
|
|
return beautiful["volume-muted-symbolic"]
|
|
end
|
|
end
|
|
|
|
return function(args)
|
|
local style = awmtk2.create_style("volume",
|
|
awmtk2.generic.oneline_widget, args.style,args.vertical)
|
|
local templates = awmtk2.create_template_lib("volume",awmtk2.templates,args.templates)
|
|
local t = awmtk2.build_templates(templates,style,args.vertical)
|
|
local slider_part = wibox.widget(
|
|
t.container({
|
|
t.slider({
|
|
minimum = 0,
|
|
maximum = 100,
|
|
id = "volume",
|
|
value = -1
|
|
}),
|
|
layout = (args.vertical and wibox.layout.fixed.vertical) or
|
|
wibox.layout.fixed.horizontal
|
|
},{
|
|
visible = false,
|
|
id = "slidercontainer"
|
|
})
|
|
)
|
|
local widget = wibox.widget({
|
|
t.button(t.icon({
|
|
image = get_icon(0),
|
|
id = "volume_icon",
|
|
resize = true,
|
|
})),
|
|
id = "volume_widget_root",
|
|
layout = (args.vertical and wibox.layout.fixed.vertical) or
|
|
wibox.layout.fixed.horizontal
|
|
})
|
|
local icon = widget:get_children_by_id("volume_icon")[1]
|
|
local slider = slider_part:get_children_by_id("volume")[1]
|
|
local container = slider_part:get_children_by_id("slidercontainer")[1]
|
|
-- Alsa master handle
|
|
args.device = args.device or "default"
|
|
local update_callback = function()
|
|
awful.spawn.easy_async_with_shell("amixer -D "..args.device.." sget Master",function(stdout)
|
|
local volume_percent = stdout:match("%[(%d+)%%%]")
|
|
volume_percent = tonumber(volume_percent)
|
|
if not volume_percent then
|
|
return
|
|
end
|
|
slider.value = volume_percent
|
|
if stdout:match("%[off%]") then
|
|
volume_percent = 0
|
|
end
|
|
icon.image = get_icon(volume_percent)
|
|
end)
|
|
end
|
|
local update_timer = gears.timer {
|
|
autostart = true,
|
|
timeout = 0.5,
|
|
call_now = true,
|
|
callback = update_callback
|
|
}
|
|
slider:connect_signal("widget::redraw_needed",function()
|
|
awful.spawn("amixer -D "..args.device.." sset Master "..slider.value.."%")
|
|
update_timer:again()
|
|
icon.image = get_icon(slider.value)
|
|
end)
|
|
icon:connect_signal("button::press",function(_,_,_,button)
|
|
if button == 1 then
|
|
container.visible = not container.visible
|
|
local children = widget:get_children_by_id("volume_widget_root")[1]
|
|
if container.visible then
|
|
children:add(slider_part)
|
|
else
|
|
children:remove_widgets(slider_part)
|
|
end
|
|
end
|
|
if button == 3 then
|
|
awful.spawn.with_shell(args.mixer or try_launch)
|
|
end
|
|
if button == 4 then
|
|
if (slider.value < 96) then
|
|
slider.value = slider.value + 5
|
|
else
|
|
slider.value = 100
|
|
end
|
|
slider:emit_signal("widget::redraw_needed")
|
|
end
|
|
if button == 5 then
|
|
if (slider.value > 4) then
|
|
slider.value = slider.value - 5
|
|
else
|
|
slider.value = 0
|
|
end
|
|
slider:emit_signal("widget::redraw_needed")
|
|
end
|
|
end)
|
|
root.keys(gears.table.join(
|
|
root.keys(),
|
|
ask.k(":root.volume_up",function()
|
|
awful.spawn("amixer -D "..args.device.." sset Master 5%+")
|
|
end,{description = "increase master volume",group = "widgets"}),
|
|
ask.k(":root.volume_down",function()
|
|
awful.spawn("amixer -D "..args.device.." sset Master 5%-")
|
|
end,{description = "decrease master volume",group = "widgets"}),
|
|
ask.k(":root.volume_mute",function()
|
|
awful.spawn("amixer -D "..args.device.." sset Master toggle")
|
|
end,{description = "mute master volume", group = "widgets"})
|
|
))
|
|
return widget
|
|
end
|