Скрипт Lua для conky работает без ошибок, но ничего не рисует - PullRequest
0 голосов
/ 16 сентября 2018

Я новичок в lua и пытался получить больше, создавая скрипты для conky . В моем примере я пытался инкапсулировать функциональность cairo в объект Canvas и нарисованные объекты (т.е. текстовый объект), которые можно добавить на холст.

Когда я пытался сохранить объекты cairo_surface и cairo в таблице, я больше не мог их использовать. Даже при отсутствии ошибок (без сообщений, ошибок или утечек) текст не отображался во втором примере.

Этот пример работает:

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

1 Ответ

0 голосов
/ 16 сентября 2018
return {
    cs = cairo_xlib_surface_create(w.display,w.drawable,w.visual,w.width,w.height),
    cr = cairo_create(cs)
}

В конструкторе таблиц Lua нет доступа к другим полям создаваемой таблицы.
cs в выражении cr = cairo_create(cs) относится к (глобальной) переменной cs вместо поля таблицы cs.
Обходной путь: введите локальную переменную cs и инициализируйте ее перед созданием таблицы.

local cs = cairo_xlib_surface_create(w.display,w.drawable,w.visual,w.width,w.height)
return { cs = cs, cr = cairo_create(cs) }
...