-- 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 . -- Pulseaudio per-client volume setting local awful = require("awful") local gears = require("gears") local wibox = require("wibox") local awmtk2 = require("awmtk2") local fastyaml = require("parsers").fast_split_yaml local beautiful = require("beautiful") local ask = require("asckey") local pactl_data = {} 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 = [[which pavucontrol && pavucontrol || which pulsemixer && ]]..global.terminal..[[ -e pulsemixer || which alsamixer && ]]..global.terminal..[[ -e alsamixer ]] 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) local templates = awmtk2.create_template_lib("volume",awmtk2.templates,args.templates) local t = awmtk2.build_templates(templates,style) local widget = wibox.widget({ t.button({ image = get_icon(0), id = "volume_icon", resize = true, widget = wibox.widget.imagebox }), t.container({ t.slider({ minimum = 0, maximum = 100, id = "volume", value = -1 }), layout = wibox.layout.fixed.horizontal },{ visible = false, id = "slidercontainer" }), layout = wibox.layout.fixed.horizontal }) local icon = widget:get_children_by_id("volume_icon")[1] local slider = widget:get_children_by_id("volume")[1] local container = widget:get_children_by_id("slidercontainer")[1] -- Alsa master handle args.device = args.device or "default" gears.timer { autostart = true, timeout = 0.5, call_now = true, 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 icon.image = get_icon(volume_percent) end) end } slider:connect_signal("widget::redraw_needed",function() awful.spawn("amixer -D "..args.device.." sset Master "..slider.value.."%") icon.image = get_icon(slider.value) end) icon:connect_signal("button::press",function(self,lx,ly,button) if button == 1 then container.visible = not container.visible end if button == 2 then awful.spawn.with_shell(args.mixer or try_launch) end end) return widget end