---------------------------------------------------------------------------
-- @author Uli Schlachter
-- @copyright 2012 Uli Schlachter
-- @release v3.5.4
---------------------------------------------------------------------------

local setmetatable = setmetatable
local type = type
local capi = { awesome = awesome }
local cairo = require("lgi").cairo

-- Keep this in sync with build-utils/lgi-check.sh!
local ver_major, ver_minor = string.match(require('lgi.version'), '(%d)%.(%d)')
if tonumber(ver_major) <= 0 and tonumber(ver_minor) < 7 then
    error("lgi too old, need at least version 0.7.0")
end

-- gears.surface
local surface = { mt = {} }
local surface_cache = setmetatable({}, { __mode = 'v' })

--- Try to convert the argument into an lgi cairo surface.
-- This is usually needed for loading images by file name.
function surface.load_uncached(_surface)
    -- Nil is not changed
    if not _surface then
        return nil
    end
    -- Remove from cache if it was cached
    surface_cache[_surface] = nil
    -- lgi cairo surfaces don't get changed either
    if cairo.Surface:is_type_of(_surface) then
        return _surface
    end
    -- Strings are assumed to be file names and get loaded
    if type(_surface) == "string" then
        _surface = capi.awesome.load_image(_surface)
    end
    -- Everything else gets forced into a surface
    return cairo.Surface(_surface, true)
end

function surface.load(_surface)
    if type(_surface) == "string" then
        local cache = surface_cache[_surface]
        if not cache then
            cache = surface.load_uncached(_surface)
            surface_cache[_surface] = cache
        end
        return cache
    end
    return surface.load_uncached(_surface)
end

function surface.mt:__call(...)
    return surface.load(...)
end

return setmetatable(surface, surface.mt)

-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
