Lua conky 的脚本运行没有错误,但没有绘制任何东西
Lua script for conky runs without errors but doesn't draw anything
我是 lua 的新手,正试图通过为 conky 创建脚本来深入了解它。在我的示例中,我试图将 cairo 功能封装到 Canvas 对象 和 drawable objects(即文本对象)中添加到 canvas。
当我尝试将 cairo_surface 和 cairo 对象存储在 table 中时,我无法做到不再使用它们。即使没有发生错误 (没有消息或段错误或泄漏) 第二个示例中没有显示任何文本。
这个例子有效:
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) -- returns table instead of 2 variables
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) -- access table member instead of variable
Canvas.destroy(cnv)
end
end
return {
cs = cairo_xlib_surface_create(w.display,w.drawable,w.visual,w.width,w.height),
cr = cairo_create(cs)
}
在 Lua table 构造函数中,无法访问正在构造的 table 的其他字段。
表达式 cr = cairo_create(cs)
中的 cs
指的是(全局)变量 cs
而不是 table 字段 cs
.
解决方法:引入局部变量 cs
并在创建 table.
之前对其进行初始化
local cs = cairo_xlib_surface_create(w.display,w.drawable,w.visual,w.width,w.height)
return { cs = cs, cr = cairo_create(cs) }
我是 lua 的新手,正试图通过为 conky 创建脚本来深入了解它。在我的示例中,我试图将 cairo 功能封装到 Canvas 对象 和 drawable objects(即文本对象)中添加到 canvas。
当我尝试将 cairo_surface 和 cairo 对象存储在 table 中时,我无法做到不再使用它们。即使没有发生错误 (没有消息或段错误或泄漏) 第二个示例中没有显示任何文本。
这个例子有效:
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) -- returns table instead of 2 variables
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) -- access table member instead of variable
Canvas.destroy(cnv)
end
end
return {
cs = cairo_xlib_surface_create(w.display,w.drawable,w.visual,w.width,w.height),
cr = cairo_create(cs)
}
在 Lua table 构造函数中,无法访问正在构造的 table 的其他字段。
表达式 cr = cairo_create(cs)
中的 cs
指的是(全局)变量 cs
而不是 table 字段 cs
.
解决方法:引入局部变量 cs
并在创建 table.
local cs = cairo_xlib_surface_create(w.display,w.drawable,w.visual,w.width,w.height)
return { cs = cs, cr = cairo_create(cs) }