Как вызвать cairo из библиотеки c / c ++ (conky-lua как хост-процесс) - PullRequest
0 голосов
/ 18 октября 2019

Я разрабатываю мой модуль conky-lua, написанный как разделяемая библиотека c ++, которая загружается скриптом conky LUA. Он потребляет очень мало ресурсов процессора, предоставляя: список процессов, стабильное считывание датчиков hwmon и вскоре мониторинг частоты процессора. При использовании сценария lua его можно быстро настроить.

Общая библиотека собирает все эти данные в фоновом потоке, поэтому основной процесс conky не останавливается. Поскольку библиотека написана на c ++, многие данные можно хранить в памяти и искать для отображения. : -)

В настоящее время я рисую некоторую графику в самом скрипте lua, и мне нравится перемещать этот рисунок в библиотеку c / c ++, если это возможно. Я буду рисовать тысячи прямоугольников с градиентной заливкой, так что я ожидаю довольно много накладных расходов на вызовы.

Как нарисовать изображение / поверхность в библиотеке c ++ с помощью простого C cairo (не вызывая lua vm)и затем передать это изображение / поверхность в conky-lua и показать его эффективно? (наименьшее количество кода пластины Lua-to-C ++)

Вот диаграмма процессора: (иди и проверь ее!)

function conky_draw_cpu_chart() // Copyright (C) 2019 JATothrim
    if conky_window == nil then return end
    local cs = cairo_xlib_surface_create(conky_window.display,
        conky_window.drawable,
        conky_window.visual,
        conky_window.width,
        conky_window.height)

    cr = cairo_create(cs)
    local x = 230
    local y = 310
    for cpu = 0, 15 do
        cpupercent = conky_parse("${cpu cpu" .. (cpu + 1) .. "}") / 100.0
        rx = x + 22 * math.fmod(cpu, 8)
        ry = y + 22 * math.floor(cpu / 8)

        pat = cairo_pattern_create_linear (rx+10, ry+10*cpupercent, rx+10.0, ry+20.0+100*cpupercent)
        cairo_pattern_add_color_stop_rgba(pat, 0.0, 1.0,0.0,0.0, 1.0)
        cairo_pattern_add_color_stop_rgba(pat, 0.5, 1.0,0.643137,0.0, 1.0)
        cairo_pattern_add_color_stop_rgba(pat, 1.0, 0.0,1.0,0.0, 1.0)
        cairo_rectangle(cr, rx+1, ry+21 - 20 * cpupercent, 20, 20 * cpupercent)
        cairo_set_source(cr, pat)
        cairo_fill (cr);
        cairo_pattern_destroy(pat)
    end

    cairo_destroy(cr)
    cairo_surface_destroy(cs)
    cr=nil
end

И скелет библиотеки c / c ++ lua:

#define LUA_LIB
extern "C" {
#include <lua.h>
#include <lauxlib.h> 
#include <lualib.h>
}
extern "C" int draw_cpu_chart(lua_State* L) {
    /* ??? */
    // Possible options:
    // a) neatly draw finished image here with "C cairo" and
    //    pass it somehow to "conky-lua-cairo" system in one shot.
    // b) stupidly return all the data as big arrays
    //    back to LUA, do the drawing somehow there and be done it.
    return 1;
}
...