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/disp.c | |
| parent | 8471046a95ab9e00f7d42b56dbbc9ce3e5b424b9 (diff) | |
| download | tangara-fw-8a0a167adbf3d9b6f8b6f16aaf20ca39ad5549de.tar.gz | |
Convert the main menu screen to lua lol
Diffstat (limited to 'lib/luavgl/src/disp.c')
| -rw-r--r-- | lib/luavgl/src/disp.c | 342 |
1 files changed, 342 insertions, 0 deletions
diff --git a/lib/luavgl/src/disp.c b/lib/luavgl/src/disp.c new file mode 100644 index 00000000..75233a81 --- /dev/null +++ b/lib/luavgl/src/disp.c @@ -0,0 +1,342 @@ +#include "luavgl.h" +#include "private.h" + +typedef struct luavgl_disp_s { + lv_disp_t *disp; +} luavgl_disp_t; + +static luavgl_disp_t *luavgl_check_disp(lua_State *L, int idx) +{ + luavgl_disp_t *v = luaL_checkudata(L, idx, "lv_disp"); + + return v; +} + +static lv_disp_t *luavgl_to_disp(lua_State *L, int idx) +{ + return luavgl_check_disp(L, idx)->disp; +} + +static int luavgl_disp_get(lua_State *L, lv_disp_t *disp) +{ + /* check if already exists */ + lua_pushlightuserdata(L, disp); + lua_rawget(L, LUA_REGISTRYINDEX); + + if (lua_isnoneornil(L, -1)) { + /* create new disp userdata and add to registry forever */ + lua_pop(L, 1); + luavgl_disp_t *d = lua_newuserdata(L, sizeof(luavgl_disp_t)); + d->disp = disp; + + luaL_getmetatable(L, "lv_disp"); + lua_setmetatable(L, -2); + + lua_pushlightuserdata(L, disp); + lua_pushvalue(L, -2); + lua_rawset(L, LUA_REGISTRYINDEX); + } + + return 1; +} + +static int luavgl_disp_get_default(lua_State *L) +{ + lv_disp_t *disp = lv_disp_get_default(); + return luavgl_disp_get(L, disp); +} + +static int luavgl_disp_get_scr_act(lua_State *L) +{ + lv_disp_t *disp = luavgl_to_disp(L, 1); + lv_obj_t *obj = lv_disp_get_scr_act(disp); + if (obj == NULL) { + lua_pushnil(L); + return 1; + } + + /* registry[obj] */ + lua_pushlightuserdata(L, obj); + lua_rawget(L, LUA_REGISTRYINDEX); + + if (lua_isnoneornil(L, -1)) { + luavgl_add_lobj(L, obj)->lua_created = false; + } + + return 1; +} + +static int luavgl_disp_get_scr_prev(lua_State *L) +{ + luavgl_disp_t *d = luavgl_check_disp(L, 1); + lv_obj_t *obj = lv_disp_get_scr_prev(d->disp); + if (obj == NULL) { + lua_pushnil(L); + return 1; + } + + /* registry[obj] */ + lua_pushlightuserdata(L, obj); + lua_rawget(L, LUA_REGISTRYINDEX); + + if (lua_isnoneornil(L, -1)) { + luavgl_add_lobj(L, obj)->lua_created = false; + } + + return 1; +} + +/** + * luavgl.disp.load_scr(obj, { + * anim = "over_left", + * time = 1000, + * delay = 100, + * }) + */ +static int luavgl_disp_load_scr(lua_State *L) +{ + lv_obj_t *obj = luavgl_to_obj(L, 1); + if (!lua_istable(L, 2)) { + lv_disp_load_scr(obj); + return 0; + } + + /* has parameter table */ + + lv_scr_load_anim_t anim = LV_SCR_LOAD_ANIM_NONE; + uint32_t time = 0; + uint32_t delay = 0; + bool auto_del = false; + + const char *str; + lua_getfield(L, 2, "anim"); + str = lua_tostring(L, -1); + if (str == NULL || strcmp(str, "none") == 0) { + ; /* use default */ + } else if (strcmp(str, "over_left") == 0) { + anim = LV_SCR_LOAD_ANIM_OVER_LEFT; + } else if (strcmp(str, "over_right") == 0) { + anim = LV_SCR_LOAD_ANIM_OVER_RIGHT; + } else if (strcmp(str, "over_top") == 0) { + anim = LV_SCR_LOAD_ANIM_OVER_TOP; + } else if (strcmp(str, "over_botto") == 0) { + anim = LV_SCR_LOAD_ANIM_OVER_BOTTOM; + } else if (strcmp(str, "move_left") == 0) { + anim = LV_SCR_LOAD_ANIM_MOVE_LEFT; + } else if (strcmp(str, "move_right") == 0) { + anim = LV_SCR_LOAD_ANIM_MOVE_RIGHT; + } else if (strcmp(str, "move_top") == 0) { + anim = LV_SCR_LOAD_ANIM_MOVE_TOP; + } else if (strcmp(str, "move_botto") == 0) { + anim = LV_SCR_LOAD_ANIM_MOVE_BOTTOM; + } else if (strcmp(str, "fade_in") == 0) { + anim = LV_SCR_LOAD_ANIM_FADE_IN; + } else if (strcmp(str, "fade_on") == 0) { + anim = LV_SCR_LOAD_ANIM_FADE_ON; + } else if (strcmp(str, "fade_out") == 0) { + anim = LV_SCR_LOAD_ANIM_FADE_OUT; + } else if (strcmp(str, "out_left") == 0) { + anim = LV_SCR_LOAD_ANIM_OUT_LEFT; + } else if (strcmp(str, "out_right") == 0) { + anim = LV_SCR_LOAD_ANIM_OUT_RIGHT; + } else if (strcmp(str, "out_top") == 0) { + anim = LV_SCR_LOAD_ANIM_OUT_TOP; + } else if (strcmp(str, "out_bottom") == 0) { + anim = LV_SCR_LOAD_ANIM_OUT_BOTTOM; + } + lua_pop(L, 1); + + lua_getfield(L, 2, "time"); + time = luavgl_tointeger(L, -1); + lua_pop(L, 1); + + lua_getfield(L, 2, "delay"); + delay = luavgl_tointeger(L, -1); + lua_pop(L, 1); + + lua_getfield(L, 2, "auto_del"); + auto_del = luavgl_tointeger(L, -1); + lua_pop(L, 1); + + lv_scr_load_anim(obj, anim, time, delay, auto_del); + return 0; +} + +static int luavgl_disp_get_layer_top(lua_State *L) +{ + luavgl_disp_t *d = luavgl_check_disp(L, 1); + lv_obj_t *obj = lv_disp_get_layer_top(d->disp); + if (obj == NULL) { + lua_pushnil(L); + return 1; + } + + /* registry[obj] */ + lua_pushlightuserdata(L, obj); + lua_rawget(L, LUA_REGISTRYINDEX); + + if (lua_isnoneornil(L, -1)) { + luavgl_add_lobj(L, obj)->lua_created = false; + } + + return 1; +} + +static int luavgl_disp_get_layer_sys(lua_State *L) +{ + luavgl_disp_t *d = luavgl_check_disp(L, 1); + lv_obj_t *obj = lv_disp_get_layer_sys(d->disp); + if (obj == NULL) { + lua_pushnil(L); + return 1; + } + + /* registry[obj] */ + lua_pushlightuserdata(L, obj); + lua_rawget(L, LUA_REGISTRYINDEX); + + if (lua_isnoneornil(L, -1)) { + luavgl_add_lobj(L, obj)->lua_created = false; + } + + return 1; +} + +static int luavgl_disp_set_bg_color(lua_State *L) +{ + luavgl_disp_t *d = luavgl_check_disp(L, 1); + lv_color_t c = luavgl_tocolor(L, 2); + + lv_disp_set_bg_color(d->disp, c); + + return 0; +} + +static int luavgl_disp_set_bg_image(lua_State *L) +{ + luavgl_disp_t *d = luavgl_check_disp(L, 1); + const char *img = luavgl_toimgsrc(L, 2); + + lv_disp_set_bg_image(d->disp, img); + + return 0; +} + +static int luavgl_disp_set_bg_opa(lua_State *L) +{ + luavgl_disp_t *d = luavgl_check_disp(L, 1); + lv_opa_t opa = luavgl_tointeger(L, 2); + lv_disp_set_bg_opa(d->disp, opa); + + return 0; +} + +static int luavgl_disp_get_chroma_key_color(lua_State *L) +{ +#if LVGL_VERSION_MAJOR >= 9 + luavgl_disp_t *d = luavgl_check_disp(L, 1); + lv_color_t c = lv_disp_get_chroma_key_color(d->disp); + lua_pushinteger(L, c.full); +#else + lua_pushinteger(L, 0); +#endif + return 1; +} + +static int luavgl_disp_get_next(lua_State *L) +{ + lv_disp_t *disp = NULL; + if (!lua_isnoneornil(L, 1)) { + disp = luavgl_check_disp(L, 1)->disp; + } + + disp = lv_disp_get_next(disp); + if (disp == NULL) { + lua_pushnil(L); + return 1; + } + + return luavgl_disp_get(L, disp); +} + +static int luavgl_disp_get_res(lua_State *L) +{ + luavgl_disp_t *d = luavgl_check_disp(L, 1); + lua_pushinteger(L, lv_disp_get_hor_res(d->disp)); + lua_pushinteger(L, lv_disp_get_ver_res(d->disp)); + return 2; +} + +static int luavgl_disp_set_rotation(lua_State *L) +{ + luavgl_disp_t *d = luavgl_check_disp(L, 1); + uint32_t r = lua_tointeger(L, 2); + + lv_disp_rot_t rot; + if (r == 0) + rot = LV_DISP_ROT_NONE; + else if (r == 90) + rot = LV_DISP_ROT_90; + else if (r == 180) + rot = LV_DISP_ROT_180; + else if (r == 270) + rot = LV_DISP_ROT_270; + else { + return luaL_argerror(L, 2, "invalid rotation value"); + } + + lv_disp_set_rotation(d->disp, rot); + return 0; +} + +/** + * luavgl.disp lib + */ +static const luaL_Reg disp_lib[] = { + {"get_default", luavgl_disp_get_default }, + {"get_scr_act", luavgl_disp_get_scr_act }, + {"get_scr_prev", luavgl_disp_get_scr_prev}, + {"get_next", luavgl_disp_get_next }, + {"load_scr", luavgl_disp_load_scr }, + + {NULL, NULL }, +}; + +/* +** methods for disp handles +*/ +static const luaL_Reg disp_methods[] = { + {"get_layer_top", luavgl_disp_get_layer_top }, + {"get_layer_sys", luavgl_disp_get_layer_sys }, + {"set_bg_color", luavgl_disp_set_bg_color }, + {"set_bg_image", luavgl_disp_set_bg_image }, + {"set_bg_opa", luavgl_disp_set_bg_opa }, + {"get_chroma_key_color", luavgl_disp_get_chroma_key_color}, + {"get_next", luavgl_disp_get_next }, + {"set_rotation", luavgl_disp_set_rotation }, + {"get_res", luavgl_disp_get_res }, + + {NULL, NULL }, +}; + +static const luaL_Reg disp_meta[] = { + {"__index", NULL}, /* place holder */ + + {NULL, NULL} +}; + +static void luavgl_disp_init(lua_State *L) +{ + /* create lv_fs metatable */ + luaL_newmetatable(L, "lv_disp"); + luaL_setfuncs(L, disp_meta, 0); + + luaL_newlib(L, disp_methods); + lua_setfield(L, -2, "__index"); + + lua_pop(L, 1); /* pop metatable */ + + /* luavgl.disp lib */ + luaL_newlib(L, disp_lib); + lua_setfield(L, -2, "disp"); +} |
