diff --git a/lib/luavgl/src/anim.c b/lib/luavgl/src/anim.c index d8f70f27..72cca85a 100644 --- a/lib/luavgl/src/anim.c +++ b/lib/luavgl/src/anim.c @@ -27,7 +27,7 @@ static luavgl_anim_t *luavgl_check_anim(lua_State *L, int index) luavgl_anim_t *a = luaL_checkudata(L, index, "lv_anim"); if (a->deleted) { - luaL_argerror(L, index, "anim already deleted."); + luaL_argerror(L, index, "anim already deleted"); return NULL; } @@ -40,8 +40,8 @@ static void luavgl_anim_exec_cb(void *var, int32_t value) lua_State *L = a->L; if (a->exec_cb == LUA_NOREF || a->obj_ref == LUA_NOREF) { - debug("anim error, callback or obj not found.\n"); - luaL_error(L, "anim founds no callback or obj."); + LV_LOG_ERROR("anim error, callback or obj not found"); + luaL_error(L, "anim founds no callback or obj"); return; } @@ -94,19 +94,19 @@ static void _lv_anim_set_path(void *obj, lua_State *L) } a->path_cb = lv_anim_path_linear; - if (path == NULL || strcmp(path, "linear") == 0) { + if (path == NULL || lv_strcmp(path, "linear") == 0) { ; /* use default linear path */ - } else if (strcmp(path, "ease_in") == 0) { + } else if (lv_strcmp(path, "ease_in") == 0) { a->path_cb = lv_anim_path_ease_in; - } else if (strcmp(path, "ease_out") == 0) { + } else if (lv_strcmp(path, "ease_out") == 0) { a->path_cb = lv_anim_path_ease_out; - } else if (strcmp(path, "ease_in_out") == 0) { + } else if (lv_strcmp(path, "ease_in_out") == 0) { a->path_cb = lv_anim_path_ease_in_out; - } else if (strcmp(path, "overshoot") == 0) { + } else if (lv_strcmp(path, "overshoot") == 0) { a->path_cb = lv_anim_path_overshoot; - } else if (strcmp(path, "bounce") == 0) { + } else if (lv_strcmp(path, "bounce") == 0) { a->path_cb = lv_anim_path_bounce; - } else if (strcmp(path, "step") == 0) { + } else if (lv_strcmp(path, "step") == 0) { a->path_cb = lv_anim_path_step; } } @@ -135,7 +135,7 @@ static int anim_set_para_cb(lua_State *L, void *data) int ret = luavgl_set_property(L, data, anim_property_table); if (ret != 0) { - debug("failed\n"); + LV_LOG_ERROR("failed"); } return ret; @@ -146,7 +146,7 @@ static int luavgl_anim_stop(lua_State *L) luavgl_anim_t *a = luavgl_check_anim(L, 1); if (a->aa == NULL || a->self_ref == LUA_NOREF) { - debug("already stopped"); + LV_LOG_INFO("already stopped"); return 0; } @@ -179,13 +179,13 @@ static int luavgl_anim_start(lua_State *L) luavgl_anim_t *a = luavgl_check_anim(L, 1); if (a->aa) { - debug("we have an anim ongoing, stop it."); + LV_LOG_INFO("we have an anim ongoing, stop it"); luavgl_anim_stop(L); } lv_anim_t *new_a = lv_anim_start(&a->cfg); a->aa = new_a; - debug("anim %p, aa: %p\n", a, a->aa); + LV_LOG_INFO("anim %p, aa: %p", a, a->aa); if (a->self_ref == LUA_NOREF) { /* it's started, thus cannot be gc'ed */ @@ -248,11 +248,11 @@ static int luavgl_anim_set(lua_State *L) static int luavgl_anim_create(lua_State *L) { if (lua_isnoneornil(L, 1)) { - return luaL_argerror(L, 1, "anim var must not be nil or none."); + return luaL_argerror(L, 1, "anim var must not be nil or none"); } if (!lua_istable(L, 2)) { - return luaL_argerror(L, 2, "expect anim para table."); + return luaL_argerror(L, 2, "expect anim para table"); } luavgl_anim_t *a = lua_newuserdata(L, sizeof(luavgl_anim_t)); @@ -271,7 +271,11 @@ static int luavgl_anim_create(lua_State *L) lv_anim_t *cfg = &a->cfg; lv_anim_init(cfg); cfg->var = a; +#if LV_VERSION_CHECK(8, 3, 0) cfg->deleted_cb = luavgl_anim_delete_cb; +#else + cfg->completed_cb = luavgl_anim_delete_cb; +#endif cfg->exec_cb = luavgl_anim_exec_cb; /* leave only anim userdata and para table on stack */ @@ -281,13 +285,13 @@ static int luavgl_anim_create(lua_State *L) luavgl_anim_set(L); lua_pop(L, 1); /* anim */ - debug("create anim: %p, aa: %p\n", a, a->aa); + LV_LOG_INFO("create anim: %p, aa: %p", a, a->aa); return 1; } static int luavgl_anim_gc(lua_State *L) { - debug("\n"); + LV_LOG_INFO("enter"); luavgl_anim_t *a = luaL_checkudata(L, 1, "lv_anim"); if (a->deleted) return 0; diff --git a/lib/luavgl/src/constants.c b/lib/luavgl/src/constants.c index 1c916405..a9aa846d 100644 --- a/lib/luavgl/src/constants.c +++ b/lib/luavgl/src/constants.c @@ -31,8 +31,6 @@ static void luavgl_event_code_init(lua_State* L) lua_pushstring(L, "DRAW_POST_BEGIN"); lua_pushinteger(L, LV_EVENT_DRAW_POST_BEGIN); lua_settable(L, -3); lua_pushstring(L, "DRAW_POST"); lua_pushinteger(L, LV_EVENT_DRAW_POST); lua_settable(L, -3); lua_pushstring(L, "DRAW_POST_END"); lua_pushinteger(L, LV_EVENT_DRAW_POST_END); lua_settable(L, -3); - lua_pushstring(L, "DRAW_PART_BEGIN"); lua_pushinteger(L, LV_EVENT_DRAW_PART_BEGIN); lua_settable(L, -3); - lua_pushstring(L, "DRAW_PART_END"); lua_pushinteger(L, LV_EVENT_DRAW_PART_END); lua_settable(L, -3); lua_pushstring(L, "VALUE_CHANGED"); lua_pushinteger(L, LV_EVENT_VALUE_CHANGED); lua_settable(L, -3); lua_pushstring(L, "INSERT"); lua_pushinteger(L, LV_EVENT_INSERT); lua_settable(L, -3); lua_pushstring(L, "REFRESH"); lua_pushinteger(L, LV_EVENT_REFRESH); lua_settable(L, -3); @@ -117,7 +115,6 @@ static void luavgl_part_init(lua_State* L) lua_pushstring(L, "KNOB"); lua_pushinteger(L, LV_PART_KNOB); lua_settable(L, -3); lua_pushstring(L, "SELECTED"); lua_pushinteger(L, LV_PART_SELECTED); lua_settable(L, -3); lua_pushstring(L, "ITEMS"); lua_pushinteger(L, LV_PART_ITEMS); lua_settable(L, -3); - lua_pushstring(L, "TICKS"); lua_pushinteger(L, LV_PART_TICKS); lua_settable(L, -3); lua_pushstring(L, "CURSOR"); lua_pushinteger(L, LV_PART_CURSOR); lua_settable(L, -3); lua_pushstring(L, "CUSTOM_FIRST"); lua_pushinteger(L, LV_PART_CUSTOM_FIRST); lua_settable(L, -3); lua_pushstring(L, "ANY"); lua_pushinteger(L, LV_PART_ANY); lua_settable(L, -3); @@ -316,13 +313,15 @@ static void luavgl_scr_load_anim_init(lua_State* L) lua_pushstring(L, "MOVE_RIGHT"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_MOVE_RIGHT); lua_settable(L, -3); lua_pushstring(L, "MOVE_TOP"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_MOVE_TOP); lua_settable(L, -3); lua_pushstring(L, "MOVE_BOTTOM"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_MOVE_BOTTOM); lua_settable(L, -3); - lua_pushstring(L, "FADE_IN"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_FADE_IN); lua_settable(L, -3); lua_pushstring(L, "FADE_ON"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_FADE_ON); lua_settable(L, -3); +#if LV_VERSION_CHECK(8, 3, 0) + lua_pushstring(L, "FADE_IN"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_FADE_IN); lua_settable(L, -3); lua_pushstring(L, "FADE_OUT"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_FADE_OUT); lua_settable(L, -3); lua_pushstring(L, "OUT_LEFT"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_OUT_LEFT); lua_settable(L, -3); lua_pushstring(L, "OUT_RIGHT"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_OUT_RIGHT); lua_settable(L, -3); lua_pushstring(L, "OUT_TOP"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_OUT_TOP); lua_settable(L, -3); lua_pushstring(L, "OUT_BOTTOM"); lua_pushinteger(L, LV_SCR_LOAD_ANIM_OUT_BOTTOM); lua_settable(L, -3); +#endif } static void luavgl_scrollbar_mode_init(lua_State* L) @@ -347,6 +346,7 @@ static void luavgl_dir_init(lua_State* L) lua_pushstring(L, "ALL"); lua_pushinteger(L, LV_DIR_ALL); lua_settable(L, -3); } +#if LV_USE_KEYBOARD static void luavgl_keyboard_mode_init(lua_State* L) { lua_newtable(L); @@ -363,6 +363,7 @@ static void luavgl_keyboard_mode_init(lua_State* L) lua_pushstring(L, "TEXT_ARABIC"); lua_pushinteger(L, LV_KEYBOARD_MODE_TEXT_ARABIC); lua_settable(L, -3); #endif } +#endif static void luavgl_flex_flow_init(lua_State* L) { @@ -401,12 +402,14 @@ static void luavgl_grid_align_init(lua_State* L) lua_pushstring(L, "SPACE_BETWEEN"); lua_pushinteger(L, LV_GRID_ALIGN_SPACE_BETWEEN); lua_settable(L, -3); } +#if LV_USE_ROLLER static void luavgl_roller_mode_init(lua_State* L) { lua_newtable(L); lua_pushstring(L, "NORMAL"); lua_pushinteger(L, LV_ROLLER_MODE_NORMAL); lua_settable(L, -3); lua_pushstring(L, "INFINITE"); lua_pushinteger(L, LV_ROLLER_MODE_INFINITE); lua_settable(L, -3); } +#endif static void luavgl_key_init(lua_State* L) { @@ -479,16 +482,22 @@ static void luavgl_constants_init(lua_State *L) lua_setfield(L, -2, "SCROLLBAR_MODE"); luavgl_dir_init(L); lua_setfield(L, -2, "DIR"); + +#if LV_USE_KEYBOARD luavgl_keyboard_mode_init(L); lua_setfield(L, -2, "KEYBOARD_MODE"); +#endif + luavgl_flex_flow_init(L); lua_setfield(L, -2, "FLEX_FLOW"); luavgl_flex_align_init(L); lua_setfield(L, -2, "FLEX_ALIGN"); luavgl_grid_align_init(L); lua_setfield(L, -2, "GRID_ALIGN"); +#if LV_USE_ROLLER luavgl_roller_mode_init(L); lua_setfield(L, -2, "ROLLER_MODE"); +#endif luavgl_key_init(L); lua_setfield(L, -2, "KEY"); /* miscellaneous. */ @@ -515,8 +524,8 @@ static void luavgl_constants_init(lua_State *L) lua_pushinteger(L, LV_COORD_MIN); lua_setfield(L, -2, "COORD_MIN"); - lua_pushinteger(L, LV_IMG_ZOOM_NONE); - lua_setfield(L, -2, "IMG_ZOOM_NONE"); + lua_pushinteger(L, LV_ZOOM_NONE); + lua_setfield(L, -2, "LV_ZOOM_NONE"); lua_pushinteger(L, LV_BTNMATRIX_BTN_NONE); lua_setfield(L, -2, "BTNMATRIX_BTN_NONE"); @@ -524,8 +533,10 @@ static void luavgl_constants_init(lua_State *L) lua_pushinteger(L, LV_CHART_POINT_NONE); lua_setfield(L, -2, "CHART_POINT_NONE"); +#if LV_USE_DROPDOWN lua_pushinteger(L, LV_DROPDOWN_POS_LAST); lua_setfield(L, -2, "DROPDOWN_POS_LAST"); +#endif lua_pushinteger(L, LV_LABEL_DOT_NUM); lua_setfield(L, -2, "LABEL_DOT_NUM"); @@ -537,8 +548,10 @@ static void luavgl_constants_init(lua_State *L) lua_pushinteger(L, LV_TABLE_CELL_NONE); lua_setfield(L, -2, "TABLE_CELL_NONE"); +#if LV_USE_TEXTAREA lua_pushinteger(L, LV_TEXTAREA_CURSOR_LAST); lua_setfield(L, -2, "TEXTAREA_CURSOR_LAST"); +#endif lua_pushinteger(L, LV_LAYOUT_FLEX); lua_setfield(L, -2, "LAYOUT_FLEX"); diff --git a/lib/luavgl/src/disp.c b/lib/luavgl/src/disp.c index 75233a81..ba68491a 100644 --- a/lib/luavgl/src/disp.c +++ b/lib/luavgl/src/disp.c @@ -48,7 +48,10 @@ static int luavgl_disp_get_default(lua_State *L) static int luavgl_disp_get_scr_act(lua_State *L) { - lv_disp_t *disp = luavgl_to_disp(L, 1); + lv_disp_t *disp = NULL; + if (!lua_isnoneornil(L, 1)) + disp = luavgl_to_disp(L, 1); + lv_obj_t *obj = lv_disp_get_scr_act(disp); if (obj == NULL) { lua_pushnil(L); @@ -102,8 +105,7 @@ static int luavgl_disp_load_scr(lua_State *L) } /* has parameter table */ - - lv_scr_load_anim_t anim = LV_SCR_LOAD_ANIM_NONE; + lv_screen_load_anim_t anim = LV_SCR_LOAD_ANIM_NONE; uint32_t time = 0; uint32_t delay = 0; bool auto_del = false; @@ -111,38 +113,40 @@ static int luavgl_disp_load_scr(lua_State *L) const char *str; lua_getfield(L, 2, "anim"); str = lua_tostring(L, -1); - if (str == NULL || strcmp(str, "none") == 0) { + if (str == NULL || lv_strcmp(str, "none") == 0) { ; /* use default */ - } else if (strcmp(str, "over_left") == 0) { + } else if (lv_strcmp(str, "over_left") == 0) { anim = LV_SCR_LOAD_ANIM_OVER_LEFT; - } else if (strcmp(str, "over_right") == 0) { + } else if (lv_strcmp(str, "over_right") == 0) { anim = LV_SCR_LOAD_ANIM_OVER_RIGHT; - } else if (strcmp(str, "over_top") == 0) { + } else if (lv_strcmp(str, "over_top") == 0) { anim = LV_SCR_LOAD_ANIM_OVER_TOP; - } else if (strcmp(str, "over_botto") == 0) { + } else if (lv_strcmp(str, "over_botto") == 0) { anim = LV_SCR_LOAD_ANIM_OVER_BOTTOM; - } else if (strcmp(str, "move_left") == 0) { + } else if (lv_strcmp(str, "move_left") == 0) { anim = LV_SCR_LOAD_ANIM_MOVE_LEFT; - } else if (strcmp(str, "move_right") == 0) { + } else if (lv_strcmp(str, "move_right") == 0) { anim = LV_SCR_LOAD_ANIM_MOVE_RIGHT; - } else if (strcmp(str, "move_top") == 0) { + } else if (lv_strcmp(str, "move_top") == 0) { anim = LV_SCR_LOAD_ANIM_MOVE_TOP; - } else if (strcmp(str, "move_botto") == 0) { + } else if (lv_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) { + } else if (lv_strcmp(str, "fade_on") == 0) { anim = LV_SCR_LOAD_ANIM_FADE_ON; - } else if (strcmp(str, "fade_out") == 0) { +#if LV_VERSION_CHECK(8, 3, 0) + } else if (lv_strcmp(str, "fade_in") == 0) { + anim = LV_SCR_LOAD_ANIM_FADE_IN; + } else if (lv_strcmp(str, "fade_out") == 0) { anim = LV_SCR_LOAD_ANIM_FADE_OUT; - } else if (strcmp(str, "out_left") == 0) { + } else if (lv_strcmp(str, "out_left") == 0) { anim = LV_SCR_LOAD_ANIM_OUT_LEFT; - } else if (strcmp(str, "out_right") == 0) { + } else if (lv_strcmp(str, "out_right") == 0) { anim = LV_SCR_LOAD_ANIM_OUT_RIGHT; - } else if (strcmp(str, "out_top") == 0) { + } else if (lv_strcmp(str, "out_top") == 0) { anim = LV_SCR_LOAD_ANIM_OUT_TOP; - } else if (strcmp(str, "out_bottom") == 0) { + } else if (lv_strcmp(str, "out_bottom") == 0) { anim = LV_SCR_LOAD_ANIM_OUT_BOTTOM; +#endif } lua_pop(L, 1); @@ -158,7 +162,7 @@ static int luavgl_disp_load_scr(lua_State *L) auto_del = luavgl_tointeger(L, -1); lua_pop(L, 1); - lv_scr_load_anim(obj, anim, time, delay, auto_del); + lv_screen_load_anim(obj, anim, time, delay, auto_del); return 0; } @@ -202,47 +206,6 @@ static int luavgl_disp_get_layer_sys(lua_State *L) 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; @@ -272,20 +235,20 @@ 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; + lv_display_rotation_t rot; if (r == 0) - rot = LV_DISP_ROT_NONE; + rot = LV_DISPLAY_ROTATION_0; else if (r == 90) - rot = LV_DISP_ROT_90; + rot = LV_DISPLAY_ROTATION_90; else if (r == 180) - rot = LV_DISP_ROT_180; + rot = LV_DISPLAY_ROTATION_180; else if (r == 270) - rot = LV_DISP_ROT_270; + rot = LV_DISPLAY_ROTATION_270; else { return luaL_argerror(L, 2, "invalid rotation value"); } - lv_disp_set_rotation(d->disp, rot); + lv_display_set_rotation(d->disp, rot); return 0; } @@ -306,17 +269,16 @@ static const luaL_Reg disp_lib[] = { ** 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 }, + {"get_layer_top", luavgl_disp_get_layer_top}, + {"get_layer_sys", luavgl_disp_get_layer_sys}, + {"get_next", luavgl_disp_get_next }, + {"set_rotation", luavgl_disp_set_rotation }, + {"get_res", luavgl_disp_get_res }, + + {"get_scr_act", luavgl_disp_get_scr_act }, + {"get_scr_prev", luavgl_disp_get_scr_prev }, + + {NULL, NULL }, }; static const luaL_Reg disp_meta[] = { diff --git a/lib/luavgl/src/event.c b/lib/luavgl/src/event.c index 29cf8830..096a6355 100644 --- a/lib/luavgl/src/event.c +++ b/lib/luavgl/src/event.c @@ -1,36 +1,29 @@ #include "luavgl.h" #include "private.h" -#include "esp_heap_caps.h" - static void luavgl_obj_event_cb(lv_event_t *e) { - lua_State *L = e->user_data; - if (L == NULL) { - debug("Null user data, should be L.\n"); - } + struct event_callback_s *event = e->user_data; + if (event == NULL) + return; + lua_State *L = event->L; int top = lua_gettop(L); lv_obj_t *obj = e->current_target; lua_pushlightuserdata(L, obj); lua_rawget(L, LUA_REGISTRYINDEX); luavgl_obj_t *lobj = luavgl_to_lobj(L, -1); - if (lobj == NULL || lobj->obj == NULL) - goto event_exit; - - int ref = LUA_NOREF; - for (int i = 0; i < lobj->n_events; i++) { - if (lobj->events[i].code == LV_EVENT_ALL || - lobj->events[i].code == e->code) { - ref = lobj->events[i].ref; - break; - } + if (lobj == NULL || lobj->obj == NULL) { + lua_settop(L, top); + return; } + int ref = event->ref; if (ref == LUA_NOREF) { /* nobody cares this event, something went wrong but can be ignored. */ - goto event_exit; + lua_settop(L, top); + return; } lua_rawgeti(L, LUA_REGISTRYINDEX, ref); @@ -41,27 +34,13 @@ static void luavgl_obj_event_cb(lv_event_t *e) /* args: obj, code */ luavgl_pcall_int(L, 2, 0); - -event_exit: - lua_settop(L, top); -} - -static void luavgl_obj_remove_event(lua_State *L, lv_obj_t *obj, - struct event_callback_s *event) -{ - luaL_unref(L, LUA_REGISTRYINDEX, event->ref); - event->code = -1; /* mark it as unused. */ - event->ref = LUA_NOREF; - lv_obj_remove_event_dsc(obj, event->dsc); - event->dsc = NULL; } /* obj:onevent(luavgl.EVENT.PRESSED, function(code, value) -- end) */ static int luavgl_obj_on_event(lua_State *L) { - bool remove_all; /* if third parameter is noneornil, remove all events. */ - luavgl_obj_t *lobj = luavgl_to_lobj(L, 1); + lv_obj_t *obj = lobj->obj; if (obj == NULL) { luaL_argerror(L, 1, "expect obj userdata.\n"); @@ -74,68 +53,68 @@ static int luavgl_obj_on_event(lua_State *L) return 0; } - remove_all = lua_isnoneornil(L, 3); - - /* check if event code already added, find a slot to store this callback */ - int slot = 0; - if (lobj && lobj->events) { - for (; slot < lobj->n_events; slot++) { - struct event_callback_s *event = &lobj->events[slot]; - if (event->code == code) { /* same event can only be added once. */ - luavgl_obj_remove_event(L, obj, event); - if (remove_all) - continue; /* continue to remove all events associated. */ - else - break; /* use this slot for our new event callback */ - } - - if (event->code == -1) { - /* this callback has been removed, thus, we can use this slot */ - break; + int size = lv_array_size(&lobj->events); + struct event_callback_s *event = NULL; + struct event_callback_s **events = lv_array_front(&lobj->events); + + /* if third parameter is none or nil, remove this events */ + if (lua_isnoneornil(L, 3)) { + for (int i = 0; i < size; i++) { + event = events[i]; + if (event->code == code) { + events[i] = NULL; /* Remove it from array */ + lv_result_t res = lv_obj_remove_event_dsc(lobj->obj, event->dsc); + luaL_unref(L, LUA_REGISTRYINDEX, event->ref); + event->dsc = NULL; + event->L = NULL; + event->ref = LUA_NOREF; + event->code = _LV_EVENT_LAST; + if (res != LV_RESULT_OK) { + return luaL_error(L, "Failed to remove event dsc: %d\n", res); + } + + return 0; } } - } - if (remove_all) /* no need to add, just return */ - return 0; - - struct event_callback_s *events = lobj->events; + return luaL_error(L, "No such event to remove: %d", code); + } - /* create obj->lobj->events, if NULL, realloc if existing and find no slot - */ - if (events == NULL) { - events = - heap_caps_calloc(sizeof(struct event_callback_s), 1, MALLOC_CAP_SPIRAM); - if (events == NULL) { - return luaL_error(L, "No memory."); + /* Check if the event code already exists, only one callback per code. */ + for (int i = 0; i < size; i++) { + if (events[i]->code == code) { + luaL_unref(L, LUA_REGISTRYINDEX, event->ref); + event = events[i]; + break; } - lobj->events = events; - lobj->n_events = 1; - } else { - /* realloc? */ - if (slot && slot == lobj->n_events) { - struct event_callback_s *_events; - _events = heap_caps_realloc(lobj->events, - (lobj->n_events + 1) * sizeof(*_events), - MALLOC_CAP_SPIRAM); - if (_events == NULL) { - return luaL_error(L, "No memory."); - } - events = _events; - lobj->n_events++; /* now we have +1 event */ - lobj->events = events; + if (events[i]->code == _LV_EVENT_LAST) { + /* code marked as _LV_EVENT_LAST means this event has been removed, we can + * reuse it. */ + event = events[i]; + break; } - /* else: we have found a slot to reuse, use it. */ } - /* setup event callback */ + if (event == NULL) { + /* Create a new one if not exist */ + event = lv_malloc_zeroed(sizeof(*event)); + if (event == NULL) { + return luaL_error(L, "No memory"); + } + + lv_array_push_back(&lobj->events, &event); + LV_LOG_INFO("obj: %p, push back event: %d", obj, code); + } - void *dsc = lv_obj_add_event_cb(obj, luavgl_obj_event_cb, code, L); - struct event_callback_s *event = &events[slot]; event->code = code; + event->L = L; event->ref = luavgl_check_continuation(L, 3); - event->dsc = dsc; + event->dsc = lv_obj_add_event_cb(obj, luavgl_obj_event_cb, code, event); + if (event->dsc == NULL) { + lv_free(event); + return luaL_error(L, "Failed to add event callback"); + } return 0; } @@ -169,28 +148,39 @@ static int luavgl_obj_on_pressed(lua_State *L) return luavgl_obj_on_event(L); } -static void luavgl_obj_event_init(luavgl_obj_t *lobj) { lobj->n_events = 0; } - /** * Remove all events added, and free memory of events */ static void luavgl_obj_remove_event_all(lua_State *L, luavgl_obj_t *lobj) { - if (lobj == NULL || lobj->events == NULL) { + if (lobj == NULL) { return; } - struct event_callback_s *events = lobj->events; + int size = lv_array_size(&lobj->events); + struct event_callback_s *event; + struct event_callback_s **events = lv_array_front(&lobj->events); + for (int i = 0; i < size; i++) { + event = events[i]; + if (event == NULL) { + continue; + } + + events[i] = NULL; + + if (event->dsc == NULL) { + continue; + } - int i = 0; - for (; i < lobj->n_events; i++) { - struct event_callback_s *event = &lobj->events[i]; - if (event->code != -1) { - luavgl_obj_remove_event(L, lobj->obj, event); + lv_result_t res = lv_obj_remove_event_dsc(lobj->obj, event->dsc); + if (res != LV_RESULT_OK) { + LV_LOG_WARN("Failed to remove event dsc: %d", res); + /* Ignore this error, remove from it anyway */ } + + luaL_unref(L, LUA_REGISTRYINDEX, event->ref); + lv_free(event); } - free(events); - lobj->n_events = 0; - lobj->events = NULL; + lv_array_deinit(&lobj->events); } diff --git a/lib/luavgl/src/font.c b/lib/luavgl/src/font.c index 383f5974..f4fe3664 100644 --- a/lib/luavgl/src/font.c +++ b/lib/luavgl/src/font.c @@ -5,6 +5,8 @@ #define _ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) +#define NAMED_WEIGHT_MAX_CHARS 16 + /** * Follow css style, specify the name by name family, name size, * name weight. Font weight can be numeric value or 'bold'. Alls strings @@ -159,7 +161,7 @@ static int luavgl_get_named_weight(const char *name) } for (int i = 0; i < _ARRAY_LEN(g_named_weight); i++) { - if (strcmp(name, g_named_weight[i].name) == 0) { + if (lv_strcmp(name, g_named_weight[i].name) == 0) { return g_named_weight[i].value; } } @@ -178,7 +180,7 @@ static const lv_font_t *_luavgl_font_create(lua_State *L, const char *name, int size, int weight) { /* check builtin font firstly. */ - if (strcmp(name, "montserrat") == 0) { + if (lv_strcmp(name, "montserrat") == 0) { if (FONT_WEIGHT_NORMAL != weight) return NULL; @@ -187,7 +189,7 @@ static const lv_font_t *_luavgl_font_create(lua_State *L, const char *name, return g_builtin_montserrat[i].font; } } - } else if (strcmp(name, "unscii") == 0) { + } else if (lv_strcmp(name, "unscii") == 0) { if (FONT_WEIGHT_NORMAL != weight) return NULL; #if LV_FONT_UNSCII_8 @@ -200,21 +202,15 @@ static const lv_font_t *_luavgl_font_create(lua_State *L, const char *name, return &lv_font_unscii_16; #endif } -#if LV_FONT_MONTSERRAT_12_SUBPX - else if (strcmp(name, "montserrat_subpx") == 0) { - if (size == 12) - return &lv_font_montserrat_12_subpx; - } -#endif #if LV_FONT_DEJAVU_16_PERSIAN_HEBREW - else if (strcmp(name, "dejavu_persian_hebrew") == 0) { + else if (lv_strcmp(name, "dejavu_persian_hebrew") == 0) { if (size == 16) return &lv_font_dejavu_16_persian_hebrew; } #endif #if LV_FONT_SIMSUN_16_CJK - else if (strcmp(name, "dejavu_persian_hebrew") == 0) { + else if (lv_strcmp(name, "dejavu_persian_hebrew") == 0) { if (size == 16) return &lv_font_simsun_16_cjk; } @@ -229,6 +225,17 @@ static const lv_font_t *_luavgl_font_create(lua_State *L, const char *name, return NULL; } +static char *luavgl_strchr(const char *s, char c) +{ + while (*s) { + if (c == *s) { + return (char *)s; + } + s++; + } + return NULL; +} + /** * Dynamic font family fallback is not supported. * The fallback only happen when font creation fails and continue to try next @@ -240,7 +247,7 @@ static int luavgl_font_create(lua_State *L) { int weight; int size; - const char *name; + char *str, *name; const lv_font_t *font = NULL; if (!lua_isstring(L, 1)) { @@ -258,26 +265,60 @@ static int luavgl_font_create(lua_State *L) weight = lua_tointeger(L, 3); } else { char *luastr = (char *)lua_tostring(L, 3); - int len = strlen(luastr); + int len = lv_strlen(luastr); if (len > 128) { /* not likely to happen */ return luaL_argerror(L, 3, "too long"); } - char s[len + 1]; - strcpy(s, luastr); + char s[NAMED_WEIGHT_MAX_CHARS]; + if (len + 1 > NAMED_WEIGHT_MAX_CHARS) { + return luaL_argerror(L, 3, "too long"); + } + + lv_strcpy(s, luastr); weight = luavgl_get_named_weight(to_lower(s)); } } else { weight = FONT_WEIGHT_NORMAL; } - name = lua_tostring(L, 1); - font = _luavgl_font_create(L, name, size, weight); + str = lv_strdup(lua_tostring(L, 1)); + if (str == NULL) { + return luaL_error(L, "no memory"); + } + + name = to_lower(str); + while (*name) { + if (*name == ' ') { + name++; + continue; + } + + char *end = luavgl_strchr(name, ','); + if (end != NULL) { + *end = '\0'; + } else { + end = name + lv_strlen(name); + } + + char *trim = end - 1; + while (*trim == ' ') { + *trim-- = '\0'; /* trailing space. */ + } + + font = _luavgl_font_create(L, name, size, weight); + if (font) { + break; + } + + name = end + 1; /* next */ + } + lv_free(str); if (font) { lua_pushlightuserdata(L, (void *)font); return 1; } - return luaL_error(L, "cannot create font."); + return luaL_error(L, "cannot create font"); } diff --git a/lib/luavgl/src/fs.c b/lib/luavgl/src/fs.c index e6fbf712..4deec5e5 100644 --- a/lib/luavgl/src/fs.c +++ b/lib/luavgl/src/fs.c @@ -47,15 +47,15 @@ static int luavgl_fs_open(lua_State *L) f->closed = false; lv_fs_mode_t lmode = 0; - if (strchr(mode, 'r')) + if (luavgl_strchr(mode, 'r')) lmode |= LV_FS_MODE_RD; - if (strchr(mode, 'w')) + if (luavgl_strchr(mode, 'w')) lmode |= LV_FS_MODE_WR; lv_fs_res_t res = lv_fs_open(&f->file, path, lmode); if (res != LV_FS_RES_OK) { - debug("open failed: %s\n", path); + LV_LOG_ERROR("open failed: %s", path); lua_pushnil(L); lua_pushfstring(L, "open failed: %s\n", path); lua_pushinteger(L, res); /* return lv_fs error number */ @@ -152,7 +152,7 @@ static int luavgl_fs_write(lua_State *L) int arg = 2; int nargs = lua_gettop(L) - arg; int status = 1; - lv_fs_res_t res = 0; + lv_fs_res_t res; size_t l; uint32_t nw; const char *s; @@ -183,7 +183,7 @@ static int luavgl_fs_close(lua_State *L) { luavgl_fs_t *f = luavgl_to_fs(L, 1); - debug("\n"); + LV_LOG_INFO("enter"); f->closed = true; lv_fs_close(&f->file); @@ -228,7 +228,7 @@ static int luavgl_fs_tostring(lua_State *L) static int luavgl_fs_gc(lua_State *L) { - debug("\n"); + LV_LOG_INFO("enter"); luavgl_fs_t *v = luaL_checkudata(L, 1, "lv_fs"); if (!v->closed) { @@ -251,7 +251,7 @@ static int luavgl_dir_open(lua_State *L) lv_fs_res_t res = lv_fs_dir_open(&d->dir, path); if (res != LV_FS_RES_OK) { - debug("open failed: %s\n", path); + LV_LOG_ERROR("open failed: %s", path); lua_pushnil(L); lua_pushfstring(L, "open failed: %s\n", path); lua_pushinteger(L, res); /* return lv_fs error number */ @@ -268,7 +268,7 @@ static int luavgl_dir_read(lua_State *L) { luavgl_dir_t *d = luavgl_to_dir(L, 1); char buffer[PATH_MAX]; - lv_fs_res_t res = lv_fs_dir_read(&d->dir, buffer); + lv_fs_res_t res = lv_fs_dir_read(&d->dir, buffer, sizeof(buffer)); if (res != LV_FS_RES_OK || buffer[0] == '\0') { lua_pushnil(L); } else { @@ -280,7 +280,7 @@ static int luavgl_dir_read(lua_State *L) static int luavgl_dir_close(lua_State *L) { - debug("\n"); + LV_LOG_INFO("error"); luavgl_dir_t *d = luavgl_to_dir(L, 1); d->closed = true; lv_fs_dir_close(&d->dir); @@ -295,7 +295,7 @@ static int luavgl_dir_tostring(lua_State *L) static int luavgl_dir_gc(lua_State *L) { - debug("\n"); + LV_LOG_INFO("enter"); luavgl_dir_t *v = luaL_checkudata(L, 1, "lv_dir"); if (!v->closed) { diff --git a/lib/luavgl/src/group.c b/lib/luavgl/src/group.c index 9dabbad4..3ef164ed 100644 --- a/lib/luavgl/src/group.c +++ b/lib/luavgl/src/group.c @@ -87,7 +87,7 @@ static int luavgl_group_delete(lua_State *L) g->group = NULL; #endif - debug("delete group:%p\n", g); + LV_LOG_INFO("delete group:%p", g); return 0; } @@ -289,7 +289,7 @@ static int luavgl_group_gc(lua_State *L) g->group = NULL; #endif - debug("gc group: %p\n", g); + LV_LOG_INFO("gc group: %p", g); return 0; } diff --git a/lib/luavgl/src/imgdata.c b/lib/luavgl/src/imgdata.c index 9f7a2a01..33bd7269 100644 --- a/lib/luavgl/src/imgdata.c +++ b/lib/luavgl/src/imgdata.c @@ -1,12 +1,11 @@ -#include "draw/lv_img_buf.h" -#include "draw/lv_img_decoder.h" +#include "draw/lv_image_decoder.h" #include "lauxlib.h" #include "lua.h" #include "luavgl.h" #include "misc/lv_color.h" -#include "misc/lv_mem.h" #include "misc/lv_types.h" #include "private.h" +#include "stdlib/lv_mem.h" #include #include @@ -16,22 +15,21 @@ static int luavgl_imgdata_create(lua_State *L) return luaL_argerror(L, 1, "expect string"); } - lv_img_decoder_dsc_t descriptor; - lv_res_t res = - lv_img_decoder_open(&descriptor, lua_tostring(L, 1), lv_color_black(), 0); + lv_image_decoder_dsc_t descriptor; + lv_res_t res = lv_image_decoder_open(&descriptor, lua_tostring(L, 1), NULL); if (res != LV_RES_OK) { return luaL_error(L, "failed to decode image."); } - lv_img_dsc_t *data = lv_mem_alloc(sizeof(lv_img_dsc_t)); + lv_image_dsc_t *data = lv_malloc(sizeof(lv_image_dsc_t)); data->header = descriptor.header; - data->data_size = data->header.w * data->header.h * sizeof(uint32_t); // ??? + data->data_size = descriptor.decoded->data_size; - uint8_t *data_copy = lv_mem_alloc(data->data_size); - memcpy(data_copy, descriptor.img_data, data->data_size); + uint8_t *data_copy = lv_malloc(data->data_size); + memcpy(data_copy, descriptor.decoded->data, data->data_size); data->data = data_copy; - lv_img_decoder_close(&descriptor); + lv_image_decoder_close(&descriptor); lua_pushlightuserdata(L, data); return 1; diff --git a/lib/luavgl/src/indev.c b/lib/luavgl/src/indev.c index a21e3ee8..0479e204 100644 --- a/lib/luavgl/src/indev.c +++ b/lib/luavgl/src/indev.c @@ -55,6 +55,7 @@ static int luavgl_indev_get_act(lua_State *L) return luavgl_indev_get(L, indev); } +#if 0 static int luavgl_indev_get_obj_act(lua_State *L) { lv_obj_t *obj = lv_indev_get_obj_act(); @@ -73,6 +74,7 @@ static int luavgl_indev_get_obj_act(lua_State *L) return 1; } +#endif static int luavgl_indev_get_next(lua_State *L) { @@ -201,6 +203,7 @@ static int luavgl_indev_wait_release(lua_State *L) return 0; } +#if 0 static void indev_feedback_cb(lv_indev_drv_t *driver, uint8_t code) { lua_State *L = driver->user_data; @@ -249,8 +252,8 @@ static int luavgl_indev_on_event(lua_State *L) lua_setuservalue(L, 1); } - debug("add feedback_cb code %d, for indev->driver: %p\n", code, - i->indev->driver); + LV_LOG_INFO("add feedback_cb code %d, for indev->driver: %p\n", code, + i->indev->driver); lua_pushvalue(L, 3); lua_rawseti(L, -2, code); @@ -259,6 +262,7 @@ static int luavgl_indev_on_event(lua_State *L) lua_settop(L, 1); return 1; } +#endif static int luavgl_indev_tostring(lua_State *L) { @@ -268,8 +272,9 @@ static int luavgl_indev_tostring(lua_State *L) static int luavgl_indev_gc(lua_State *L) { - debug("\n"); + LV_LOG_INFO("enter"); +#if 0 /* If set_feedback_cb is used, then the indev only gets gc'ed when lua vm * exits. */ @@ -281,6 +286,7 @@ static int luavgl_indev_gc(lua_State *L) lua_rawset(L, LUA_REGISTRYINDEX); i->indev->driver->feedback_cb = NULL; } +#endif return 0; } @@ -290,7 +296,9 @@ static int luavgl_indev_gc(lua_State *L) */ static const luaL_Reg indev_lib[] = { {"get_act", luavgl_indev_get_act }, +#if 0 {"get_obj_act", luavgl_indev_get_obj_act}, +#endif {"get_next", luavgl_indev_get_next }, {NULL, NULL }, @@ -312,8 +320,9 @@ static const luaL_Reg methods[] = { {"get_scroll_obj", luavgl_indev_get_scroll_obj }, {"get_vect", luavgl_indev_get_vect }, {"wait_release", luavgl_indev_wait_release }, +#if 0 {"on_event", luavgl_indev_on_event }, - +#endif {NULL, NULL }, }; diff --git a/lib/luavgl/src/luavgl.c b/lib/luavgl/src/luavgl.c index 2d0af07a..f0f38827 100644 --- a/lib/luavgl/src/luavgl.c +++ b/lib/luavgl/src/luavgl.c @@ -7,7 +7,6 @@ #include "font.c" #include "fs.c" #include "group.c" -#include "imgdata.c" #include "indev.c" #include "obj.c" #include "timer.c" @@ -44,7 +43,7 @@ LUALIB_API luavgl_ctx_t *luavgl_context(lua_State *L) /* 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)); + lv_memset(ctx, 0, sizeof(*ctx)); lua_rawset(L, LUA_REGISTRYINDEX); } else { ctx = (luavgl_ctx_t *)lua_touserdata(L, -1); @@ -76,7 +75,7 @@ LUALIB_API void luavgl_set_font_extension(lua_State *L, make_font_cb make, static int root_gc(lua_State *L) { - debug("enter.\n"); + LV_LOG_INFO("enter"); luavgl_ctx_t *ctx = luavgl_context(L); lv_obj_del(ctx->root); return 0; @@ -84,7 +83,7 @@ static int root_gc(lua_State *L) static int root_clean(lua_State *L) { - debug("enter.\n"); + LV_LOG_INFO("enter"); luavgl_ctx_t *ctx = luavgl_context(L); lv_obj_clean(ctx->root); return 0; @@ -104,7 +103,7 @@ LUALIB_API int luaopen_lvgl(lua_State *L) lv_obj_t *root = ctx->root; if (root == NULL) { - debug("create root obj for lua.\n"); + LV_LOG_INFO("create root obj for lua"); root = lv_obj_create(lv_scr_act()); ctx->root = root; } diff --git a/lib/luavgl/src/luavgl.h b/lib/luavgl/src/luavgl.h index c76a6493..d485cdc8 100644 --- a/lib/luavgl/src/luavgl.h +++ b/lib/luavgl/src/luavgl.h @@ -14,7 +14,7 @@ extern "C" { typedef const lv_font_t *(*make_font_cb)(const char *name, int size, int weight); -typedef void (*delete_font_cb)(lv_font_t *); +typedef void (*delete_font_cb)(const lv_font_t *); typedef int (*luavgl_pcall_t)(lua_State *L, int nargs, int nresults); typedef struct { @@ -48,13 +48,17 @@ typedef struct { }; } luavgl_value_setter_t; +struct event_callback_s { + lua_State *L; + int ref; /* ref to callback */ + lv_event_code_t code; + lv_event_dsc_t *dsc; +}; + typedef struct luavgl_obj_s { lv_obj_t *obj; /* NULL means obj deleted, but not gc'ed in lua */ bool lua_created; /* this object is created from lua */ - - /* internally used variables */ - int n_events; - struct event_callback_s *events; + lv_array_t events; /* events added from lua, need it to distinguish between lua */ } luavgl_obj_t; #define luavgl_obj_newmetatable(L, clz, name, l) \ @@ -123,6 +127,11 @@ LUALIB_API luavgl_obj_t *luavgl_add_lobj(lua_State *L, lv_obj_t *obj); */ LUALIB_API luavgl_obj_t *luavgl_to_lobj(lua_State *L, int idx); +/** + * @brief Get lvgl style from stack + */ +LUALIB_API lv_style_t *luavgl_to_style(lua_State *L, int idx); + /** * @brief Create metatable for specified object class * @@ -157,11 +166,6 @@ LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx); */ LUALIB_API lv_obj_t *luavgl_to_obj(lua_State *L, int idx); -/** - * @brief Get lvgl style from stack - */ -LUALIB_API lv_style_t *luavgl_to_style(lua_State *L, int idx); - /** * @brief Convert value to integer * diff --git a/lib/luavgl/src/obj.c b/lib/luavgl/src/obj.c index fb89e3f9..496b7855 100644 --- a/lib/luavgl/src/obj.c +++ b/lib/luavgl/src/obj.c @@ -1,5 +1,3 @@ -#include "core/lv_group.h" -#include "core/lv_obj.h" #include "luavgl.h" #include "private.h" @@ -10,16 +8,18 @@ static int luavgl_anim_create(lua_State *L); static int luavgl_obj_delete(lua_State *L); +static int luavgl_obj_clean(lua_State *L); -static void _lv_obj_set_align(void *obj, lua_State *L) { +static void _lv_obj_set_align(void *obj, lua_State *L) +{ if (lua_isinteger(L, -1)) { lv_obj_align(obj, lua_tointeger(L, -1), 0, 0); return; } if (!lua_istable(L, -1)) { - luaL_argerror(L, -1, "should be table."); - debug("para should be table."); + luaL_argerror(L, -1, "should be table"); + LV_LOG_ERROR("para should be table"); return; } @@ -43,11 +43,13 @@ static void _lv_obj_set_align(void *obj, lua_State *L) { * * Internally used. */ -static inline void luavgl_setup_obj(lua_State *L, lv_obj_t *obj) { +static inline void luavgl_setup_obj(lua_State *L, lv_obj_t *obj) +{ luavgl_iterate(L, -1, luavgl_obj_set_property_kv, obj); } -static void obj_delete_cb(lv_event_t *e) { +static void obj_delete_cb(lv_event_t *e) +{ lua_State *L = e->user_data; lua_pushlightuserdata(L, e->current_target); lua_rawget(L, LUA_REGISTRYINDEX); @@ -67,7 +69,33 @@ static void obj_delete_cb(lv_event_t *e) { goto pop_exit; } - luavgl_obj_delete(L); + /* Clean its children firstly */ + luavgl_obj_clean(L); + + /* Remove events added from lua, but keep them unremoved */ + int size = lv_array_size(&lobj->events); + struct event_callback_s *event; + struct event_callback_s **events = lv_array_front(&lobj->events); + for (int i = 0; i < size; i++) { + event = events[i]; + if (event == NULL || event->dsc == NULL) { + continue; + } + + luaL_unref(L, LUA_REGISTRYINDEX, event->ref); + lv_free(event); + } + + lv_array_deinit(&lobj->events); + + /* remove userdata from registry. */ + lua_checkstack(L, 2); + lua_pushlightuserdata(L, lobj->obj); + lua_pushnil(L); + lua_rawset(L, LUA_REGISTRYINDEX); + + LV_LOG_INFO("delete obj: %p", lobj->obj); + lobj->obj = NULL; return; pop_exit: @@ -80,7 +108,8 @@ pop_exit: * one. result stack: table(from uservalue) * return uservalue type: LUA_TTABLE */ -LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx) { +LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx) +{ int type = lua_getuservalue(L, idx); if (type == LUA_TTABLE) return type; @@ -99,11 +128,13 @@ LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx) { return LUA_TTABLE; } -static int luavgl_obj_create(lua_State *L) { +static int luavgl_obj_create(lua_State *L) +{ return luavgl_obj_create_helper(L, lv_obj_create); } -static int luavgl_obj_delete(lua_State *L) { +static int luavgl_obj_delete(lua_State *L) +{ luavgl_obj_t *lobj; /** @@ -146,14 +177,15 @@ static int luavgl_obj_delete(lua_State *L) { lua_pushnil(L); lua_rawset(L, LUA_REGISTRYINDEX); - debug("delete obj: %p\n", lobj->obj); + LV_LOG_INFO("delete obj: %p", lobj->obj); lobj->obj = NULL; lua_pop(L, 1); /* remove the userdata para */ return 0; } -static int luavgl_obj_clean(lua_State *L) { +static int luavgl_obj_clean(lua_State *L) +{ luavgl_obj_t *lobj = luavgl_to_lobj(L, -1); if (lobj == NULL || lobj->obj == NULL) return 0; @@ -170,31 +202,36 @@ static int luavgl_obj_clean(lua_State *L) { luavgl_obj_delete(L); } - lua_pop(L, 1); /* remove the userdata para */ - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_set(lua_State *L) { +static int luavgl_obj_set(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); if (!lua_istable(L, -1)) { - luaL_error(L, "expect a table on 2nd para."); - return 0; + luaL_error(L, "expect a table on 2nd para"); + lua_settop(L, 1); + return 1; } luavgl_setup_obj(L, obj); - return 0; + + lua_settop(L, 1); + return 1; } /** * obj:align_to({base=base, type=type, x_ofs=0, y_ofs=0}) */ -static int luavgl_obj_align_to(lua_State *L) { +static int luavgl_obj_align_to(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); if (!lua_istable(L, 2)) { - debug("para should be table."); - return luaL_argerror(L, 2, "should be table."); + LV_LOG_ERROR("para should be table"); + return luaL_argerror(L, 2, "should be table"); } lua_getfield(L, 2, "type"); @@ -205,7 +242,7 @@ static int luavgl_obj_align_to(lua_State *L) { lv_obj_t *base = luavgl_to_lobj(L, -1)->obj; lua_pop(L, 1); if (base == NULL) { - debug("base is not lua obj"); + LV_LOG_ERROR("base is not lua obj"); return luaL_argerror(L, -1, "base is not lua obj"); } @@ -218,17 +255,22 @@ static int luavgl_obj_align_to(lua_State *L) { lua_pop(L, 1); lv_obj_align_to(obj, base, align, x_ofs, y_ofs); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_set_parent(lua_State *L) { +static int luavgl_obj_set_parent(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_t *parent = luavgl_to_obj(L, 2); lv_obj_set_parent(obj, parent); - return 0; + lua_pop(L, 1); + return 1; } -static int luavgl_obj_get_screen(lua_State *L) { +static int luavgl_obj_get_screen(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_t *screen = lv_obj_get_screen(obj); @@ -246,7 +288,8 @@ static int luavgl_obj_get_screen(lua_State *L) { return 1; } -static int luavgl_obj_get_parent(lua_State *L) { +static int luavgl_obj_get_parent(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_t *parent = lv_obj_get_parent(obj); @@ -263,7 +306,8 @@ static int luavgl_obj_get_parent(lua_State *L) { return 1; } -static int luavgl_obj_set_get_parent(lua_State *L) { +static int luavgl_obj_set_get_parent(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); if (!lua_isnoneornil(L, 2)) { lv_obj_t *parent = luavgl_to_obj(L, 2); @@ -273,7 +317,8 @@ static int luavgl_obj_set_get_parent(lua_State *L) { return luavgl_obj_get_parent(L); } -static int luavgl_obj_get_child(lua_State *L) { +static int luavgl_obj_get_child(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int id = luavgl_tointeger(L, 2); @@ -293,13 +338,15 @@ static int luavgl_obj_get_child(lua_State *L) { return 1; } -static int luavgl_obj_get_child_cnt(lua_State *L) { +static int luavgl_obj_get_child_cnt(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushinteger(L, lv_obj_get_child_cnt(obj)); return 1; } -static int luavgl_obj_get_state(lua_State *L) { +static int luavgl_obj_get_state(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_state_t state = lv_obj_get_state(obj); lua_pushinteger(L, state); @@ -312,7 +359,8 @@ static int luavgl_obj_get_state(lua_State *L) { * obj:scroll_to({x=10, anim=true}) * obj:scroll_to({x=10, y=100, anim=false}) */ -static int luavgl_obj_scroll_to(lua_State *L) { +static int luavgl_obj_scroll_to(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); if (!lua_istable(L, -1)) { @@ -338,176 +386,231 @@ static int luavgl_obj_scroll_to(lua_State *L) { } lua_pop(L, 1); - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_is_visible(lua_State *L) { +static int luavgl_obj_is_visible(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushboolean(L, lv_obj_is_visible(obj)); return 1; } -static int luavgl_obj_add_flag(lua_State *L) { +static int luavgl_obj_add_flag(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_flag_t flag = lua_tointeger(L, 2); lv_obj_add_flag(obj, flag); - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_clear_flag(lua_State *L) { +static int luavgl_obj_clear_flag(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_flag_t flag = lua_tointeger(L, 2); lv_obj_clear_flag(obj, flag); - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_add_state(lua_State *L) { +static int luavgl_obj_add_state(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_state_t state = lua_tointeger(L, 2); lv_obj_add_state(obj, state); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_clear_state(lua_State *L) { +static int luavgl_obj_clear_state(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_state_t state = lua_tointeger(L, 2); lv_obj_clear_state(obj, state); - return 0; + + lua_settop(L, 1); + return 1; } /** * obj:scroll_by(x, y, anim_en) */ -static int luavgl_obj_scroll_by(lua_State *L) { +static int luavgl_obj_scroll_by(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int x = luavgl_tointeger(L, 2); int y = luavgl_tointeger(L, 3); int anim_en = luavgl_tointeger(L, 4); lv_obj_scroll_by(obj, x, y, anim_en); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_scroll_by_bounded(lua_State *L) { +static int luavgl_obj_scroll_by_bounded(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int dx = luavgl_tointeger(L, 2); int dy = luavgl_tointeger(L, 3); int anim_en = luavgl_tointeger(L, 4); lv_obj_scroll_by_bounded(obj, dx, dy, anim_en); - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_scroll_to_view(lua_State *L) { +static int luavgl_obj_scroll_to_view(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int anim_en = luavgl_tointeger(L, 2); lv_obj_scroll_to_view(obj, anim_en); - return 0; + lua_settop(L, 1); + return 1; } -static int luavgl_obj_scroll_to_view_recursive(lua_State *L) { +static int luavgl_obj_scroll_to_view_recursive(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int anim_en = luavgl_tointeger(L, 2); lv_obj_scroll_to_view_recursive(obj, anim_en); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_scroll_by_raw(lua_State *L) { +static int luavgl_obj_scroll_by_raw(lua_State *L) +{ +#if LV_VERSION_CHECK(8, 3, 0) lv_obj_t *obj = luavgl_to_obj(L, 1); int x = luavgl_tointeger(L, 2); int y = luavgl_tointeger(L, 3); _lv_obj_scroll_by_raw(obj, x, y); - return 0; +#endif + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_is_scrolling(lua_State *L) { +static int luavgl_obj_is_scrolling(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushboolean(L, lv_obj_is_scrolling(obj)); return 1; } -static int luavgl_obj_scrollbar_invalidate(lua_State *L) { +static int luavgl_obj_scrollbar_invalidate(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_scrollbar_invalidate(obj); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_readjust_scroll(lua_State *L) { +static int luavgl_obj_readjust_scroll(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); int anim_en = luavgl_tointeger(L, 2); lv_obj_readjust_scroll(obj, anim_en); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_is_editable(lua_State *L) { +static int luavgl_obj_is_editable(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushboolean(L, lv_obj_is_editable(obj)); return 1; } -static int luavgl_obj_is_group_def(lua_State *L) { +static int luavgl_obj_is_group_def(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushboolean(L, lv_obj_is_group_def(obj)); return 1; } -static int luavgl_obj_is_layout_positioned(lua_State *L) { +static int luavgl_obj_is_layout_positioned(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_pushboolean(L, lv_obj_is_layout_positioned(obj)); return 1; } -static int luavgl_obj_mark_layout_as_dirty(lua_State *L) { +static int luavgl_obj_mark_layout_as_dirty(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_mark_layout_as_dirty(obj); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_center(lua_State *L) { +static int luavgl_obj_center(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_center(obj); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_invalidate(lua_State *L) { +static int luavgl_obj_invalidate(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_invalidate(obj); - return 0; + + return 1; } -static int luavgl_obj_set_flex_flow(lua_State *L) { +static int luavgl_obj_set_flex_flow(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_flex_flow_t flow = luavgl_tointeger(L, 2); lv_obj_set_flex_flow(obj, flow); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_set_flex_align(lua_State *L) { +static int luavgl_obj_set_flex_align(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_flex_align_t m = luavgl_tointeger(L, 2); lv_flex_align_t c = luavgl_tointeger(L, 3); lv_flex_align_t t = luavgl_tointeger(L, 4); lv_obj_set_flex_align(obj, m, c, t); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_set_flex_grow(lua_State *L) { +static int luavgl_obj_set_flex_grow(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); uint8_t grow = luavgl_tointeger(L, 2); lv_obj_set_flex_grow(obj, grow); - return 0; + + lua_settop(L, 1); + return 1; } -static int luavgl_obj_indev_search(lua_State *L) { +static int luavgl_obj_indev_search(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_point_t point; if (lua_istable(L, 2)) { @@ -537,7 +640,8 @@ static int luavgl_obj_indev_search(lua_State *L) { return 1; } -static int luavgl_obj_get_coords(lua_State *L) { +static int luavgl_obj_get_coords(lua_State *L) +{ lv_area_t area; lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_get_coords(obj, &area); @@ -561,7 +665,8 @@ static int luavgl_obj_get_coords(lua_State *L) { /** * get object real position using lv_obj_get_x/x2/y/y2 */ -static int luavgl_obj_get_pos(lua_State *L) { +static int luavgl_obj_get_pos(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lua_newtable(L); @@ -580,39 +685,18 @@ static int luavgl_obj_get_pos(lua_State *L) { return 1; } -/** - * set this object as the current selection - */ -static int luavgl_obj_focus(lua_State *L) { - lv_obj_t *obj = luavgl_to_obj(L, 1); - - lv_group_t *group = lv_obj_get_group(obj); - if (group == NULL) { - return 0; - } - lv_group_focus_obj(obj); - - return 0; -} - -static int luavgl_obj_move_to_index(lua_State *L) { - lv_obj_t *obj = luavgl_to_obj(L, 1); - int idx = luavgl_tointeger(L, 2); - - lv_obj_move_to_index(obj, idx); - return 0; -} - /** * Remove all animations associates to this object */ -static int luavgl_obj_remove_anim_all(lua_State *L) { +static int luavgl_obj_remove_anim_all(lua_State *L) +{ lv_obj_t *obj = luavgl_to_obj(L, 1); lv_anim_del(obj, NULL); return 1; } -static int luavgl_obj_gc(lua_State *L) { +static int luavgl_obj_gc(lua_State *L) +{ if (lua_type(L, 1) != LUA_TUSERDATA) { /* If t = setmetatable({}, obj_meta_table), this will happen when t is * gc;ed. Currently all metatables for classes based on obj, that has no own @@ -621,7 +705,7 @@ static int luavgl_obj_gc(lua_State *L) { return 0; } - debug("\n"); + LV_LOG_INFO("enter"); luavgl_obj_t *lobj = lua_touserdata(L, 1); if (lobj == NULL || lobj->obj == NULL) { @@ -629,70 +713,69 @@ static int luavgl_obj_gc(lua_State *L) { return 0; } - debug("GC for obj: %p\n", lobj->obj); + LV_LOG_INFO("GC for obj: %p", lobj->obj); luavgl_obj_delete(L); return 0; } static const luaL_Reg luavgl_obj_methods[] = { - {"set", luavgl_obj_set}, - {"set_style", luavgl_obj_set_style}, - {"align_to", luavgl_obj_align_to}, - {"delete", luavgl_obj_delete}, - {"clean", luavgl_obj_clean}, - - /* misc. functions */ - {"parent", luavgl_obj_set_get_parent}, - {"set_parent", luavgl_obj_set_parent}, - {"get_parent", luavgl_obj_get_parent}, - {"get_child", luavgl_obj_get_child}, - {"get_child_cnt", luavgl_obj_get_child_cnt}, - {"get_screen", luavgl_obj_get_screen}, - {"get_state", luavgl_obj_get_state}, - {"scroll_to", luavgl_obj_scroll_to}, - {"is_scrolling", luavgl_obj_is_scrolling}, - {"is_visible", luavgl_obj_is_visible}, - {"add_flag", luavgl_obj_add_flag}, - {"clear_flag", luavgl_obj_clear_flag}, - {"add_state", luavgl_obj_add_state}, - {"clear_state", luavgl_obj_clear_state}, - {"add_style", luavgl_obj_add_style}, - {"remove_style", luavgl_obj_remove_style}, - {"remove_style_all", luavgl_obj_remove_style_all}, - {"scroll_by", luavgl_obj_scroll_by}, - {"scroll_by_bounded", luavgl_obj_scroll_by_bounded}, - {"scroll_to_view", luavgl_obj_scroll_to_view}, + {"set", luavgl_obj_set }, + {"set_style", luavgl_obj_set_style }, + {"align_to", luavgl_obj_align_to }, + {"delete", luavgl_obj_delete }, + {"clean", luavgl_obj_clean }, + + /* misc. functions */ + {"parent", luavgl_obj_set_get_parent }, + {"set_parent", luavgl_obj_set_parent }, + {"get_parent", luavgl_obj_get_parent }, + {"get_child", luavgl_obj_get_child }, + {"get_child_cnt", luavgl_obj_get_child_cnt }, + {"get_screen", luavgl_obj_get_screen }, + {"get_state", luavgl_obj_get_state }, + {"scroll_to", luavgl_obj_scroll_to }, + {"is_scrolling", luavgl_obj_is_scrolling }, + {"is_visible", luavgl_obj_is_visible }, + {"add_flag", luavgl_obj_add_flag }, + {"clear_flag", luavgl_obj_clear_flag }, + {"add_state", luavgl_obj_add_state }, + {"clear_state", luavgl_obj_clear_state }, + {"add_style", luavgl_obj_add_style }, + {"remove_style", luavgl_obj_remove_style }, + {"remove_style_all", luavgl_obj_remove_style_all }, + {"scroll_by", luavgl_obj_scroll_by }, + {"scroll_by_bounded", luavgl_obj_scroll_by_bounded }, + {"scroll_to_view", luavgl_obj_scroll_to_view }, {"scroll_to_view_recursive", luavgl_obj_scroll_to_view_recursive}, - {"scroll_by_raw", luavgl_obj_scroll_by_raw}, - {"scrollbar_invalidate", luavgl_obj_scrollbar_invalidate}, - {"readjust_scroll", luavgl_obj_readjust_scroll}, - {"is_editable", luavgl_obj_is_editable}, - {"is_group_def", luavgl_obj_is_group_def}, - {"is_layout_positioned", luavgl_obj_is_layout_positioned}, - {"mark_layout_as_dirty", luavgl_obj_mark_layout_as_dirty}, - {"center", luavgl_obj_center}, - {"invalidate", luavgl_obj_invalidate}, - {"set_flex_flow", luavgl_obj_set_flex_flow}, - {"set_flex_align", luavgl_obj_set_flex_align}, - {"set_flex_grow", luavgl_obj_set_flex_grow}, - {"indev_search", luavgl_obj_indev_search}, - {"get_coords", luavgl_obj_get_coords}, - {"get_pos", luavgl_obj_get_pos}, - {"focus", luavgl_obj_focus}, - {"move_to_index", luavgl_obj_move_to_index}, - - {"onevent", luavgl_obj_on_event}, - {"onPressed", luavgl_obj_on_pressed}, - {"onClicked", luavgl_obj_on_clicked}, - {"onShortClicked", luavgl_obj_on_short_clicked}, - {"anim", luavgl_anim_create}, - {"Anim", luavgl_anim_create}, - {"remove_all_anim", luavgl_obj_remove_anim_all}, /* remove all */ - {NULL, NULL}, + {"scroll_by_raw", luavgl_obj_scroll_by_raw }, + {"scrollbar_invalidate", luavgl_obj_scrollbar_invalidate }, + {"readjust_scroll", luavgl_obj_readjust_scroll }, + {"is_editable", luavgl_obj_is_editable }, + {"is_group_def", luavgl_obj_is_group_def }, + {"is_layout_positioned", luavgl_obj_is_layout_positioned }, + {"mark_layout_as_dirty", luavgl_obj_mark_layout_as_dirty }, + {"center", luavgl_obj_center }, + {"invalidate", luavgl_obj_invalidate }, + {"set_flex_flow", luavgl_obj_set_flex_flow }, + {"set_flex_align", luavgl_obj_set_flex_align }, + {"set_flex_grow", luavgl_obj_set_flex_grow }, + {"indev_search", luavgl_obj_indev_search }, + {"get_coords", luavgl_obj_get_coords }, + {"get_pos", luavgl_obj_get_pos }, + + {"onevent", luavgl_obj_on_event }, + {"onPressed", luavgl_obj_on_pressed }, + {"onClicked", luavgl_obj_on_clicked }, + {"onShortClicked", luavgl_obj_on_short_clicked }, + {"anim", luavgl_anim_create }, + {"Anim", luavgl_anim_create }, + {"remove_all_anim", luavgl_obj_remove_anim_all }, /* remove all */ + {NULL, NULL }, }; -static void luavgl_obj_init(lua_State *L) { +static void luavgl_obj_init(lua_State *L) +{ /* base lv_obj */ luavgl_obj_newmetatable(L, &lv_obj_class, "lv_obj", luavgl_obj_methods); lua_pushcfunction(L, luavgl_obj_gc); @@ -718,16 +801,16 @@ static void luavgl_obj_init(lua_State *L) { } static const luavgl_value_setter_t obj_property_table[] = { - {"x", 0, {.setter = (setter_int_t)lv_obj_set_x}}, - {"y", 0, {.setter = (setter_int_t)lv_obj_set_y}}, - {"w", 0, {.setter = (setter_int_t)lv_obj_set_width}}, - {"h", 0, {.setter = (setter_int_t)lv_obj_set_height}}, - {"align", SETTER_TYPE_STACK, {.setter_stack = _lv_obj_set_align}}, - - {"scrollbar_mode", 0, {.setter = (setter_int_t)lv_obj_set_scrollbar_mode}}, - {"scroll_dir", 0, {.setter = (setter_int_t)lv_obj_set_scroll_dir}}, - {"scroll_snap_x", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_x}}, - {"scroll_snap_y", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_y}}, + {"x", 0, {.setter = (setter_int_t)lv_obj_set_x} }, + {"y", 0, {.setter = (setter_int_t)lv_obj_set_y} }, + {"w", 0, {.setter = (setter_int_t)lv_obj_set_width} }, + {"h", 0, {.setter = (setter_int_t)lv_obj_set_height} }, + {"align", SETTER_TYPE_STACK, {.setter_stack = _lv_obj_set_align} }, + + {"scrollbar_mode", 0, {.setter = (setter_int_t)lv_obj_set_scrollbar_mode}}, + {"scroll_dir", 0, {.setter = (setter_int_t)lv_obj_set_scroll_dir} }, + {"scroll_snap_x", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_x} }, + {"scroll_snap_y", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_y} }, }; /** @@ -741,8 +824,17 @@ static const luavgl_value_setter_t obj_property_table[] = { * stack[-2]: key(property name) * stack[-1]: value(could be any lua data) */ -LUALIB_API int luavgl_obj_set_property_kv(lua_State *L, void *data) { +LUALIB_API int luavgl_obj_set_property_kv(lua_State *L, void *data) +{ lv_obj_t *obj = data; + + /* Check for integer key with userdata as value */ + if (lua_type(L, -2) == LUA_TNUMBER && lua_type(L, -1) == LUA_TUSERDATA) { + lv_obj_t *child = luavgl_to_obj(L, -1); + lv_obj_set_parent(child, obj); + return 0; + } + int ret = luavgl_set_property(L, obj, obj_property_table); if (ret == 0) @@ -753,7 +845,8 @@ LUALIB_API int luavgl_obj_set_property_kv(lua_State *L, void *data) { } LUALIB_API int luavgl_obj_create_helper(lua_State *L, - lv_obj_t *(*create)(lv_obj_t *parent)) { + lv_obj_t *(*create)(lv_obj_t *parent)) +{ luavgl_ctx_t *ctx = luavgl_context(L); lv_obj_t *parent; @@ -765,7 +858,7 @@ LUALIB_API int luavgl_obj_create_helper(lua_State *L, lua_remove(L, 1); } - debug("create obj on: %p\n", parent); + LV_LOG_INFO("create obj on: %p", parent); lv_obj_t *obj = create(parent); luavgl_add_lobj(L, obj)->lua_created = true; @@ -790,7 +883,7 @@ LUALIB_API int luavgl_obj_create_helper(lua_State *L, lua_rawget(L, LUA_REGISTRYINDEX); } - debug("create obj: %p\n", obj); + LV_LOG_INFO("create obj: %p", obj); return 1; } @@ -799,7 +892,8 @@ LUALIB_API int luavgl_obj_create_helper(lua_State *L, * If no metatable not found for this obj class, then lv_obj_class metatable is * used */ -LUALIB_API luavgl_obj_t *luavgl_add_lobj(lua_State *L, lv_obj_t *obj) { +LUALIB_API luavgl_obj_t *luavgl_add_lobj(lua_State *L, lv_obj_t *obj) +{ luavgl_obj_t *lobj; /* In rare case, obj may be deleted but not gc'ed in lua, and lvgl quickly @@ -817,16 +911,18 @@ LUALIB_API luavgl_obj_t *luavgl_add_lobj(lua_State *L, lv_obj_t *obj) { if (luavgl_obj_getmetatable(L, obj->class_p) == LUA_TNIL) { lua_pop(L, 1); - debug("cannot find metatable for class: %p\n", obj->class_p); + LV_LOG_ERROR("cannot find metatable for class: %p", obj->class_p); /* use base obj metatable instead */ luavgl_obj_getmetatable(L, &lv_obj_class); } lua_setmetatable(L, -2); - memset(lobj, 0, sizeof(*lobj)); - luavgl_obj_event_init(lobj); + lv_memset(lobj, 0, sizeof(*lobj)); lobj->obj = obj; + + /* Init event array to store events added from lua. */ + lv_array_init(&lobj->events, 0, sizeof(struct event_callback_s *)); lv_obj_add_event_cb(obj, obj_delete_cb, LV_EVENT_DELETE, L); /* registry[obj] = lobj */ diff --git a/lib/luavgl/src/private.h b/lib/luavgl/src/private.h index 20aa802f..51a46251 100644 --- a/lib/luavgl/src/private.h +++ b/lib/luavgl/src/private.h @@ -6,19 +6,6 @@ #include #include -#include - -/* clang-format off */ -#define debug(format, ...) -// fprintf(stderr, "[luavgl] %s: " format, __FUNCTION__, ##__VA_ARGS__) -// syslog(LOG_DEBUG, "[luavgl] %s: " format, __FUNCTION__, ##__VA_ARGS__) -/* clang-format on */ - -struct event_callback_s { - lv_event_code_t code; - struct _lv_event_dsc_t *dsc; - int ref; /* ref to callback */ -}; /* variable array if n_callback > 1 */ static void dumpstack(lua_State *L); static void dumptable(lua_State *L, int index); @@ -27,7 +14,6 @@ static void dumptable(lua_State *L, int index); int luavgl_obj_getmetatable(lua_State *L, const lv_obj_class_t *clz); int luavgl_obj_setmetatable(lua_State *L, int idx, const lv_obj_class_t *clz); -static void luavgl_obj_event_init(luavgl_obj_t *lobj); static void luavgl_obj_remove_event_all(lua_State *L, luavgl_obj_t *obj); /* util functions */ diff --git a/lib/luavgl/src/style.c b/lib/luavgl/src/style.c index 2ea3cff8..95c9f363 100644 --- a/lib/luavgl/src/style.c +++ b/lib/luavgl/src/style.c @@ -54,10 +54,13 @@ static const struct style_map_s { {"transform_height", LV_STYLE_TRANSFORM_HEIGHT, STYLE_TYPE_INT }, {"translate_x", LV_STYLE_TRANSLATE_X, STYLE_TYPE_INT }, {"translate_y", LV_STYLE_TRANSLATE_Y, STYLE_TYPE_INT }, - {"transform_zoom", LV_STYLE_TRANSFORM_ZOOM, STYLE_TYPE_INT }, - {"transform_angle", LV_STYLE_TRANSFORM_ANGLE, STYLE_TYPE_INT }, + {"transform_scale_x", LV_STYLE_TRANSFORM_SCALE_X, STYLE_TYPE_INT }, + {"transform_scale_y", LV_STYLE_TRANSFORM_SCALE_X, STYLE_TYPE_INT }, + {"transform_rotation", LV_STYLE_TRANSFORM_ROTATION, STYLE_TYPE_INT }, +#if LV_VERSION_CHECK(8, 3, 0) {"transform_pivot_x", LV_STYLE_TRANSFORM_PIVOT_X, STYLE_TYPE_INT }, {"transform_pivot_y", LV_STYLE_TRANSFORM_PIVOT_Y, STYLE_TYPE_INT }, +#endif {"pad_top", LV_STYLE_PAD_TOP, STYLE_TYPE_INT }, {"pad_bottom", LV_STYLE_PAD_BOTTOM, STYLE_TYPE_INT }, {"pad_left", LV_STYLE_PAD_LEFT, STYLE_TYPE_INT }, @@ -71,12 +74,11 @@ static const struct style_map_s { {"bg_grad_dir", LV_STYLE_BG_GRAD_DIR, STYLE_TYPE_INT }, {"bg_main_stop", LV_STYLE_BG_MAIN_STOP, STYLE_TYPE_INT }, {"bg_grad_stop", LV_STYLE_BG_GRAD_STOP, STYLE_TYPE_INT }, - {"bg_dither_mode", LV_STYLE_BG_DITHER_MODE, STYLE_TYPE_INT }, - {"bg_img_src", LV_STYLE_BG_IMG_SRC, STYLE_TYPE_IMGSRC }, - {"bg_img_opa", LV_STYLE_BG_IMG_OPA, STYLE_TYPE_INT }, - {"bg_img_recolor", LV_STYLE_BG_IMG_RECOLOR, STYLE_TYPE_COLOR }, - {"bg_img_recolor_opa", LV_STYLE_BG_IMG_RECOLOR_OPA, STYLE_TYPE_INT }, - {"bg_img_tiled", LV_STYLE_BG_IMG_TILED, STYLE_TYPE_INT }, + {"bg_image_src", LV_STYLE_BG_IMAGE_SRC, STYLE_TYPE_IMGSRC }, + {"bg_image_opa", LV_STYLE_BG_IMAGE_OPA, STYLE_TYPE_INT }, + {"bg_image_recolor", LV_STYLE_BG_IMAGE_RECOLOR, STYLE_TYPE_COLOR }, + {"bg_image_recolor_opa", LV_STYLE_BG_IMAGE_RECOLOR_OPA, STYLE_TYPE_INT }, + {"bg_image_tiled", LV_STYLE_BG_IMAGE_TILED, STYLE_TYPE_INT }, {"border_color", LV_STYLE_BORDER_COLOR, STYLE_TYPE_COLOR }, {"border_opa", LV_STYLE_BORDER_OPA, STYLE_TYPE_INT }, {"border_width", LV_STYLE_BORDER_WIDTH, STYLE_TYPE_INT }, @@ -87,14 +89,14 @@ static const struct style_map_s { {"outline_opa", LV_STYLE_OUTLINE_OPA, STYLE_TYPE_INT }, {"outline_pad", LV_STYLE_OUTLINE_PAD, STYLE_TYPE_INT }, {"shadow_width", LV_STYLE_SHADOW_WIDTH, STYLE_TYPE_INT }, - {"shadow_ofs_x", LV_STYLE_SHADOW_OFS_X, STYLE_TYPE_INT }, - {"shadow_ofs_y", LV_STYLE_SHADOW_OFS_Y, STYLE_TYPE_INT }, + {"shadow_offset_x", LV_STYLE_SHADOW_OFFSET_X, STYLE_TYPE_INT }, + {"shadow_offset_y", LV_STYLE_SHADOW_OFFSET_Y, STYLE_TYPE_INT }, {"shadow_spread", LV_STYLE_SHADOW_SPREAD, STYLE_TYPE_INT }, {"shadow_color", LV_STYLE_SHADOW_COLOR, STYLE_TYPE_COLOR }, {"shadow_opa", LV_STYLE_SHADOW_OPA, STYLE_TYPE_INT }, - {"img_opa", LV_STYLE_IMG_OPA, STYLE_TYPE_INT }, - {"img_recolor", LV_STYLE_IMG_RECOLOR, STYLE_TYPE_COLOR }, - {"img_recolor_opa", LV_STYLE_IMG_RECOLOR_OPA, STYLE_TYPE_INT }, + {"image_opa", LV_STYLE_IMAGE_OPA, STYLE_TYPE_INT }, + {"image_recolor", LV_STYLE_IMAGE_RECOLOR, STYLE_TYPE_COLOR }, + {"image_recolor_opa", LV_STYLE_IMAGE_RECOLOR_OPA, STYLE_TYPE_INT }, {"line_width", LV_STYLE_LINE_WIDTH, STYLE_TYPE_INT }, {"line_dash_width", LV_STYLE_LINE_DASH_WIDTH, STYLE_TYPE_INT }, {"line_dash_gap", LV_STYLE_LINE_DASH_GAP, STYLE_TYPE_INT }, @@ -102,7 +104,7 @@ static const struct style_map_s { {"line_color", LV_STYLE_LINE_COLOR, STYLE_TYPE_INT }, {"line_opa", LV_STYLE_LINE_OPA, STYLE_TYPE_INT }, {"arc_width", LV_STYLE_ARC_WIDTH, STYLE_TYPE_INT }, - {"arc_img_src", LV_STYLE_ARC_IMG_SRC, STYLE_TYPE_IMGSRC }, + {"arc_image_src", LV_STYLE_ARC_IMAGE_SRC, STYLE_TYPE_IMGSRC }, {"arc_rounded", LV_STYLE_ARC_ROUNDED, STYLE_TYPE_INT }, {"arc_color", LV_STYLE_ARC_COLOR, STYLE_TYPE_COLOR }, {"arc_opa", LV_STYLE_ARC_OPA, STYLE_TYPE_INT }, @@ -118,7 +120,6 @@ static const struct style_map_s { {"opa", LV_STYLE_OPA, STYLE_TYPE_INT }, {"color_filter_opa", LV_STYLE_COLOR_FILTER_OPA, STYLE_TYPE_INT }, {"anim_time", LV_STYLE_ANIM_TIME, STYLE_TYPE_INT }, - {"anim_speed", LV_STYLE_ANIM_SPEED, STYLE_TYPE_INT }, {"blend_mode", LV_STYLE_BLEND_MODE, STYLE_TYPE_INT }, {"layout", LV_STYLE_LAYOUT, STYLE_TYPE_INT }, {"base_dir", LV_STYLE_BASE_DIR, STYLE_TYPE_INT }, @@ -126,7 +127,9 @@ static const struct style_map_s { /* need to build pointer from table parameter */ {"bg_grad", LV_STYLE_BG_GRAD, STYLE_TYPE_SPECIAL }, /* pointer from table */ {"color_filter_dsc", LV_STYLE_COLOR_FILTER_DSC, STYLE_TYPE_SPECIAL }, /**/ +#if LV_VERSION_CHECK(8, 3, 0) {"anim", LV_STYLE_ANIM, STYLE_TYPE_SPECIAL }, /* anim para */ +#endif {"transition", LV_STYLE_TRANSITION, STYLE_TYPE_SPECIAL }, /* transition */ /* styles combined */ @@ -166,12 +169,14 @@ static void lv_style_set_cb(lv_style_prop_t prop, lv_style_value_t value, lv_style_set_prop(s, prop, value); } +#if LV_VERSION_CHECK(8, 3, 0) static void lv_style_set_inherit_cb(lv_style_prop_t prop, lv_style_value_t value, void *args) { lv_style_t *s = args; lv_style_set_prop_meta(s, prop, LV_STYLE_PROP_META_INHERIT); } +#endif static uint8_t to_int(char c) { @@ -193,33 +198,53 @@ static lv_flex_align_t luavgl_to_flex_align(lua_State *L, int idx) return LV_FLEX_ALIGN_START; const char *str = lua_tostring(L, idx); - if (strcmp("flex-start", str) == 0) + if (lv_strcmp("flex-start", str) == 0) return LV_FLEX_ALIGN_START; - if (strcmp("flex-end", str) == 0) + if (lv_strcmp("flex-end", str) == 0) return LV_FLEX_ALIGN_END; - if (strcmp("center", str) == 0) + if (lv_strcmp("center", str) == 0) return LV_FLEX_ALIGN_CENTER; - if (strcmp("space-evenly", str) == 0) + if (lv_strcmp("space-evenly", str) == 0) return LV_FLEX_ALIGN_SPACE_EVENLY; - if (strcmp("space-around", str) == 0) + if (lv_strcmp("space-around", str) == 0) return LV_FLEX_ALIGN_SPACE_AROUND; - if (strcmp("space-between", str) == 0) + if (lv_strcmp("space-between", str) == 0) return LV_FLEX_ALIGN_SPACE_BETWEEN; return LV_FLEX_ALIGN_START; } +static char *luavgl_strstr(const char *haystack, const char *needle) { + while (*haystack != '\0') { + const char *h = haystack; + const char *n = needle; + + while (*n != '\0' && *h == *n) { + h++; + n++; + } + + if (*n == '\0') { + return (char *)haystack; + } + + haystack++; + } + + return NULL; +} + static int luavgl_set_flex_layout_kv(lua_State *L, style_set_cb_t cb, void *args) { if (!lua_istable(L, -1)) { - debug("para should be table."); - return luaL_argerror(L, -1, "should be table."); + LV_LOG_ERROR("para should be table"); + return luaL_argerror(L, -1, "should be table"); } const char *str; @@ -234,14 +259,14 @@ static int luavgl_set_flex_layout_kv(lua_State *L, style_set_cb_t cb, if (lua_type(L, -1) == LUA_TSTRING) { str = lua_tostring(L, -1); /* starts with */ - if (strncmp("row", str, 3) == 0) { + if (lv_strcmp("row", str) == 0) { flow = LV_FLEX_FLOW_ROW; - } else if (strncmp("column", str, 3) == 0) { + } else if (lv_strcmp("column", str) == 0) { flow = LV_FLEX_FLOW_COLUMN; } /* if reverse presents */ - if (strstr(str, "-reverse")) { + if (luavgl_strstr(str, "-reverse")) { flow |= _LV_FLEX_REVERSE; } } @@ -254,9 +279,9 @@ static int luavgl_set_flex_layout_kv(lua_State *L, style_set_cb_t cb, lua_getfield(L, -1, "flex_wrap"); if (lua_type(L, -1) == LUA_TSTRING) { str = lua_tostring(L, -1); - if (strcmp("wrap", str) == 0) { + if (lv_strcmp("wrap", str) == 0) { flow |= _LV_FLEX_WRAP; - } else if (strcmp("wrap-reverse", str) == 0) { + } else if (lv_strcmp("wrap-reverse", str) == 0) { flow |= _LV_FLEX_WRAP | _LV_FLEX_REVERSE; } /* else: normal */ @@ -316,7 +341,7 @@ static inline bool luavgl_is_style_inherit(lua_State *L) { const char *str; return (lua_type(L, -1) == LUA_TSTRING) && (str = lua_tostring(L, -1)) && - (strcmp(str, "inherit") == 0); + (lv_strcmp(str, "inherit") == 0); } /** @@ -330,7 +355,7 @@ static int luavgl_set_style_kv(lua_State *L, style_set_cb_t cb, void *args) { const char *key = lua_tostring(L, -2); if (key == NULL) { - debug("Null key, ignored.\n"); + LV_LOG_WARN("Null key, ignored"); return -1; } @@ -338,7 +363,7 @@ static int luavgl_set_style_kv(lua_State *L, style_set_cb_t cb, void *args) lv_style_value_t value = {0}; const struct style_map_s *p = NULL; for (int i = 0; i < STYLE_MAP_LEN; i++) { - if (strcmp(key, g_style_map[i].name) == 0) { + if (lv_strcmp(key, g_style_map[i].name) == 0) { p = &g_style_map[i]; break; } @@ -374,8 +399,18 @@ static int luavgl_set_style_kv(lua_State *L, style_set_cb_t cb, void *args) } } + lv_style_prop_t prop = p->prop; + +#if LV_VERSION_CHECK(9, 0, 0) + lv_style_prop_t mask = ~0; +#elif LV_VERSION_CHECK(8, 3, 0) + lv_style_prop_t mask = ~LV_STYLE_PROP_FLAG_ALL; +#else + lv_style_prop_t mask = LV_STYLE_PROP_ANY; +#endif + if (p->type & STYLE_TYPE_SPECIAL) { - switch ((int)p->prop) { + switch ((int)prop) { /* style combinations */ case LV_STYLE_SIZE: cb(LV_STYLE_WIDTH, value, args); @@ -410,10 +445,10 @@ static int luavgl_set_style_kv(lua_State *L, style_set_cb_t cb, void *args) case LV_STYLE_COLOR_FILTER_DSC: break; - +#if LV_VERSION_CHECK(8, 3, 0) case LV_STYLE_ANIM: break; - +#endif case LV_STYLE_TRANSITION: break; @@ -442,8 +477,8 @@ static int luavgl_set_style_kv(lua_State *L, style_set_cb_t cb, void *args) default: break; } - } else if (p->prop <= _LV_STYLE_LAST_BUILT_IN_PROP) { - cb(p->prop, value, args); + } else if ((prop & mask) <= _LV_STYLE_LAST_BUILT_IN_PROP) { + cb(prop & mask, value, args); } else { return luaL_error(L, "unknown style"); } @@ -459,7 +494,7 @@ static int luavgl_style_set(lua_State *L) luavgl_style_t *s = luavgl_check_style(L, 1); if (!lua_istable(L, 2)) { - luaL_argerror(L, 2, "expect a table on 2nd para."); + luaL_argerror(L, 2, "expect a table on 2nd para"); return 0; } @@ -468,16 +503,21 @@ static int luavgl_style_set(lua_State *L) /* -1: value, -2: key */ if (!lua_isstring(L, -2)) { /* we expect string as key, ignore it if not */ - debug("ignore non-string key in table.\n"); + LV_LOG_WARN("ignore non-string key in table"); lua_pop(L, 1); continue; } +#if LV_VERSION_CHECK(8, 3, 0) /* special value check */ bool inherit = luavgl_is_style_inherit(L); luavgl_set_style_kv(L, inherit ? lv_style_set_inherit_cb : lv_style_set_cb, s); +#else + luavgl_set_style_kv(L, lv_style_set_cb, s); +#endif + lua_pop(L, 1); /* remove value, keep the key to continue. */ } @@ -497,7 +537,7 @@ static int luavgl_style_create(lua_State *L) { luavgl_style_t *s = malloc(sizeof(luavgl_style_t)); if (s == NULL) { - return luaL_error(L, "No memory."); + return luaL_error(L, "No memory"); } lv_style_init(&s->style); @@ -528,7 +568,7 @@ static int luavgl_style_remove_prop(lua_State *L) for (int i = 0; i < STYLE_MAP_LEN; i++) { const struct style_map_s *p = &g_style_map[i]; - if (strcmp(name, p->name) == 0) { + if (lv_strcmp(name, p->name) == 0) { lv_style_remove_prop(&s->style, p->prop); return 0; } @@ -553,7 +593,7 @@ static int luavgl_style_gc(lua_State *L) luavgl_style_t *s = luavgl_check_style(L, 1); lv_style_reset(&s->style); free(s); - debug("gc style:%p\n", s); + LV_LOG_INFO("gc style:%p", s); return 0; } @@ -573,6 +613,7 @@ static void obj_style_set_cb(lv_style_prop_t prop, lv_style_value_t value, lv_obj_set_local_style_prop(info->obj, prop, value, info->selector); } +#if LV_VERSION_CHECK(8, 3, 0) static void obj_style_inherit_set_cb(lv_style_prop_t prop, lv_style_value_t value, void *args) { @@ -580,6 +621,7 @@ static void obj_style_inherit_set_cb(lv_style_prop_t prop, lv_obj_set_local_style_prop_meta(info->obj, prop, LV_STYLE_PROP_META_INHERIT, info->selector); } +#endif static int luavgl_obj_set_style_kv(lua_State *L, lv_obj_t *obj, int selector) { @@ -588,11 +630,15 @@ static int luavgl_obj_set_style_kv(lua_State *L, lv_obj_t *obj, int selector) .selector = selector, }; +#if LV_VERSION_CHECK(8, 3, 0) /* special value check */ bool inherit = luavgl_is_style_inherit(L); return luavgl_set_style_kv( L, inherit ? obj_style_inherit_set_cb : obj_style_set_cb, &info); +#else + return luavgl_set_style_kv(L, obj_style_set_cb, &info); +#endif } /** @@ -602,12 +648,12 @@ static int luavgl_obj_set_style(lua_State *L) { lv_obj_t *obj = luavgl_to_obj(L, 1); if (obj == NULL) { - luaL_argerror(L, 1, "obj could already been deleted."); + luaL_argerror(L, 1, "obj could already been deleted"); return 0; } if (!lua_istable(L, 2)) { - luaL_argerror(L, 2, "expect a table on 2nd para."); + luaL_argerror(L, 2, "expect a table on 2nd para"); return 0; } @@ -622,7 +668,7 @@ static int luavgl_obj_set_style(lua_State *L) /* -1: value, -2: key */ if (!lua_isstring(L, -2)) { /* we expect string as key, ignore it if not */ - debug("ignore non-string key in table.\n"); + LV_LOG_WARN("ignore non-string key in table"); lua_pop(L, 1); continue; } diff --git a/lib/luavgl/src/timer.c b/lib/luavgl/src/timer.c index 4ee334ca..47b4a007 100644 --- a/lib/luavgl/src/timer.c +++ b/lib/luavgl/src/timer.c @@ -64,7 +64,7 @@ static int timer_set_para_cb(lua_State *L, void *data) int ret = luavgl_set_property(L, data, timer_property_table); if (ret != 0) { - debug("failed\n"); + LV_LOG_ERROR("failed"); } return ret; @@ -88,7 +88,7 @@ static int luavgl_timer_create(lua_State *L) { luavgl_timer_t *data = malloc(sizeof(luavgl_timer_t)); if (data == NULL) { - return luaL_error(L, "No memory."); + return luaL_error(L, "No memory"); } data->ref = LUA_NOREF; data->L = L; @@ -119,7 +119,7 @@ static int luavgl_timer_set(lua_State *L) { lv_timer_t *t = luavgl_check_timer(L, 1); if (t == NULL) { - return luaL_argerror(L, 1, "timer is null."); + return luaL_argerror(L, 1, "timer is null"); } luavgl_timer_setup(L, 2, t); @@ -130,7 +130,7 @@ static int luavgl_timer_ready(lua_State *L) { lv_timer_t *t = luavgl_check_timer(L, 1); if (t == NULL) { - return luaL_argerror(L, 1, "timer is null."); + return luaL_argerror(L, 1, "timer is null"); } lv_timer_ready(t); @@ -141,7 +141,7 @@ static int luavgl_timer_resume(lua_State *L) { lv_timer_t *t = luavgl_check_timer(L, 1); if (t == NULL) { - return luaL_argerror(L, 1, "timer is null."); + return luaL_argerror(L, 1, "timer is null"); } lv_timer_resume(t); @@ -152,7 +152,7 @@ static int luavgl_timer_pause(lua_State *L) { lv_timer_t *t = luavgl_check_timer(L, 1); if (t == NULL) { - return luaL_argerror(L, 1, "timer is null."); + return luaL_argerror(L, 1, "timer is null"); } lv_timer_pause(t); @@ -165,7 +165,7 @@ static int luavgl_timer_delete(lua_State *L) { lv_timer_t *t = luavgl_check_timer(L, 1); if (t == NULL) { - return luaL_argerror(L, 1, "timer is null."); + return luaL_argerror(L, 1, "timer is null"); } luavgl_timer_t *data = t->user_data; @@ -181,7 +181,7 @@ static int luavgl_timer_delete(lua_State *L) /* we can only release memory in gc, since we need t->use_data */ lv_timer_pause(t); - debug("delete timer:%p\n", t); + LV_LOG_INFO("delete timer:%p", t); return 0; } @@ -194,7 +194,7 @@ static int luavgl_timer_gc(lua_State *L) free(t->user_data); lv_timer_del(t); - debug("gc timer:%p\n", t); + LV_LOG_INFO("gc timer:%p", t); return 0; } diff --git a/lib/luavgl/src/util.c b/lib/luavgl/src/util.c index 7fb86906..9c675d7c 100644 --- a/lib/luavgl/src/util.c +++ b/lib/luavgl/src/util.c @@ -16,7 +16,7 @@ LUALIB_API luavgl_obj_t *luavgl_to_lobj(lua_State *L, int idx) return lobj; fail: - debug("arg not lv_obj userdata.\n"); + LV_LOG_ERROR("arg not lv_obj userdata"); luaL_argerror(L, idx, "Expected lv_obj userdata"); return NULL; } @@ -55,19 +55,19 @@ static void dumpvalue(lua_State *L, int i, bool cr) const char ending = cr ? '\n' : '\0'; switch (lua_type(L, i)) { case LUA_TNUMBER: - printf("number: %g%c", lua_tonumber(L, i), ending); + LV_LOG_USER("number: %g%c", lua_tonumber(L, i), ending); break; case LUA_TSTRING: - printf("string: %s%c", lua_tostring(L, i), ending); + LV_LOG_USER("string: %s%c", lua_tostring(L, i), ending); break; case LUA_TBOOLEAN: - printf("boolean: %s%c", (lua_toboolean(L, i) ? "true" : "false"), ending); + LV_LOG_USER("boolean: %s%c", (lua_toboolean(L, i) ? "true" : "false"), ending); break; case LUA_TNIL: - printf("nil: %s%c", "nil", ending); + LV_LOG_USER("nil: %s%c", "nil", ending); break; default: - printf("pointer: %p%c", lua_topointer(L, i), ending); + LV_LOG_USER("pointer: %p%c", lua_topointer(L, i), ending); break; } } @@ -79,7 +79,7 @@ static void dumptable(lua_State *L, int index) while (lua_next(L, i)) { /* -1: value, -2: key */ dumpvalue(L, -2, 0); - printf(" "); + LV_LOG_USER(" "); dumpvalue(L, -1, 1); lua_pop(L, 1); /* remove value, keep the key to continue. */ } @@ -89,24 +89,22 @@ static void dumptable(lua_State *L, int index) static void dumpstack(lua_State *L) { int top = lua_gettop(L); - printf("\n"); for (int i = 1; i <= top; i++) { - printf("%d\t%s\t", i, luaL_typename(L, i)); switch (lua_type(L, i)) { case LUA_TNUMBER: - printf("number: %g\n", lua_tonumber(L, i)); + LV_LOG_USER("%s: %g", luaL_typename(L, i), lua_tonumber(L, i)); break; case LUA_TSTRING: - printf("string: %s\n", lua_tostring(L, i)); + LV_LOG_USER("%s: %s", luaL_typename(L, i), lua_tostring(L, i)); break; case LUA_TBOOLEAN: - printf("boolean: %s\n", (lua_toboolean(L, i) ? "true" : "false")); + LV_LOG_USER("%s: %s", luaL_typename(L, i), (lua_toboolean(L, i) ? "true" : "false")); break; case LUA_TNIL: - printf("nil: %s\n", "nil"); + LV_LOG_USER("%s: %s", luaL_typename(L, i), "nil"); break; default: - printf("pointer: %p\n", lua_topointer(L, i)); + LV_LOG_USER("%s: %p", luaL_typename(L, i), lua_topointer(L, i)); break; } } @@ -236,7 +234,7 @@ LUALIB_API int luavgl_pcall(lua_State *L, int nargs, int nresult) lua_insert(L, base); /* put it under function and args */ int status = lua_pcall(L, nargs, nresult, base); if (status != LUA_OK) { - debug("crashed\n%s", lua_tostring(L, -1)); + LV_LOG_ERROR("crashed\n%s", lua_tostring(L, -1)); } lua_remove(L, base); /* remove message handler from the stack */ @@ -304,11 +302,11 @@ LUALIB_API lv_color_t luavgl_tocolor(lua_State *L, int idx) /* support #RGB and #RRGGBB */ const char *s = lua_tostring(L, idx); if (s == NULL) { - luaL_error(L, "unknown color."); + luaL_error(L, "unknown color"); return color; } - int len = strlen(s); + int len = lv_strlen(s); if (len == 4 && s[0] == '#') { /* #RGB */ int r = to_int(s[1]); @@ -325,7 +323,7 @@ LUALIB_API lv_color_t luavgl_tocolor(lua_State *L, int idx) int b = (to_int(s[5]) << 4) | to_int(s[6]); color = lv_color_make(r, g, b); } else { - luaL_error(L, "unknown color format."); + luaL_error(L, "unknown color format"); return color; } } else { @@ -340,11 +338,11 @@ LUALIB_API const char *luavgl_toimgsrc(lua_State *L, int idx) const char *src = NULL; if (lua_isuserdata(L, idx)) { src = lua_touserdata(L, idx); - debug("set img src to user data: %p\n", src); + LV_LOG_INFO("set img src to user data: %p", src); } else if (lua_isstring(L, idx)) { src = lua_tostring(L, idx); } else { - debug("img src should be string or userdata.\n"); + LV_LOG_ERROR("img src should be string or userdata"); return NULL; } @@ -355,12 +353,13 @@ LUALIB_API void luavgl_iterate(lua_State *L, int index, int (*cb)(lua_State *, void *), void *cb_para) { int i = index < 0 ? index - 1 : index; + lua_pushnil(L); /* nil as initial key to iterate through table */ while (lua_next(L, i)) { /* -1: value, -2: key */ if (!lua_isstring(L, -2)) { /* we expect string as key, ignore it if not */ - debug("ignore non-string key in table.\n"); + LV_LOG_INFO("ignore non-string key in table"); lua_pop(L, 1); continue; } @@ -376,13 +375,13 @@ LUALIB_API int luavgl_set_property_array(lua_State *L, void *obj, { const char *key = lua_tostring(L, -2); if (key == NULL) { - debug("Null key, ignored.\n"); + LV_LOG_ERROR("Null key, ignored"); return -1; } for (int i = 0; i < len; i++) { const luavgl_value_setter_t *p = &table[i]; - if (strcmp(key, p->key)) + if (lv_strcmp(key, p->key)) continue; if (p->type == SETTER_TYPE_INT) { @@ -397,8 +396,12 @@ LUALIB_API int luavgl_set_property_array(lua_State *L, void *obj, p->setter(obj, v); } else if (p->type == SETTER_TYPE_COLOR) { /* color */ - lv_color_t color = luavgl_tocolor(L, -1); - p->setter(obj, color.full); + union { + lv_color_t c; + uint32_t v; + } color; + color.c = luavgl_tocolor(L, -1); + p->setter(obj, color.v); } else if (p->type == SETTER_TYPE_IMGSRC) { /* img src */ p->setter_pointer(obj, (void *)luavgl_toimgsrc(L, -1)); @@ -408,7 +411,7 @@ LUALIB_API int luavgl_set_property_array(lua_State *L, void *obj, void *data = lua_touserdata(L, -1); p->setter_pointer(obj, data); } else { - debug("unsupported type: %d\n", p->type); + LV_LOG_ERROR("unsupported type: %d", p->type); } return 0; } diff --git a/lib/luavgl/src/widgets/calendar.c b/lib/luavgl/src/widgets/calendar.c index 2fb8fd9b..20e5175b 100644 --- a/lib/luavgl/src/widgets/calendar.c +++ b/lib/luavgl/src/widgets/calendar.c @@ -65,7 +65,7 @@ LUALIB_API int luavgl_calendar_set_property_kv(lua_State *L, void *data) /* a base obj property? */ ret = luavgl_obj_set_property_kv(L, obj); if (ret != 0) { - debug("unkown property for calendar.\n"); + LV_LOG_ERROR("unkown property for calendar."); } return ret; diff --git a/lib/luavgl/src/widgets/checkbox.c b/lib/luavgl/src/widgets/checkbox.c index e7885c8e..a74238cd 100644 --- a/lib/luavgl/src/widgets/checkbox.c +++ b/lib/luavgl/src/widgets/checkbox.c @@ -32,7 +32,7 @@ LUALIB_API int luavgl_checkbox_set_property_kv(lua_State *L, void *data) /* a base obj property? */ ret = luavgl_obj_set_property_kv(L, obj); if (ret != 0) { - debug("unkown property for checkbox.\n"); + LV_LOG_ERROR("unkown property for checkbox"); } return ret; diff --git a/lib/luavgl/src/widgets/dropdown.c b/lib/luavgl/src/widgets/dropdown.c index a211c10b..d2bcfc0b 100644 --- a/lib/luavgl/src/widgets/dropdown.c +++ b/lib/luavgl/src/widgets/dropdown.c @@ -36,7 +36,7 @@ LUALIB_API int luavgl_dropdown_set_property_kv(lua_State *L, void *data) /* a base obj property? */ ret = luavgl_obj_set_property_kv(L, obj); if (ret != 0) { - debug("unkown property for dropdown.\n"); + LV_LOG_ERROR("unkown property for dropdown"); } return ret; @@ -72,7 +72,7 @@ static int luavgl_dropdown_get(lua_State *L) } const char *key = lua_tostring(L, 2); - if (strcmp(key, "list") == 0) { + if (lv_strcmp(key, "list") == 0) { lv_obj_t *list = lv_dropdown_get_list(obj); lua_pushlightuserdata(L, list); lua_rawget(L, LUA_REGISTRYINDEX); @@ -83,45 +83,47 @@ static int luavgl_dropdown_get(lua_State *L) return 1; } - if (strcmp(key, "text") == 0) { + if (lv_strcmp(key, "text") == 0) { lua_pushstring(L, lv_dropdown_get_text(obj)); return 1; } - if (strcmp(key, "options") == 0) { + if (lv_strcmp(key, "options") == 0) { lua_pushstring(L, lv_dropdown_get_options(obj)); return 1; } - if (strcmp(key, "selected") == 0) { + if (lv_strcmp(key, "selected") == 0) { lua_pushinteger(L, lv_dropdown_get_selected(obj)); return 1; } - if (strcmp(key, "option_cnt") == 0) { + if (lv_strcmp(key, "option_cnt") == 0) { lua_pushinteger(L, lv_dropdown_get_option_cnt(obj)); return 1; } - if (strcmp(key, "selected_str") == 0) { + if (lv_strcmp(key, "selected_str") == 0) { char buf[64]; lv_dropdown_get_selected_str(obj, buf, sizeof(buf)); lua_pushstring(L, buf); return 1; } - if (strcmp(key, "option_index") == 0) { +#if LV_VERSION_CHECK(8, 3, 0) + if (lv_strcmp(key, "option_index") == 0) { const char *option = lua_tostring(L, 3); lua_pushinteger(L, lv_dropdown_get_option_index(obj, option)); return 1; } +#endif - if (strcmp(key, "symbol") == 0) { + if (lv_strcmp(key, "symbol") == 0) { lua_pushlightuserdata(L, (void *)lv_dropdown_get_symbol(obj)); return 1; } - if (strcmp(key, "dir") == 0) { + if (lv_strcmp(key, "dir") == 0) { lua_pushinteger(L, lv_dropdown_get_dir(obj)); return 1; } diff --git a/lib/luavgl/src/widgets/img.c b/lib/luavgl/src/widgets/img.c index 9332cd99..7f92ef65 100644 --- a/lib/luavgl/src/widgets/img.c +++ b/lib/luavgl/src/widgets/img.c @@ -3,14 +3,14 @@ static int luavgl_img_create(lua_State *L) { - return luavgl_obj_create_helper(L, lv_img_create); + return luavgl_obj_create_helper(L, lv_image_create); } -static void _lv_img_set_pivot(void *obj, lua_State *L) +static void lv_image_set_pivot_(void *obj, lua_State *L) { if (!lua_istable(L, -1)) { luaL_argerror(L, -1, "should be table."); - debug("para should be table."); + LV_LOG_ERROR("para should be table."); return; } @@ -22,18 +22,18 @@ static void _lv_img_set_pivot(void *obj, lua_State *L) lv_coord_t y = lua_tointeger(L, -1); lua_pop(L, 1); - lv_img_set_pivot(obj, x, y); + lv_image_set_pivot(obj, x, y); } static const luavgl_value_setter_t img_property_table[] = { {"src", - SETTER_TYPE_IMGSRC, {.setter_pointer = (setter_pointer_t)lv_img_set_src}}, - {"offset_x", 0, {.setter = (setter_int_t)lv_img_set_offset_x} }, - {"offset_y", 0, {.setter = (setter_int_t)lv_img_set_offset_y} }, + SETTER_TYPE_IMGSRC, {.setter_pointer = (setter_pointer_t)lv_image_set_src}}, + {"offset_x", 0, {.setter = (setter_int_t)lv_image_set_offset_x} }, + {"offset_y", 0, {.setter = (setter_int_t)lv_image_set_offset_y} }, {"angle", 0, {.setter = (setter_int_t)lv_img_set_angle} }, {"zoom", 0, {.setter = (setter_int_t)lv_img_set_zoom} }, - {"antialias", 0, {.setter = (setter_int_t)lv_img_set_antialias} }, - {"pivot", SETTER_TYPE_STACK, {.setter_stack = _lv_img_set_pivot} }, + {"antialias", 0, {.setter = (setter_int_t)lv_image_set_antialias} }, + {"pivot", SETTER_TYPE_STACK, {.setter_stack = lv_image_set_pivot_} }, }; LUALIB_API int luavgl_img_set_property_kv(lua_State *L, void *data) @@ -48,7 +48,7 @@ LUALIB_API int luavgl_img_set_property_kv(lua_State *L, void *data) /* a base obj property? */ ret = luavgl_obj_set_property_kv(L, obj); if (ret != 0) { - debug("unkown property for image.\n"); + LV_LOG_ERROR("unkown property for image"); } return ret; @@ -69,11 +69,11 @@ static int luavgl_img_set(lua_State *L) const char *src = NULL; if (lua_isuserdata(L, -1)) { src = lua_touserdata(L, -1); - debug("set img src to user data: %p\n", src); + LV_LOG_INFO("set img src to user data: %p", src); } else { src = lua_tostring(L, -1); } - lv_img_set_src(obj, src); + lv_image_set_src(obj, src); } lua_pop(L, 1); @@ -90,7 +90,7 @@ static int luavgl_img_set_src(lua_State *L) lv_obj_t *obj = luavgl_to_obj(L, 1); const char *src = luavgl_toimgsrc(L, 2); if (src != NULL) { - lv_img_set_src(obj, src); + lv_image_set_src(obj, src); } return 0; @@ -114,14 +114,14 @@ static int luavgl_img_set_offset(lua_State *L) if (!lua_isnil(L, -1)) { v = lua_tointeger(L, -1); lua_pop(L, 1); - lv_img_set_offset_x(obj, v); + lv_image_set_offset_x(obj, v); } lua_getfield(L, -1, "y"); if (!lua_isnil(L, -1)) { v = lua_tointeger(L, -1); lua_pop(L, 1); - lv_img_set_offset_y(obj, v); + lv_image_set_offset_y(obj, v); } return 0; @@ -145,7 +145,7 @@ static int luavgl_img_set_pivot(lua_State *L) lua_getfield(L, -1, "y"); y = lua_tointeger(L, -1); - lv_img_set_pivot(obj, x, y); + lv_image_set_pivot(obj, x, y); return 0; } @@ -161,13 +161,13 @@ static int luavgl_get_img_size(lua_State *L) const void *src = NULL; if (lua_isnoneornil(L, 2)) { - src = lv_img_get_src(obj); + src = lv_image_get_src(obj); } else { src = luavgl_toimgsrc(L, 2); } - lv_img_header_t header; - if (src == NULL || lv_img_decoder_get_info(src, &header) != LV_RES_OK) { + lv_image_header_t header; + if (src == NULL || lv_image_decoder_get_info(src, &header) != LV_RES_OK) { lua_pushnil(L); lua_pushnil(L); } else { @@ -191,6 +191,6 @@ static const luaL_Reg luavgl_img_methods[] = { static void luavgl_img_init(lua_State *L) { - luavgl_obj_newmetatable(L, &lv_img_class, "lv_img", luavgl_img_methods); + luavgl_obj_newmetatable(L, &lv_image_class, "lv_img", luavgl_img_methods); lua_pop(L, 1); } diff --git a/lib/luavgl/src/widgets/keyboard.c b/lib/luavgl/src/widgets/keyboard.c index e7121de0..366f4693 100644 --- a/lib/luavgl/src/widgets/keyboard.c +++ b/lib/luavgl/src/widgets/keyboard.c @@ -36,7 +36,7 @@ LUALIB_API int luavgl_keyboard_set_property_kv(lua_State *L, void *data) /* a base obj property? */ ret = luavgl_obj_set_property_kv(L, obj); if (ret != 0) { - debug("unkown property for keyboard.\n"); + LV_LOG_ERROR("unkown property for keyboard"); } return ret; @@ -67,7 +67,7 @@ static void luavgl_keyboard_init(lua_State *L) static const luaL_Reg btm_methods[] = { {NULL, NULL}, }; - luavgl_obj_newmetatable(L, &lv_btnmatrix_class, "lv_btnm", btm_methods); + luavgl_obj_newmetatable(L, &lv_buttonmatrix_class, "lv_btnm", btm_methods); lua_pop(L, 1); luavgl_obj_newmetatable(L, &lv_keyboard_class, "lv_keyboard", diff --git a/lib/luavgl/src/widgets/label.c b/lib/luavgl/src/widgets/label.c index 701c56f3..9b477d07 100644 --- a/lib/luavgl/src/widgets/label.c +++ b/lib/luavgl/src/widgets/label.c @@ -47,7 +47,7 @@ LUALIB_API int luavgl_label_set_property_kv(lua_State *L, void *data) /* a base obj property? */ ret = luavgl_obj_set_property_kv(L, obj); if (ret != 0) { - debug("unkown property for label.\n"); + LV_LOG_ERROR("unkown property for label"); } return ret; diff --git a/lib/luavgl/src/widgets/led.c b/lib/luavgl/src/widgets/led.c index 38f22a05..3e9d19b8 100644 --- a/lib/luavgl/src/widgets/led.c +++ b/lib/luavgl/src/widgets/led.c @@ -25,7 +25,7 @@ LUALIB_API int luavgl_led_set_property_kv(lua_State *L, void *data) /* a base obj property? */ ret = luavgl_obj_set_property_kv(L, obj); if (ret != 0) { - debug("unkown property for led.\n"); + LV_LOG_ERROR("unkown property for led"); } return ret; diff --git a/lib/luavgl/src/widgets/list.c b/lib/luavgl/src/widgets/list.c index 825a7bff..dc41b3dc 100644 --- a/lib/luavgl/src/widgets/list.c +++ b/lib/luavgl/src/widgets/list.c @@ -24,7 +24,7 @@ LUALIB_API int luavgl_list_set_property_kv(lua_State *L, void *data) /* a base obj property? */ ret = luavgl_obj_set_property_kv(L, obj); if (ret != 0) { - debug("unkown property for list.\n"); + LV_LOG_ERROR("unkown property for list"); } return ret; diff --git a/lib/luavgl/src/widgets/roller.c b/lib/luavgl/src/widgets/roller.c index 574fc066..4d3ea548 100644 --- a/lib/luavgl/src/widgets/roller.c +++ b/lib/luavgl/src/widgets/roller.c @@ -69,7 +69,7 @@ LUALIB_API int luavgl_roller_set_property_kv(lua_State *L, void *data) /* a base obj property? */ ret = luavgl_obj_set_property_kv(L, obj); if (ret != 0) { - debug("unkown property for roller.\n"); + LV_LOG_ERROR("unkown property for roller"); } return ret; diff --git a/lib/luavgl/src/widgets/textarea.c b/lib/luavgl/src/widgets/textarea.c index 7c6170c1..e197c413 100644 --- a/lib/luavgl/src/widgets/textarea.c +++ b/lib/luavgl/src/widgets/textarea.c @@ -28,12 +28,14 @@ static void _lv_textarea_set_placeholder_txt(void *obj, lua_State *L) static void _lv_textarea_set_password_bullet(void *obj, lua_State *L) { +#if LV_VERSION_CHECK(8, 3, 0) if (!lua_isstring(L, -1)) { luaL_argerror(L, -1, "expect string"); return; } lv_textarea_set_password_bullet(obj, lua_tostring(L, -1)); +#endif } static void _lv_textarea_set_accepted_chars(void *obj, lua_State *L) @@ -72,7 +74,7 @@ LUALIB_API int luavgl_textarea_set_property_kv(lua_State *L, void *data) /* a base obj property? */ ret = luavgl_obj_set_property_kv(L, obj); if (ret != 0) { - debug("unkown property for textarea: %s\n", lua_tostring(L, -2)); + LV_LOG_ERROR("unkown property for textarea: %s", lua_tostring(L, -2)); } return -1; diff --git a/lib/luavgl/src/widgets/widgets.c b/lib/luavgl/src/widgets/widgets.c index 4a7a126e..6d140217 100644 --- a/lib/luavgl/src/widgets/widgets.c +++ b/lib/luavgl/src/widgets/widgets.c @@ -21,7 +21,7 @@ #include "dropdown.c" #endif -#if LV_USE_IMG +#if LV_USE_IMAGE #include "img.c" #endif @@ -82,7 +82,7 @@ static const luaL_Reg widget_create_methods[] = { {"Dropdown", luavgl_dropdown_create}, #endif -#if LV_USE_IMG +#if LV_USE_IMAGE {"Image", luavgl_img_create }, #endif @@ -122,7 +122,7 @@ static const luaL_Reg widget_create_methods[] = { static void luavgl_widgets_init(lua_State *L) { -#if LV_USE_IMG +#if LV_USE_IMAGE luavgl_img_init(L); #endif