local awful = require("awful") local spawn = require("awful.spawn") local watch = require("awful.widget.watch") local beautiful = require("beautiful") local wibox = require("wibox") local gears = require("gears") local naughty = require("naughty") local volume_widget = {} local get_volume_cmd = "bash -c 'wpctl get-volume @DEFAULT_AUDIO_SINK@'" local function worker(user_args) local volume_bar = wibox.widget { bar_shape = gears.shape.rounded_rect, bar_height = 4, bar_color = beautiful.fg_focus, handle_color = beautiful.fg_focus, handle_shape = gears.shape.circle, handle_border_width = 0, value = 0, forced_width = 50, widget = wibox.widget.slider, } volume_widget = wibox.widget { { layout = wibox.layout.fixed.horizontal, { text = "󰕾 ", widget = wibox.widget.textbox }, volume_bar, spacing = 4 }, widget = wibox.container.margin, left = 8, } local function percentage(value) return math.floor(value) end watch(get_volume_cmd, 1, function(widget, stdout) volume = stdout:match('0.%d+') widget.value = tonumber(volume) * 100 end, volume_bar) volume_bar:connect_signal("property::value", function(self) spawn.easy_async("bash -c 'wpctl set-volume @DEFAULT_AUDIO_SINK@ " .. self.value .. "%'", function() end) end) return volume_widget end return setmetatable(volume_widget, { __call = function(_, ...) return worker(...) end})