Lua script for conky runs without errors but doesn't draw anything

我刚开始学习 Lua,试图通过为 conky 创建脚本来深入学习。在我的例子中,我试图将 cairo 功能封装到“画布对象”和“可绘制对象”(例如纯文本对象)中,这些对象可以添加到画布中。

当我尝试在表中存储 cairo_surfacecairo 对象时,我再也无法使用它们了。尽管没有出现错误(没有消息、段错误或泄漏),但第二个示例中未显示任何文本。

这个例子可以工作:

Canvas = {
    init = function (w)
        local cs = cairo_xlib_surface_create(w.display,w.drawable,w.visual,w.width,w.height)
        local cr = cairo_create(cs)
        return cr, cs
    end,

    destroy = function (cr, cs)
        cairo_destroy(cr)
        cairo_surface_destroy(cs)
    end
}

function conky_main ()
    if conky_window == nil then
        return
    else
        local cr, cs = Canvas.init(conky_window)
        local tx = Text:new{text="Hello World!"}
        tx:draw(cr)
        Canvas.destroy(cr, cs)
    end
end

这个例子不工作:

Canvas = {
    init = function (w) -- 返回表而不是2个变量
        return {
            cs = cairo_xlib_surface_create(w.display,w.drawable,w.visual,w.width,w.height),
            cr = cairo_create(cs)
        }
    end,

    destroy = function (cnv)
        cairo_destroy(cnv.cr)
        cairo_surface_destroy(cnv.cs)
    end
}

function conky_main ()
    if conky_window == nil then
        return
    else
        local cnv = Canvas.init(conky_window)
        local tx = Text:new{text="Hello World!"}
        tx:draw(cnv.cr) -- 访问表成员而不是变量
        Canvas.destroy(cnv)
    end
end
点赞
用户1847592
用户1847592
返回{
    cs = cairo_xlib_surface_create(w.display,w.drawable,w.visual,w.width,w.height),
    cr = cairo_create(cs)
}

在 Lua 的表构造器中,无法访问正在构建的表的另一个字段。

表达式 cr = cairo_create(cs) 中的 cs 会引用全局变量 cs,而不是表字段 cs

解决方法:先引入本地变量 cs 并初始化,然后再创建表。

local cs = cairo_xlib_surface_create(w.display,w.drawable,w.visual,w.width,w.height)
返回 {cs = cs, cr = cairo_create(cs)}
2018-09-16 12:52:33