gears.wallpaper: Only finish own surfaces

If the caller provides a file name, these function load the image, set
it as the wallpaper and make sure that the memory used for the image
data is freed immediately. However, this was also done when the caller
provided a cairo surface, thus breaking their surface.

Fix the code so that it does not finish surfaces that it did not create
itself.

Fixes: https://github.com/awesomeWM/awesome/issues/1570
Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2017-02-18 17:45:44 +01:00
parent 17fe135a9f
commit 4fc396ec57
1 changed files with 16 additions and 4 deletions

View File

@ -111,6 +111,7 @@ end
-- @see gears.color -- @see gears.color
function wallpaper.centered(surf, s, background) function wallpaper.centered(surf, s, background)
local geom, cr = wallpaper.prepare_context(s) local geom, cr = wallpaper.prepare_context(s)
local original_surf = surf
surf = surface.load_uncached(surf) surf = surface.load_uncached(surf)
background = color(background) background = color(background)
@ -126,7 +127,9 @@ function wallpaper.centered(surf, s, background)
cr:clip() cr:clip()
cr:set_source_surface(surf, 0, 0) cr:set_source_surface(surf, 0, 0)
cr:paint() cr:paint()
surf:finish() if surf ~= original_surf then
surf:finish()
end
end end
--- Set a tiled wallpaper. --- Set a tiled wallpaper.
@ -141,13 +144,16 @@ function wallpaper.tiled(surf, s, offset)
cr:translate(offset.x, offset.y) cr:translate(offset.x, offset.y)
end end
local original_surf = surf
surf = surface.load_uncached(surf) surf = surface.load_uncached(surf)
local pattern = cairo.Pattern.create_for_surface(surf) local pattern = cairo.Pattern.create_for_surface(surf)
pattern.extend = cairo.Extend.REPEAT pattern.extend = cairo.Extend.REPEAT
cr.source = pattern cr.source = pattern
cr.operator = cairo.Operator.SOURCE cr.operator = cairo.Operator.SOURCE
cr:paint() cr:paint()
surf:finish() if surf ~= original_surf then
surf:finish()
end
end end
--- Set a maximized wallpaper. --- Set a maximized wallpaper.
@ -159,6 +165,7 @@ end
-- @param offset This can be set to a table with entries x and y. -- @param offset This can be set to a table with entries x and y.
function wallpaper.maximized(surf, s, ignore_aspect, offset) function wallpaper.maximized(surf, s, ignore_aspect, offset)
local geom, cr = wallpaper.prepare_context(s) local geom, cr = wallpaper.prepare_context(s)
local original_surf = surf
surf = surface.load_uncached(surf) surf = surface.load_uncached(surf)
local w, h = surface.get_size(surf) local w, h = surface.get_size(surf)
local aspect_w = geom.width / w local aspect_w = geom.width / w
@ -181,7 +188,9 @@ function wallpaper.maximized(surf, s, ignore_aspect, offset)
cr:set_source_surface(surf, 0, 0) cr:set_source_surface(surf, 0, 0)
cr.operator = cairo.Operator.SOURCE cr.operator = cairo.Operator.SOURCE
cr:paint() cr:paint()
surf:finish() if surf ~= original_surf then
surf:finish()
end
end end
--- Set a fitting wallpaper. --- Set a fitting wallpaper.
@ -193,6 +202,7 @@ end
-- @see gears.color -- @see gears.color
function wallpaper.fit(surf, s, background) function wallpaper.fit(surf, s, background)
local geom, cr = wallpaper.prepare_context(s) local geom, cr = wallpaper.prepare_context(s)
local original_surf = surf
surf = surface.load_uncached(surf) surf = surface.load_uncached(surf)
background = color(background) background = color(background)
@ -213,7 +223,9 @@ function wallpaper.fit(surf, s, background)
cr:scale(scale, scale) cr:scale(scale, scale)
cr:set_source_surface(surf, 0, 0) cr:set_source_surface(surf, 0, 0)
cr:paint() cr:paint()
surf:finish() if surf ~= original_surf then
surf:finish()
end
end end
return wallpaper return wallpaper