You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.3 KiB
150 lines
3.3 KiB
#include "luavgl.h"
|
|
#include "private.h"
|
|
|
|
#include "anim.c"
|
|
#include "constants.c"
|
|
#include "disp.c"
|
|
#include "font.c"
|
|
#include "fs.c"
|
|
#include "group.c"
|
|
#include "indev.c"
|
|
#include "obj.c"
|
|
#include "timer.c"
|
|
#include "util.c"
|
|
|
|
static const struct luaL_Reg luavgl_methods[] = {
|
|
{"Timer", luavgl_timer_create}, /* timer.c */
|
|
{"Font", luavgl_font_create }, /* font.c */
|
|
{"Style", luavgl_style_create}, /* style.c */
|
|
{"Anim", luavgl_anim_create }, /* anim.c */
|
|
|
|
{NULL, NULL },
|
|
};
|
|
|
|
LUALIB_API luavgl_ctx_t *luavgl_context(lua_State *L)
|
|
{
|
|
static const char *luavglgl_key = "luavgl_key";
|
|
|
|
luavgl_ctx_t *ctx;
|
|
lua_pushstring(L, luavglgl_key);
|
|
lua_rawget(L, LUA_REGISTRYINDEX);
|
|
|
|
/**
|
|
* ctx = registry[luavgl_key]
|
|
* if ctx == nil then
|
|
* ctx = new ctx
|
|
* else
|
|
* return ctx
|
|
* end
|
|
*/
|
|
|
|
if (lua_isnil(L, -1)) {
|
|
/* create it if not exist in registry */
|
|
lua_pushstring(L, luavglgl_key);
|
|
ctx = (luavgl_ctx_t *)lua_newuserdata(L, sizeof(*ctx));
|
|
memset(ctx, 0, sizeof(*ctx));
|
|
lua_rawset(L, LUA_REGISTRYINDEX);
|
|
} else {
|
|
ctx = (luavgl_ctx_t *)lua_touserdata(L, -1);
|
|
}
|
|
|
|
lua_pop(L, 1);
|
|
return ctx;
|
|
}
|
|
|
|
LUALIB_API void luavgl_set_pcall(lua_State *L, luavgl_pcall_t pcall)
|
|
{
|
|
luavgl_ctx_t *ctx = luavgl_context(L);
|
|
ctx->pcall = pcall;
|
|
}
|
|
|
|
LUALIB_API void luavgl_set_root(lua_State *L, lv_obj_t *root)
|
|
{
|
|
luavgl_ctx_t *ctx = luavgl_context(L);
|
|
ctx->root = root;
|
|
}
|
|
|
|
LUALIB_API void luavgl_set_font_extension(lua_State *L, make_font_cb make,
|
|
delete_font_cb d)
|
|
{
|
|
luavgl_ctx_t *ctx = luavgl_context(L);
|
|
ctx->make_font = make;
|
|
ctx->delete_font = d;
|
|
}
|
|
|
|
static int root_gc(lua_State *L)
|
|
{
|
|
debug("enter.\n");
|
|
luavgl_ctx_t *ctx = luavgl_context(L);
|
|
lv_obj_del(ctx->root);
|
|
return 0;
|
|
}
|
|
|
|
static int root_clean(lua_State *L)
|
|
{
|
|
debug("enter.\n");
|
|
luavgl_ctx_t *ctx = luavgl_context(L);
|
|
lv_obj_clean(ctx->root);
|
|
return 0;
|
|
}
|
|
|
|
LUALIB_API int luaopen_lvgl(lua_State *L)
|
|
{
|
|
luavgl_ctx_t *ctx = luavgl_context(L);
|
|
|
|
luaL_newlib(L, luavgl_methods);
|
|
|
|
luaL_newmetatable(L, "root.meta");
|
|
lua_pushstring(L, "__gc");
|
|
lua_pushcfunction(L, ctx->root ? root_clean : root_gc);
|
|
lua_settable(L, -3);
|
|
lua_pop(L, 1);
|
|
|
|
lv_obj_t *root = ctx->root;
|
|
if (root == NULL) {
|
|
debug("create root obj for lua.\n");
|
|
root = lv_obj_create(lv_scr_act());
|
|
ctx->root = root;
|
|
}
|
|
|
|
if (ctx->pcall == NULL)
|
|
ctx->pcall = luavgl_pcall;
|
|
|
|
lua_pushstring(L, "_root");
|
|
*(void **)lua_newuserdata(L, sizeof(void *)) = root;
|
|
luaL_getmetatable(L, "root.meta");
|
|
lua_setmetatable(L, -2);
|
|
|
|
/*
|
|
* create a ref to root, avoid __gc early
|
|
* this puts the root userdata into the _root key
|
|
* in the returned luv table
|
|
* */
|
|
lua_rawset(L, -3);
|
|
|
|
lv_obj_remove_style_all(root);
|
|
lv_obj_set_size(root, LV_HOR_RES, LV_VER_RES);
|
|
lv_obj_clear_flag(root, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLLABLE);
|
|
|
|
luavgl_obj_init(L);
|
|
luavgl_widgets_init(L);
|
|
luavgl_anim_init(L);
|
|
luavgl_timer_init(L);
|
|
luavgl_style_init(L);
|
|
luavgl_fs_init(L);
|
|
luavgl_indev_init(L);
|
|
luavgl_group_init(L);
|
|
luavgl_disp_init(L);
|
|
|
|
luavgl_constants_init(L);
|
|
|
|
/* Methods to create widget locate in widgets table, check `luavgl_obj_init`
|
|
*/
|
|
luaL_getmetatable(L, "widgets");
|
|
lua_setmetatable(L, -2);
|
|
|
|
(void)dumpstack;
|
|
(void)dumptable;
|
|
(void)dumpvalue;
|
|
return 1;
|
|
}
|
|
|