diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-11-12 19:14:09 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-11-12 19:14:09 +1100 |
| commit | 8a0a167adbf3d9b6f8b6f16aaf20ca39ad5549de (patch) | |
| tree | 02b6cf23f591915747ec2994381854a79979c4a0 /lib/luavgl/src/luavgl.c | |
| parent | 8471046a95ab9e00f7d42b56dbbc9ce3e5b424b9 (diff) | |
| download | tangara-fw-8a0a167adbf3d9b6f8b6f16aaf20ca39ad5549de.tar.gz | |
Convert the main menu screen to lua lol
Diffstat (limited to 'lib/luavgl/src/luavgl.c')
| -rw-r--r-- | lib/luavgl/src/luavgl.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/lib/luavgl/src/luavgl.c b/lib/luavgl/src/luavgl.c new file mode 100644 index 00000000..86c1a108 --- /dev/null +++ b/lib/luavgl/src/luavgl.c @@ -0,0 +1,150 @@ +#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; +} |
