dotfiles/awesome/module/backdrop.lua
2020-06-03 21:27:00 -05:00

84 lines
1.7 KiB
Lua

local wibox = require('wibox')
local gears = require('gears')
local awful = require('awful')
local function update_backdrop(w, c)
local cairo = require('lgi').cairo
local geo = c.screen.geometry
w.x = geo.x
w.y = geo.y
w.width = geo.width
w.height = geo.height
-- Create an image surface that is as large as the wibox
local shape = cairo.ImageSurface.create(cairo.Format.A1, geo.width, geo.height)
local cr = cairo.Context(shape)
-- Fill with "completely opaque"
cr.operator = 'SOURCE'
cr:set_source_rgba(1, 1, 1, 1)
cr:paint()
-- Remove the shape of the client
local c_geo = c:geometry()
local c_shape = gears.surface(c.shape_bounding)
cr:set_source_rgba(0, 0, 0, 0)
cr:mask_surface(c_shape, c_geo.x + c.border_width - geo.x, c_geo.y + c.border_width - geo.y)
c_shape:finish()
w.shape_bounding = shape._native
shape:finish()
w:draw()
end
local function backdrop(c)
local function update()
update_backdrop(c.backdrop, c)
end
if not c.backdrop then
c.backdrop = wibox {ontop = true, bg = '#00000054', type = 'splash'}
c.backdrop:buttons(
awful.util.table.join(
awful.button(
{},
1,
function()
c:kill()
end
)
)
)
c:connect_signal('property::geometry', update)
c:connect_signal(
'property::shape_client_bounding',
function()
gears.timer.delayed_call(update)
end
)
c:connect_signal(
'unmanage',
function()
c.backdrop.visible = false
end
)
c:connect_signal(
'property::shape_bounding',
function()
gears.timer.delayed_call(update)
end
)
end
update()
c.backdrop.visible = true
end
client.connect_signal(
'manage',
function(c)
if c.draw_backdrop == true then
backdrop(c)
end
end
)