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
)