Я разрабатываю мой модуль 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;
}