local utils = require("utils") -- `lcc.tpl`: a template registry with lazy parsing -- NOTE: lazy parsing (i.e. deferring template parsing till the first time it is -- accessed) is crucial, otherwise configs such as `scale` might not have been -- properly set up yet. do local _tpl = utils.table.lazy() -- make `lcc` and `conky` contexts available local function _add_ctx(args) args = args or {} args.lcc = _G.lcc args.conky = _G.conky return args end lcc.tpl = { -- a template including tforms applied to template variables, which have -- to be interpolated first, must be registered via this function. it is -- a bit less efficient than the regular __newindex version. dynamic_tform = function(name, text) local ctpl = utils.tpl(text) _tpl:lazy(name, function() return function(args) return T_(ctpl(_add_ctx(args))) end end) end } setmetatable(lcc.tpl, { __newindex = function(_, name, text) _tpl:lazy(name, function() local ctpl = utils.tpl(T_(text)) return function(args) return ctpl(_add_ctx(args)) end end) end, __index = function(_, name) return _tpl[name] end }) end local components = {} C_ = components -- C_: global alias for `components` ------------------------ -- collect components -- ------------------------ local core = require("components.core") utils.table.update(components, core) -- GPU support for different vendors, as of now only Nvidia's is supported components.gpu = require("components.gpu") ------------------------ -- external interface -- ------------------------ -- build LCC panel specified as an array, each element being a component -- component can be defined as one of the following: -- - {func, ...} -- function and arguments -- - func -- shortcut for { func } -- where `func` can be a component function, or its name (string) -- if `func` is a string, the leading "C_." can be omitted for convenience function components.build_panel() local panel = {} for i, c in ipairs(lcc.panel) do local ok, s = pcall(function() local func, args local tc = type(c) if tc == "function" or tc == "string" then func = c args = {} elseif tc == "table" then func = table.remove(c, 1) args = c else error("invalid type: " .. tc) end if type(func) == "string" then if string.sub(func, 1, 3) ~= "C_." then func = "C_." .. func end func = utils.loadstring("return " .. func)() end if not func then error("component function not found") end return func(utils.table.unpack(args)) end) if not ok then s = core.message( "error+", "invalid component [" .. i .. "]:\n" .. string.gsub(s, ": ", ":\n") ) end if s then table.insert(panel, s) end end return table.concat(panel, core.vspace(lcc.config.spacing)) end return components