From b05b699129cd4cc7b488745deaa7461666a97bf3 Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Sun, 28 Feb 2016 17:24:24 +0100 Subject: [PATCH] gears.wallpaper: Free wallpaper from memory when done Wallpapers are usually big images that use up a lot of memory. This commit makes gears.wallpaper call :finish() on all involved surface to make them free their memory. This is a lot faster than waiting for the garbage collector to collect these surfaces. Due to the large size of wallpapers, such a special case makes sense for this code. Hopefully-helps: https://github.com/awesomeWM/awesome/issues/368 Signed-off-by: Uli Schlachter --- lib/gears/wallpaper.lua | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/gears/wallpaper.lua b/lib/gears/wallpaper.lua index aba2464e..25a5f737 100644 --- a/lib/gears/wallpaper.lua +++ b/lib/gears/wallpaper.lua @@ -61,6 +61,7 @@ function wallpaper.prepare_context(s) local paper = pending_wallpaper pending_wallpaper = nil wallpaper.set(paper) + paper:finish() end) else -- Draw to the already-pending wallpaper @@ -99,7 +100,7 @@ end -- gears.color. The default is black. function wallpaper.centered(surf, s, background) local geom, cr = wallpaper.prepare_context(s) - surf = surface(surf) + surf = surface.load_uncached(surf) background = color(background) -- Fill the area with the background @@ -114,6 +115,7 @@ function wallpaper.centered(surf, s, background) cr:clip() cr:set_source_surface(surf, 0, 0) cr:paint() + surf:finish() end --- Set a tiled wallpaper. @@ -128,11 +130,13 @@ function wallpaper.tiled(surf, s, offset) cr:translate(offset.x, offset.y) end - local pattern = cairo.Pattern.create_for_surface(surface(surf)) + surf = surface.load_uncached(surf) + local pattern = cairo.Pattern.create_for_surface(surf) pattern.extend = cairo.Extend.REPEAT cr.source = pattern cr.operator = cairo.Operator.SOURCE cr:paint() + surf:finish() end --- Set a maximized wallpaper. @@ -144,7 +148,7 @@ end -- @param offset This can be set to a table with entries x and y. function wallpaper.maximized(surf, s, ignore_aspect, offset) local geom, cr = wallpaper.prepare_context(s) - surf = surface(surf) + surf = surface.load_uncached(surf) local w, h = surface.get_size(surf) local aspect_w = geom.width / w local aspect_h = geom.height / h @@ -166,6 +170,7 @@ function wallpaper.maximized(surf, s, ignore_aspect, offset) cr:set_source_surface(surf, 0, 0) cr.operator = cairo.Operator.SOURCE cr:paint() + surf:finish() end --- Set a fitting wallpaper. @@ -176,7 +181,7 @@ end -- gears.color. The default is black. function wallpaper.fit(surf, s, background) local geom, cr = wallpaper.prepare_context(s) - surf = surface(surf) + surf = surface.load_uncached(surf) background = color(background) -- Fill the area with the background @@ -196,6 +201,7 @@ function wallpaper.fit(surf, s, background) cr:scale(scale, scale) cr:set_source_surface(surf, 0, 0) cr:paint() + surf:finish() end return wallpaper