gears.shape: Stop using _call on a matrix

Instead of using a special _call field on gears.matrix instances which has to be
copied around suitably, this commit changes the code so that the magic is
restricted to a single function in gears.shape.transform. With some metatable
magic, suitable redirection to everything is added.

Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2016-03-26 19:33:10 +01:00
parent 19f146de5f
commit 96055fc86b
1 changed files with 15 additions and 4 deletions

View File

@ -455,15 +455,26 @@ function module.transform(shape)
-- Apply the transformation matrix and apply the shape, then restore -- Apply the transformation matrix and apply the shape, then restore
local function apply(self, cr, width, height, ...) local function apply(self, cr, width, height, ...)
cr:save() cr:save()
cr:transform(self:to_cairo_matrix()) cr:transform(self.matrix:to_cairo_matrix())
shape(cr, width, height, ...) shape(cr, width, height, ...)
cr:restore() cr:restore()
end end
-- Redirect function calls like :rotate() to the underlying matrix
local function index(_, key)
return function(self, ...)
self.matrix = self.matrix[key](self.matrix, ...)
return self
end
end
local matrix = g_matrix.identity:copy() local result = setmetatable({
rawset(matrix, "_call", apply) matrix = g_matrix.identity
}, {
__call = apply,
__index = index
})
return matrix return result
end end
return module return module