local awful = require("awful") local gears = require("gears") local wibox = require("wibox") local beautiful = require("beautiful") local menubar = require("menubar") local pavolctld = require("lib.pavolctld") -- return table local widget = {} widget.textbox = wibox.widget.textbox() widget.dbmeter = wibox.widget.textbox() widget.vslider = wibox.widget { { { { value = 50, max_value = 150, shape = beautiful.slider_bar_shape, bg = beautiful.slider_handle_color, widget = wibox.widget.progressbar, }, height = 5, widget = wibox.container.constraint }, halign = "center", widget = wibox.container.place, }, { bar_height = 0, widget = wibox.widget.slider, }, layout = wibox.layout.stack, } widget.defsink = wibox.widget.textbox() widget.tooltip = awful.tooltip { objects = {widget.textbox}, delay_show = 1 } -- widget callbacks pavolctld.set_volume_change_callback(function() widget.vslider.value = pavolctld.sinks.default.vol widget.textbox:set_text(pavolctld.sinks.default.vol) widget.dbmeter:set_text(pavolctld.sinks.default.db .. " dB") end) pavolctld.set_sink_change_callback(function() widget.tooltip:set_text(pavolctld.sinks.default.desc) end) pavolctld.set_default_sink_change_callback(function() widget.vslider.value = pavolctld.sinks.default.vol widget.textbox:set_text(pavolctld.sinks.default.vol) widget.dbmeter:set_text(pavolctld.sinks.default.db .. " dB") widget.tooltip:set_text(pavolctld.sinks.default.desc) widget.defsink:set_text(pavolctld.sinks.default.desc) end) -- slider widget.vslider.maximum = 150 -- max in pavolctld widget.vslider:buttons(volume_buttons) widget.vslider:connect_signal("property::value", function() if pavolctld.sinks.default.vol == widget.vslider.value then return end -- help prevent overloading daemon pavolctld.volume_set(widget.vslider.value) end) -- scrollbox for default sink select local default_sink_scrollbox = wibox.widget { widget.defsink, step_function = wibox.container.scroll.step_functions.linear_increase, speed = 25, extra_space = 25, -- space between repetition pause = true, -- start paused widget = wibox.container.scroll.horizontal, } -- scroll when hovering default_sink_scrollbox:connect_signal("mouse::enter", function() default_sink_scrollbox:continue() end) default_sink_scrollbox:connect_signal("mouse::leave", function() default_sink_scrollbox:pause() default_sink_scrollbox:reset_scrolling() end) -- widget dropdown local volume_dropdown = wibox.widget { { { { default_sink_scrollbox, margins = 5, widget = wibox.container.margin, }, bg = "#333333", widget = wibox.container.background, }, margins = beautiful.border_width, color = "#222222", widget = wibox.container.margin, }, { { text = "M", widget = wibox.widget.textbox, }, { widget.vslider, left = 10, right = 10, widget = wibox.container.margin, layout = wibox.layout.stack, }, { widget.dbmeter, forced_width = 125, halign = "right", widget = wibox.container.place, }, layout = wibox.layout.align.horizontal, }, forced_num_cols = 1, forced_num_rows = 2, expand = true, forced_width = 500, forced_height = 100, layout = wibox.layout.grid, } widget.dropdown = awful.popup { widget = { volume_dropdown, margins = 15, widget = wibox.container.margin, }, border_color = beautiful.border_focus, border_width = beautiful.border_width, shape = gears.shape.rounded_rect, ontop = true, hide_on_right_click = true, preferred_positions = "bottom", preferred_anchors = 'back', visible = false, offset = { y = 5 }, } widget.dropdown:bind_to_widget(widget.textbox) return widget