awesome/lib/awful/client/shape.lua.in
Ignas Anikevicius (gns_ank) 9f8e2b1336 Docs: Begin work on awful.client
This fixes usage and some and client parameter types.
2015-02-28 23:14:11 +01:00

90 lines
2.8 KiB
Lua

---------------------------------------------------------------------------
--- Handle client shapes.
--
-- @author Uli Schlachter <psychon@znc.in>
-- @copyright 2014 Uli Schlachter
-- @release @AWESOME_VERSION@
-- @module awful.client.shape
---------------------------------------------------------------------------
-- Grab environment we need
local surface = require("gears.surface")
local cairo = require("lgi").cairo
local capi =
{
client = client,
}
local shape = {}
shape.update = {}
--- Get one of a client's shapes and transform it to include window decorations
-- @client c The client whose shape should be retrieved
-- @tparam string shape Either "bounding" or "clip"
function shape.get_transformed(c, shape)
local border = shape == "bounding" and c.border_width or 0
local shape = surface(c["client_shape_" .. shape])
if not shape then return end
-- Get information about various sizes on the client
local geom = c:geometry()
local _, t = c:titlebar_top()
local _, b = c:titlebar_bottom()
local _, l = c:titlebar_left()
local _, r = c:titlebar_right()
-- Figure out the size of the shape that we need
local img_width = geom.width + 2*border
local img_height = geom.height + 2*border
local result = cairo.ImageSurface(cairo.Format.A1, img_width, img_height)
local cr = cairo.Context(result)
-- Fill everything (this paints the titlebars and border)
cr:paint()
-- Draw the client's shape in the middle
cr:set_operator(cairo.Operator.SOURCE)
cr:set_source_surface(shape, border + l, border + t)
cr:rectangle(border + l, border + t, geom.width - l - r, geom.height - t - b)
cr:fill()
return result
end
--- Update a client's bounding shape from the shape the client set itself
-- @client c The client to act on
function shape.update.bounding(c)
local res = shape.get_transformed(c, "bounding")
c.shape_bounding = res and res._native
-- Free memory
if res then
res:finish()
end
end
--- Update a client's clip shape from the shape the client set itself
-- @client c The client to act on
function shape.update.clip(c)
local res = shape.get_transformed(c, "clip")
c.shape_clip = res and res._native
-- Free memory
if res then
res:finish()
end
end
--- Update all of a client's shapes from the shapes the client set itself
-- @client c The client to act on
function shape.update.all(c)
shape.update.bounding(c)
shape.update.clip(c)
end
capi.client.connect_signal("property::shape_client_bounding", shape.update.bounding)
capi.client.connect_signal("property::shape_client_clip", shape.update.clip)
capi.client.connect_signal("property::width", shape.update.all)
capi.client.connect_signal("property::height", shape.update.all)
return shape
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80