diff --git a/modules/volume/init.lua b/modules/volume/init.lua index 018abc2..0ebab5b 100644 --- a/modules/volume/init.lua +++ b/modules/volume/init.lua @@ -1,5 +1,6 @@ local volume = require("modules.volume.util") local widget = require("modules.volume.widget") +local popup = require("modules.volume.popup") return { widget = require("modules.volume.widget").widget, @@ -10,5 +11,9 @@ return { volume.commands:unmute() -- Update volume widget at start volume.commands:get(widget.update) + end, + + for_each_screen = function (s) + popup(s) end } diff --git a/modules/volume/keybinds.lua b/modules/volume/keybinds.lua index 630aa43..3499a53 100755 --- a/modules/volume/keybinds.lua +++ b/modules/volume/keybinds.lua @@ -4,6 +4,7 @@ return gears.table.join( awful.key( {}, "XF86AudioRaiseVolume", function () volume.volume_up() + awesome.emit_signal("module::volume_popup:show") end, { description = "Volume up", @@ -14,6 +15,7 @@ return gears.table.join( awful.key( {}, "XF86AudioLowerVolume", function () volume.volume_down() + awesome.emit_signal("module::volume_popup:show") end, { description = "Volume down", @@ -24,6 +26,7 @@ return gears.table.join( awful.key( {}, "XF86AudioMute", function () volume.toggle_mute() + awesome.emit_signal("module::volume_popup:show") end, { description = "Mute", diff --git a/modules/volume/popup.lua b/modules/volume/popup.lua new file mode 100644 index 0000000..cdd1c88 --- /dev/null +++ b/modules/volume/popup.lua @@ -0,0 +1,208 @@ +local volume = req_rel(..., "util") + +return function(s) + local widget = wibox.widget { + { + { + { + { -- Icon and margins + nil, + { + nil, + { + id = "icon", + forced_height = beautiful.dpi(100), + image = beautiful.icons.volume.high, + widget = wibox.widget.imagebox + }, + nil, + expand = "none", + id = "icon_margin2", + layout = wibox.layout.align.vertical + }, + nil, + id = "icon_margin1", + expand = "none", + layout = wibox.layout.align.horizontal + }, + { -- Text and percentage + { + id = "label", + text = "Volume", + align = "left", + valign = "center", + widget = wibox.widget.textbox + }, + nil, + { + id = "value", + text = "0%", + align = "center", + valign = "center", + widget = wibox.widget.textbox + }, + id = "label_value_layout", + forced_height = beautiful.dpi(48), + layout = wibox.layout.align.horizontal, + }, + { -- Progress bar + { + id = "volume_bar", + shape = gears.shape.rounded_bar, + forced_height = beautiful.dpi(10), + background_color = "#AAAAAA88", + bar_color = "#ffffff", + color = "#ffffff", + bar_shape = gears.shape.rounded_bar, + max_value = 100, + widget = wibox.widget.progressbar + }, + id = "bar_layout", + forced_height = beautiful.dpi(24), + widget = wibox.container.place + }, + id = "icon_bar_layout", + spacing = beautiful.dpi(0), + layout = wibox.layout.align.vertical + }, + id = "popup_layout", + layout = wibox.layout.align.vertical, + }, + id = "container", + left = beautiful.dpi(20), + right = beautiful.dpi(20), + top = beautiful.dpi(10), + bottom = beautiful.dpi(10), + widget = wibox.container.margin + }, + bg ="#000000AA", + widget = wibox.container.background, + ontop = true, + visible = true, + type = "notification", + forced_height = beautiful.dpi(180), + forced_width = beautiful.dpi(300), + offset = beautiful.dpi(5), + } + + local popup_container = awful.popup { + widget = wibox.container.background, + ontop = true, + bg = "#00000000", + stretch = false, + visible = false, + screen = s, + + placement = function(c) + awful.placement.centered( + c, + { + honor_workarea = true, + margins = { + top = beautiful.dpi(200) + } + } + ) + end, + + -- Only set corner radius here. + shape = function(cr, width, height) + gears.shape.rounded_rect( + cr, + width, + height, + beautiful.dpi(20) + ) + end + } + + popup_container:setup { + widget, + layout = wibox.layout.fixed.horizontal + } + + + local function update_popup() + volume.commands:get(function(status) + + awesome.emit_signal("widget::volume") + widget. + container. + popup_layout. + icon_bar_layout. + label_value_layout. + value:set_text(status.value .. "%") + + awesome.emit_signal( + "widget::volume:update", + status.value + ) + + local icon + if status.mute then + icon = beautiful.icons.volume.mute + elseif status.value < 1 then + icon = beautiful.icons.volume.off + elseif status.value >= 1 and status.value < 34 then + icon = beautiful.icons.volume.low + elseif status.value >= 34 and status.value < 67 then + icon = beautiful.icons.volume.medium + elseif status.value >= 67 then + icon = beautiful.icons.volume.high + end + + widget. + container. + popup_layout. + icon_bar_layout. + icon_margin1. + icon_margin2. + icon:set_image(icon) + end) + end + + local update_slider = function() + volume.commands:get(function(status) + widget. + container. + popup_layout. + icon_bar_layout. + bar_layout. + volume_bar:set_value(status.value) + update_popup() + end) + end + + update_slider() + + local hide_popup_timer = gears.timer { + timeout = 1, + autostart = true, + callback = function() + popup_container.visible = false + end + } + + awesome.connect_signal("module::volume_popup:show", + function() + update_slider() + if s == mouse.screen then + popup_container.visible = true + end + + if hide_popup_timer.started then + hide_popup_timer:again() + else + hide_popup_timer:start() + end + end + ) + + popup_container:connect_signal("button::press", + function() + popup_container.visible = false + hide_popup_timer:stop() + end + ) +end + diff --git a/modules/volume/widget.lua b/modules/volume/widget.lua index 5a0f468..8018018 100755 --- a/modules/volume/widget.lua +++ b/modules/volume/widget.lua @@ -90,6 +90,8 @@ widget.widget:connect_signal("button::press", elseif (button == 5) then volume.volume_down() end + + awesome.emit_signal("module::volume_popup:show") end )