summaryrefslogtreecommitdiff
path: root/widgets
diff options
context:
space:
mode:
authorTim Keller <tjkeller.xyz>2025-04-16 22:53:53 -0500
committerTim Keller <tjkeller.xyz>2025-04-16 22:53:53 -0500
commitb0d338292565fe3fe932215fd628a7482a29e8f0 (patch)
tree74ac11512ae036b27e4c47973d83c8cc9b1cbd60 /widgets
parent0db16d56d1a167be71b1b464af8f4fef3d052054 (diff)
downloadawesome-b0d338292565fe3fe932215fd628a7482a29e8f0.tar.xz
awesome-b0d338292565fe3fe932215fd628a7482a29e8f0.zip
volume dropdown overhual functionality make it almost good
Diffstat (limited to 'widgets')
-rw-r--r--widgets/pavolctld.lua133
-rw-r--r--widgets/volumedropdown.lua147
2 files changed, 156 insertions, 124 deletions
diff --git a/widgets/pavolctld.lua b/widgets/pavolctld.lua
index fb3c5e5..1ef523e 100644
--- a/widgets/pavolctld.lua
+++ b/widgets/pavolctld.lua
@@ -1,48 +1,24 @@
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")
-local naughty = require("naughty")
+local volume_dropdown = require("widgets.volumedropdown")
-- ensure pavolctld loaded
if not pavolctld then return wibox.widget.textbox("err") end
-- 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.dropdown = volume_dropdown
-- 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")
+ widget.dropdown.set_volume(pavolctld.sinks.default.vol)
+ widget.dropdown.dbmeter:set_text(pavolctld.sinks.default.db .. " dB")
+ widget.dropdown.muted.checked = pavolctld.sinks.default.mute
end)
pavolctld.set_sink_change_callback(function()
@@ -50,102 +26,11 @@ pavolctld.set_sink_change_callback(function()
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()
+ widget.dropdown.set_volume(pavolctld.sinks.default.vol)
+ widget.dropdown.dbmeter:set_text(pavolctld.sinks.default.db .. " dB")
+ widget.dropdown.defsink:set_text(pavolctld.sinks.default.desc)
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
diff --git a/widgets/volumedropdown.lua b/widgets/volumedropdown.lua
new file mode 100644
index 0000000..c2e3fbc
--- /dev/null
+++ b/widgets/volumedropdown.lua
@@ -0,0 +1,147 @@
+local awful = require("awful")
+local wibox = require("wibox")
+local beautiful = require("beautiful")
+local apply_dpi = beautiful.xresources.apply_dpi
+local pavolctld = require("lib.pavolctld")
+
+-- return table
+local widget = {}
+
+widget.dbmeter = wibox.widget.textbox()
+local slider = wibox.widget {
+ bar_height = 0,
+ widget = wibox.widget.slider,
+ maximum = pavolctld.max_volume,
+}
+local progressbar = wibox.widget {
+ max_value = pavolctld.max_volume,
+ shape = beautiful.slider_bar_shape,
+ bg = beautiful.slider_handle_color,
+ widget = wibox.widget.progressbar,
+}
+widget.vslider = wibox.widget {
+ {
+ {
+ progressbar,
+ height = apply_dpi(3),
+ widget = wibox.container.constraint
+ },
+ halign = "center",
+ widget = wibox.container.place,
+ },
+ slider,
+ layout = wibox.layout.stack,
+}
+
+-- scrollbox for default sink select
+widget.defsink = wibox.widget.textbox()
+local default_sink_scrollbox = wibox.widget {
+ widget.defsink,
+ step_function = wibox.container.scroll.step_functions.linear_increase,
+ speed = apply_dpi(15),
+ extra_space = apply_dpi(25), -- space between repetition
+ pause = true, -- start paused
+ widget = wibox.container.scroll.horizontal,
+}
+
+widget.muted = wibox.widget {
+ color = "#222222",
+ check_color = beautiful.border_focus,
+ widget = wibox.widget.checkbox,
+}
+
+-- widget dropdown
+local volume_dropdown = wibox.widget {
+ {
+ {
+ {
+ default_sink_scrollbox,
+ margins = beautiful.margin_topbottom,
+ widget = wibox.container.margin,
+ },
+ bg = "#333333",
+ widget = wibox.container.background,
+ },
+ margins = beautiful.border_width,
+ color = "#222222",
+ widget = wibox.container.margin,
+ },
+ {
+ {
+ {
+ text = "Mute:",
+ widget = wibox.widget.textbox,
+ },
+ left = apply_dpi(10),
+ right = apply_dpi(5),
+ widget = wibox.container.margin,
+ },
+ {
+ widget.muted,
+ fill_vertical = true,
+ widget = wibox.container.place,
+ },
+ forced_width = apply_dpi(80),
+ layout = wibox.layout.align.horizontal,
+ },
+ widget.vslider,
+ {
+ widget.dbmeter,
+ forced_width = apply_dpi(80),
+ halign = "right",
+ widget = wibox.container.place,
+ },
+ forced_num_cols = 2,
+ forced_num_rows = 2,
+ homogeneous = false,
+ expand = true,
+ forced_width = apply_dpi(300),
+ forced_height = apply_dpi(60),
+ layout = wibox.layout.grid,
+}
+widget.dropdown = awful.popup {
+ widget = {
+ volume_dropdown,
+ left = beautiful.margin_leftright,
+ right = beautiful.margin_leftright,
+ top = beautiful.margin_topbottom,
+ bottom = beautiful.margin_topbottom,
+ widget = wibox.container.margin,
+ },
+ border_color = beautiful.border_normal,
+ border_width = beautiful.border_width,
+ ontop = true,
+ hide_on_right_click = true,
+ preferred_positions = "bottom",
+ preferred_anchors = "back",
+ visible = false,
+}
+
+-- slider
+slider:buttons(volume_buttons)
+slider:connect_signal("property::value", function()
+ if pavolctld.sinks.default.vol == slider.value then return end
+ pavolctld.volume_set(slider.value)
+end)
+
+function widget.set_volume(vol)
+ progressbar:set_value(vol)
+ if vol == slider.value then return end
+ slider.value = vol
+ slider:emit_signal("widget::redraw_needed")
+end
+
+-- 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)
+
+-- mute button
+widget.muted:connect_signal("button::press", pavolctld.mute_toggle)
+
+return widget