diff --git a/lib/wibox/drawable.lua b/lib/wibox/drawable.lua index c9d0a483d..a1e83a22b 100644 --- a/lib/wibox/drawable.lua +++ b/lib/wibox/drawable.lua @@ -59,7 +59,17 @@ local function do_redraw(self) self._widget_geometries = {} if self.widget and self.widget.visible then cr:set_source(self.foreground_color) + + if self.widget.opacity ~= 1 then + cr:push_group() + end self.widget:draw(self.widget_arg, cr, width, height) + if self.widget.opacity ~= 1 then + cr:pop_group_to_source() + cr.operator = cairo.Operator.OVER + cr:paint_with_alpha(self.widget.opacity) + end + self:widget_at(self.widget, 0, 0, width, height) end diff --git a/lib/wibox/layout/base.lua b/lib/wibox/layout/base.lua index 97e939661..36ebc61bb 100644 --- a/lib/wibox/layout/base.lua +++ b/lib/wibox/layout/base.lua @@ -10,6 +10,7 @@ local pcall = pcall local print = print local min = math.min local max = math.max +local cairo = require("lgi").cairo local base = {} @@ -66,8 +67,16 @@ function base.draw_widget(wibox, cr, widget, x, y, width, height) cr:rectangle(0, 0, width, height) cr:clip() + if widget.opacity ~= 1 then + cr:push_group() + end -- Let the widget draw itself local success, msg = pcall(widget.draw, widget, wibox, cr, width, height) + if widget.opacity ~= 1 then + cr:pop_group_to_source() + cr.operator = cairo.Operator.OVER + cr:paint_with_alpha(widget.opacity) + end if not success then print("Error while drawing widget: " .. msg) end diff --git a/lib/wibox/widget/base.lua b/lib/wibox/widget/base.lua index f57c01f56..dd37d5c0b 100644 --- a/lib/wibox/widget/base.lua +++ b/lib/wibox/widget/base.lua @@ -116,6 +116,15 @@ function base.make_widget(proxy, widget_name) end end + -- Add opacity property and setter. + ret.opacity = 1 + function ret:set_opacity(b) + if b ~= self.opacity then + self.opacity = b + self:emit_signal("widget::updated") + end + end + -- Add __tostring method to metatable. ret.widget_name = widget_name or object.modulename(3) local mt = {}