WIP bump luavgl to latest

custom
jacqueline 10 months ago
parent b02d13f5a5
commit bd01bf3845
  1. 40
      lib/luavgl/src/anim.c
  2. 25
      lib/luavgl/src/constants.c
  3. 120
      lib/luavgl/src/disp.c
  4. 178
      lib/luavgl/src/event.c
  5. 77
      lib/luavgl/src/font.c
  6. 20
      lib/luavgl/src/fs.c
  7. 4
      lib/luavgl/src/group.c
  8. 20
      lib/luavgl/src/imgdata.c
  9. 17
      lib/luavgl/src/indev.c
  10. 9
      lib/luavgl/src/luavgl.c
  11. 24
      lib/luavgl/src/luavgl.h
  12. 446
      lib/luavgl/src/obj.c
  13. 14
      lib/luavgl/src/private.h
  14. 134
      lib/luavgl/src/style.c
  15. 18
      lib/luavgl/src/timer.c
  16. 55
      lib/luavgl/src/util.c
  17. 2
      lib/luavgl/src/widgets/calendar.c
  18. 2
      lib/luavgl/src/widgets/checkbox.c
  19. 22
      lib/luavgl/src/widgets/dropdown.c
  20. 40
      lib/luavgl/src/widgets/img.c
  21. 4
      lib/luavgl/src/widgets/keyboard.c
  22. 2
      lib/luavgl/src/widgets/label.c
  23. 2
      lib/luavgl/src/widgets/led.c
  24. 2
      lib/luavgl/src/widgets/list.c
  25. 2
      lib/luavgl/src/widgets/roller.c
  26. 4
      lib/luavgl/src/widgets/textarea.c
  27. 6
      lib/luavgl/src/widgets/widgets.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"); luavgl_anim_t *a = luaL_checkudata(L, index, "lv_anim");
if (a->deleted) { if (a->deleted) {
luaL_argerror(L, index, "anim already deleted."); luaL_argerror(L, index, "anim already deleted");
return NULL; return NULL;
} }
@ -40,8 +40,8 @@ static void luavgl_anim_exec_cb(void *var, int32_t value)
lua_State *L = a->L; lua_State *L = a->L;
if (a->exec_cb == LUA_NOREF || a->obj_ref == LUA_NOREF) { if (a->exec_cb == LUA_NOREF || a->obj_ref == LUA_NOREF) {
debug("anim error, callback or obj not found.\n"); LV_LOG_ERROR("anim error, callback or obj not found");
luaL_error(L, "anim founds no callback or obj."); luaL_error(L, "anim founds no callback or obj");
return; return;
} }
@ -94,19 +94,19 @@ static void _lv_anim_set_path(void *obj, lua_State *L)
} }
a->path_cb = lv_anim_path_linear; 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 */ ; /* 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; 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; 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; 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; 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; 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; 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); int ret = luavgl_set_property(L, data, anim_property_table);
if (ret != 0) { if (ret != 0) {
debug("failed\n"); LV_LOG_ERROR("failed");
} }
return ret; return ret;
@ -146,7 +146,7 @@ static int luavgl_anim_stop(lua_State *L)
luavgl_anim_t *a = luavgl_check_anim(L, 1); luavgl_anim_t *a = luavgl_check_anim(L, 1);
if (a->aa == NULL || a->self_ref == LUA_NOREF) { if (a->aa == NULL || a->self_ref == LUA_NOREF) {
debug("already stopped"); LV_LOG_INFO("already stopped");
return 0; return 0;
} }
@ -179,13 +179,13 @@ static int luavgl_anim_start(lua_State *L)
luavgl_anim_t *a = luavgl_check_anim(L, 1); luavgl_anim_t *a = luavgl_check_anim(L, 1);
if (a->aa) { 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); luavgl_anim_stop(L);
} }
lv_anim_t *new_a = lv_anim_start(&a->cfg); lv_anim_t *new_a = lv_anim_start(&a->cfg);
a->aa = new_a; 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) { if (a->self_ref == LUA_NOREF) {
/* it's started, thus cannot be gc'ed */ /* 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) static int luavgl_anim_create(lua_State *L)
{ {
if (lua_isnoneornil(L, 1)) { 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)) { 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)); 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_t *cfg = &a->cfg;
lv_anim_init(cfg); lv_anim_init(cfg);
cfg->var = a; cfg->var = a;
#if LV_VERSION_CHECK(8, 3, 0)
cfg->deleted_cb = luavgl_anim_delete_cb; cfg->deleted_cb = luavgl_anim_delete_cb;
#else
cfg->completed_cb = luavgl_anim_delete_cb;
#endif
cfg->exec_cb = luavgl_anim_exec_cb; cfg->exec_cb = luavgl_anim_exec_cb;
/* leave only anim userdata and para table on stack */ /* 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); luavgl_anim_set(L);
lua_pop(L, 1); /* anim */ 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; return 1;
} }
static int luavgl_anim_gc(lua_State *L) static int luavgl_anim_gc(lua_State *L)
{ {
debug("\n"); LV_LOG_INFO("enter");
luavgl_anim_t *a = luaL_checkudata(L, 1, "lv_anim"); luavgl_anim_t *a = luaL_checkudata(L, 1, "lv_anim");
if (a->deleted) if (a->deleted)
return 0; return 0;

@ -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_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"); 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_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, "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, "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); 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, "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, "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, "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, "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, "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); 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_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_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, "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); 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, "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_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_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_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); 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) 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); 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) static void luavgl_keyboard_mode_init(lua_State* L)
{ {
lua_newtable(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); lua_pushstring(L, "TEXT_ARABIC"); lua_pushinteger(L, LV_KEYBOARD_MODE_TEXT_ARABIC); lua_settable(L, -3);
#endif #endif
} }
#endif
static void luavgl_flex_flow_init(lua_State* L) 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); 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) static void luavgl_roller_mode_init(lua_State* L)
{ {
lua_newtable(L); lua_newtable(L);
lua_pushstring(L, "NORMAL"); lua_pushinteger(L, LV_ROLLER_MODE_NORMAL); lua_settable(L, -3); 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); lua_pushstring(L, "INFINITE"); lua_pushinteger(L, LV_ROLLER_MODE_INFINITE); lua_settable(L, -3);
} }
#endif
static void luavgl_key_init(lua_State* L) 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"); lua_setfield(L, -2, "SCROLLBAR_MODE");
luavgl_dir_init(L); luavgl_dir_init(L);
lua_setfield(L, -2, "DIR"); lua_setfield(L, -2, "DIR");
#if LV_USE_KEYBOARD
luavgl_keyboard_mode_init(L); luavgl_keyboard_mode_init(L);
lua_setfield(L, -2, "KEYBOARD_MODE"); lua_setfield(L, -2, "KEYBOARD_MODE");
#endif
luavgl_flex_flow_init(L); luavgl_flex_flow_init(L);
lua_setfield(L, -2, "FLEX_FLOW"); lua_setfield(L, -2, "FLEX_FLOW");
luavgl_flex_align_init(L); luavgl_flex_align_init(L);
lua_setfield(L, -2, "FLEX_ALIGN"); lua_setfield(L, -2, "FLEX_ALIGN");
luavgl_grid_align_init(L); luavgl_grid_align_init(L);
lua_setfield(L, -2, "GRID_ALIGN"); lua_setfield(L, -2, "GRID_ALIGN");
#if LV_USE_ROLLER
luavgl_roller_mode_init(L); luavgl_roller_mode_init(L);
lua_setfield(L, -2, "ROLLER_MODE"); lua_setfield(L, -2, "ROLLER_MODE");
#endif
luavgl_key_init(L); luavgl_key_init(L);
lua_setfield(L, -2, "KEY"); lua_setfield(L, -2, "KEY");
/* miscellaneous. */ /* miscellaneous. */
@ -515,8 +524,8 @@ static void luavgl_constants_init(lua_State *L)
lua_pushinteger(L, LV_COORD_MIN); lua_pushinteger(L, LV_COORD_MIN);
lua_setfield(L, -2, "COORD_MIN"); lua_setfield(L, -2, "COORD_MIN");
lua_pushinteger(L, LV_IMG_ZOOM_NONE); lua_pushinteger(L, LV_ZOOM_NONE);
lua_setfield(L, -2, "IMG_ZOOM_NONE"); lua_setfield(L, -2, "LV_ZOOM_NONE");
lua_pushinteger(L, LV_BTNMATRIX_BTN_NONE); lua_pushinteger(L, LV_BTNMATRIX_BTN_NONE);
lua_setfield(L, -2, "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_pushinteger(L, LV_CHART_POINT_NONE);
lua_setfield(L, -2, "CHART_POINT_NONE"); lua_setfield(L, -2, "CHART_POINT_NONE");
#if LV_USE_DROPDOWN
lua_pushinteger(L, LV_DROPDOWN_POS_LAST); lua_pushinteger(L, LV_DROPDOWN_POS_LAST);
lua_setfield(L, -2, "DROPDOWN_POS_LAST"); lua_setfield(L, -2, "DROPDOWN_POS_LAST");
#endif
lua_pushinteger(L, LV_LABEL_DOT_NUM); lua_pushinteger(L, LV_LABEL_DOT_NUM);
lua_setfield(L, -2, "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_pushinteger(L, LV_TABLE_CELL_NONE);
lua_setfield(L, -2, "TABLE_CELL_NONE"); lua_setfield(L, -2, "TABLE_CELL_NONE");
#if LV_USE_TEXTAREA
lua_pushinteger(L, LV_TEXTAREA_CURSOR_LAST); lua_pushinteger(L, LV_TEXTAREA_CURSOR_LAST);
lua_setfield(L, -2, "TEXTAREA_CURSOR_LAST"); lua_setfield(L, -2, "TEXTAREA_CURSOR_LAST");
#endif
lua_pushinteger(L, LV_LAYOUT_FLEX); lua_pushinteger(L, LV_LAYOUT_FLEX);
lua_setfield(L, -2, "LAYOUT_FLEX"); lua_setfield(L, -2, "LAYOUT_FLEX");

@ -48,7 +48,10 @@ static int luavgl_disp_get_default(lua_State *L)
static int luavgl_disp_get_scr_act(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); lv_obj_t *obj = lv_disp_get_scr_act(disp);
if (obj == NULL) { if (obj == NULL) {
lua_pushnil(L); lua_pushnil(L);
@ -102,8 +105,7 @@ static int luavgl_disp_load_scr(lua_State *L)
} }
/* has parameter table */ /* has parameter table */
lv_screen_load_anim_t anim = LV_SCR_LOAD_ANIM_NONE;
lv_scr_load_anim_t anim = LV_SCR_LOAD_ANIM_NONE;
uint32_t time = 0; uint32_t time = 0;
uint32_t delay = 0; uint32_t delay = 0;
bool auto_del = false; bool auto_del = false;
@ -111,38 +113,40 @@ static int luavgl_disp_load_scr(lua_State *L)
const char *str; const char *str;
lua_getfield(L, 2, "anim"); lua_getfield(L, 2, "anim");
str = lua_tostring(L, -1); str = lua_tostring(L, -1);
if (str == NULL || strcmp(str, "none") == 0) { if (str == NULL || lv_strcmp(str, "none") == 0) {
; /* use default */ ; /* use default */
} else if (strcmp(str, "over_left") == 0) { } else if (lv_strcmp(str, "over_left") == 0) {
anim = LV_SCR_LOAD_ANIM_OVER_LEFT; 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; 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; 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; 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; 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; 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; 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; anim = LV_SCR_LOAD_ANIM_MOVE_BOTTOM;
} else if (strcmp(str, "fade_in") == 0) { } else if (lv_strcmp(str, "fade_on") == 0) {
anim = LV_SCR_LOAD_ANIM_FADE_IN;
} else if (strcmp(str, "fade_on") == 0) {
anim = LV_SCR_LOAD_ANIM_FADE_ON; 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; 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; 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; 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; 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; anim = LV_SCR_LOAD_ANIM_OUT_BOTTOM;
#endif
} }
lua_pop(L, 1); lua_pop(L, 1);
@ -158,7 +162,7 @@ static int luavgl_disp_load_scr(lua_State *L)
auto_del = luavgl_tointeger(L, -1); auto_del = luavgl_tointeger(L, -1);
lua_pop(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; return 0;
} }
@ -202,47 +206,6 @@ static int luavgl_disp_get_layer_sys(lua_State *L)
return 1; 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) static int luavgl_disp_get_next(lua_State *L)
{ {
lv_disp_t *disp = NULL; 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); luavgl_disp_t *d = luavgl_check_disp(L, 1);
uint32_t r = lua_tointeger(L, 2); uint32_t r = lua_tointeger(L, 2);
lv_disp_rot_t rot; lv_display_rotation_t rot;
if (r == 0) if (r == 0)
rot = LV_DISP_ROT_NONE; rot = LV_DISPLAY_ROTATION_0;
else if (r == 90) else if (r == 90)
rot = LV_DISP_ROT_90; rot = LV_DISPLAY_ROTATION_90;
else if (r == 180) else if (r == 180)
rot = LV_DISP_ROT_180; rot = LV_DISPLAY_ROTATION_180;
else if (r == 270) else if (r == 270)
rot = LV_DISP_ROT_270; rot = LV_DISPLAY_ROTATION_270;
else { else {
return luaL_argerror(L, 2, "invalid rotation value"); return luaL_argerror(L, 2, "invalid rotation value");
} }
lv_disp_set_rotation(d->disp, rot); lv_display_set_rotation(d->disp, rot);
return 0; return 0;
} }
@ -306,17 +269,16 @@ static const luaL_Reg disp_lib[] = {
** methods for disp handles ** methods for disp handles
*/ */
static const luaL_Reg disp_methods[] = { static const luaL_Reg disp_methods[] = {
{"get_layer_top", luavgl_disp_get_layer_top }, {"get_layer_top", luavgl_disp_get_layer_top},
{"get_layer_sys", luavgl_disp_get_layer_sys }, {"get_layer_sys", luavgl_disp_get_layer_sys},
{"set_bg_color", luavgl_disp_set_bg_color }, {"get_next", luavgl_disp_get_next },
{"set_bg_image", luavgl_disp_set_bg_image }, {"set_rotation", luavgl_disp_set_rotation },
{"set_bg_opa", luavgl_disp_set_bg_opa }, {"get_res", luavgl_disp_get_res },
{"get_chroma_key_color", luavgl_disp_get_chroma_key_color},
{"get_next", luavgl_disp_get_next }, {"get_scr_act", luavgl_disp_get_scr_act },
{"set_rotation", luavgl_disp_set_rotation }, {"get_scr_prev", luavgl_disp_get_scr_prev },
{"get_res", luavgl_disp_get_res },
{NULL, NULL },
{NULL, NULL },
}; };
static const luaL_Reg disp_meta[] = { static const luaL_Reg disp_meta[] = {

@ -1,36 +1,29 @@
#include "luavgl.h" #include "luavgl.h"
#include "private.h" #include "private.h"
#include "esp_heap_caps.h"
static void luavgl_obj_event_cb(lv_event_t *e) static void luavgl_obj_event_cb(lv_event_t *e)
{ {
lua_State *L = e->user_data; struct event_callback_s *event = e->user_data;
if (L == NULL) { if (event == NULL)
debug("Null user data, should be L.\n"); return;
}
lua_State *L = event->L;
int top = lua_gettop(L); int top = lua_gettop(L);
lv_obj_t *obj = e->current_target; lv_obj_t *obj = e->current_target;
lua_pushlightuserdata(L, obj); lua_pushlightuserdata(L, obj);
lua_rawget(L, LUA_REGISTRYINDEX); lua_rawget(L, LUA_REGISTRYINDEX);
luavgl_obj_t *lobj = luavgl_to_lobj(L, -1); luavgl_obj_t *lobj = luavgl_to_lobj(L, -1);
if (lobj == NULL || lobj->obj == NULL) if (lobj == NULL || lobj->obj == NULL) {
goto event_exit; lua_settop(L, top);
return;
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;
}
} }
int ref = event->ref;
if (ref == LUA_NOREF) { if (ref == LUA_NOREF) {
/* nobody cares this event, something went wrong but can be ignored. */ /* 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); lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
@ -41,27 +34,13 @@ static void luavgl_obj_event_cb(lv_event_t *e)
/* args: obj, code */ /* args: obj, code */
luavgl_pcall_int(L, 2, 0); 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) */ /* obj:onevent(luavgl.EVENT.PRESSED, function(code, value) -- end) */
static int luavgl_obj_on_event(lua_State *L) 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); luavgl_obj_t *lobj = luavgl_to_lobj(L, 1);
lv_obj_t *obj = lobj->obj; lv_obj_t *obj = lobj->obj;
if (obj == NULL) { if (obj == NULL) {
luaL_argerror(L, 1, "expect obj userdata.\n"); luaL_argerror(L, 1, "expect obj userdata.\n");
@ -74,68 +53,68 @@ static int luavgl_obj_on_event(lua_State *L)
return 0; return 0;
} }
remove_all = lua_isnoneornil(L, 3); int size = lv_array_size(&lobj->events);
struct event_callback_s *event = NULL;
/* check if event code already added, find a slot to store this callback */ struct event_callback_s **events = lv_array_front(&lobj->events);
int slot = 0;
if (lobj && lobj->events) { /* if third parameter is none or nil, remove this events */
for (; slot < lobj->n_events; slot++) { if (lua_isnoneornil(L, 3)) {
struct event_callback_s *event = &lobj->events[slot]; for (int i = 0; i < size; i++) {
if (event->code == code) { /* same event can only be added once. */ event = events[i];
luavgl_obj_remove_event(L, obj, event); if (event->code == code) {
if (remove_all) events[i] = NULL; /* Remove it from array */
continue; /* continue to remove all events associated. */ lv_result_t res = lv_obj_remove_event_dsc(lobj->obj, event->dsc);
else luaL_unref(L, LUA_REGISTRYINDEX, event->ref);
break; /* use this slot for our new event callback */ event->dsc = NULL;
} event->L = NULL;
event->ref = LUA_NOREF;
if (event->code == -1) { event->code = _LV_EVENT_LAST;
/* this callback has been removed, thus, we can use this slot */ if (res != LV_RESULT_OK) {
break; return luaL_error(L, "Failed to remove event dsc: %d\n", res);
}
return 0;
} }
} }
}
if (remove_all) /* no need to add, just return */ return luaL_error(L, "No such event to remove: %d", code);
return 0; }
struct event_callback_s *events = lobj->events;
/* create obj->lobj->events, if NULL, realloc if existing and find no slot /* Check if the event code already exists, only one callback per code. */
*/ for (int i = 0; i < size; i++) {
if (events == NULL) { if (events[i]->code == code) {
events = luaL_unref(L, LUA_REGISTRYINDEX, event->ref);
heap_caps_calloc(sizeof(struct event_callback_s), 1, MALLOC_CAP_SPIRAM); event = events[i];
if (events == NULL) { break;
return luaL_error(L, "No memory.");
} }
lobj->events = events; if (events[i]->code == _LV_EVENT_LAST) {
lobj->n_events = 1; /* code marked as _LV_EVENT_LAST means this event has been removed, we can
} else { * reuse it. */
/* realloc? */ event = events[i];
if (slot && slot == lobj->n_events) { break;
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;
} }
/* 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->code = code;
event->L = L;
event->ref = luavgl_check_continuation(L, 3); 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; return 0;
} }
@ -169,28 +148,39 @@ static int luavgl_obj_on_pressed(lua_State *L)
return luavgl_obj_on_event(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 * Remove all events added, and free memory of events
*/ */
static void luavgl_obj_remove_event_all(lua_State *L, luavgl_obj_t *lobj) static void luavgl_obj_remove_event_all(lua_State *L, luavgl_obj_t *lobj)
{ {
if (lobj == NULL || lobj->events == NULL) { if (lobj == NULL) {
return; 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; lv_result_t res = lv_obj_remove_event_dsc(lobj->obj, event->dsc);
for (; i < lobj->n_events; i++) { if (res != LV_RESULT_OK) {
struct event_callback_s *event = &lobj->events[i]; LV_LOG_WARN("Failed to remove event dsc: %d", res);
if (event->code != -1) { /* Ignore this error, remove from it anyway */
luavgl_obj_remove_event(L, lobj->obj, event);
} }
luaL_unref(L, LUA_REGISTRYINDEX, event->ref);
lv_free(event);
} }
free(events); lv_array_deinit(&lobj->events);
lobj->n_events = 0;
lobj->events = NULL;
} }

@ -5,6 +5,8 @@
#define _ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) #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, * Follow css style, specify the name by name family, name size,
* name weight. Font weight can be numeric value or 'bold'. Alls strings * 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++) { 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; 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) int size, int weight)
{ {
/* check builtin font firstly. */ /* check builtin font firstly. */
if (strcmp(name, "montserrat") == 0) { if (lv_strcmp(name, "montserrat") == 0) {
if (FONT_WEIGHT_NORMAL != weight) if (FONT_WEIGHT_NORMAL != weight)
return NULL; 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; return g_builtin_montserrat[i].font;
} }
} }
} else if (strcmp(name, "unscii") == 0) { } else if (lv_strcmp(name, "unscii") == 0) {
if (FONT_WEIGHT_NORMAL != weight) if (FONT_WEIGHT_NORMAL != weight)
return NULL; return NULL;
#if LV_FONT_UNSCII_8 #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; return &lv_font_unscii_16;
#endif #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 #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) if (size == 16)
return &lv_font_dejavu_16_persian_hebrew; return &lv_font_dejavu_16_persian_hebrew;
} }
#endif #endif
#if LV_FONT_SIMSUN_16_CJK #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) if (size == 16)
return &lv_font_simsun_16_cjk; 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; 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. * Dynamic font family fallback is not supported.
* The fallback only happen when font creation fails and continue to try next * 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 weight;
int size; int size;
const char *name; char *str, *name;
const lv_font_t *font = NULL; const lv_font_t *font = NULL;
if (!lua_isstring(L, 1)) { if (!lua_isstring(L, 1)) {
@ -258,26 +265,60 @@ static int luavgl_font_create(lua_State *L)
weight = lua_tointeger(L, 3); weight = lua_tointeger(L, 3);
} else { } else {
char *luastr = (char *)lua_tostring(L, 3); char *luastr = (char *)lua_tostring(L, 3);
int len = strlen(luastr); int len = lv_strlen(luastr);
if (len > 128) { if (len > 128) {
/* not likely to happen */ /* not likely to happen */
return luaL_argerror(L, 3, "too long"); return luaL_argerror(L, 3, "too long");
} }
char s[len + 1]; char s[NAMED_WEIGHT_MAX_CHARS];
strcpy(s, luastr); 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)); weight = luavgl_get_named_weight(to_lower(s));
} }
} else { } else {
weight = FONT_WEIGHT_NORMAL; weight = FONT_WEIGHT_NORMAL;
} }
name = lua_tostring(L, 1); str = lv_strdup(lua_tostring(L, 1));
font = _luavgl_font_create(L, name, size, weight); 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) { if (font) {
lua_pushlightuserdata(L, (void *)font); lua_pushlightuserdata(L, (void *)font);
return 1; return 1;
} }
return luaL_error(L, "cannot create font."); return luaL_error(L, "cannot create font");
} }

@ -47,15 +47,15 @@ static int luavgl_fs_open(lua_State *L)
f->closed = false; f->closed = false;
lv_fs_mode_t lmode = 0; lv_fs_mode_t lmode = 0;
if (strchr(mode, 'r')) if (luavgl_strchr(mode, 'r'))
lmode |= LV_FS_MODE_RD; lmode |= LV_FS_MODE_RD;
if (strchr(mode, 'w')) if (luavgl_strchr(mode, 'w'))
lmode |= LV_FS_MODE_WR; lmode |= LV_FS_MODE_WR;
lv_fs_res_t res = lv_fs_open(&f->file, path, lmode); lv_fs_res_t res = lv_fs_open(&f->file, path, lmode);
if (res != LV_FS_RES_OK) { if (res != LV_FS_RES_OK) {
debug("open failed: %s\n", path); LV_LOG_ERROR("open failed: %s", path);
lua_pushnil(L); lua_pushnil(L);
lua_pushfstring(L, "open failed: %s\n", path); lua_pushfstring(L, "open failed: %s\n", path);
lua_pushinteger(L, res); /* return lv_fs error number */ 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 arg = 2;
int nargs = lua_gettop(L) - arg; int nargs = lua_gettop(L) - arg;
int status = 1; int status = 1;
lv_fs_res_t res = 0; lv_fs_res_t res;
size_t l; size_t l;
uint32_t nw; uint32_t nw;
const char *s; const char *s;
@ -183,7 +183,7 @@ static int luavgl_fs_close(lua_State *L)
{ {
luavgl_fs_t *f = luavgl_to_fs(L, 1); luavgl_fs_t *f = luavgl_to_fs(L, 1);
debug("\n"); LV_LOG_INFO("enter");
f->closed = true; f->closed = true;
lv_fs_close(&f->file); 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) static int luavgl_fs_gc(lua_State *L)
{ {
debug("\n"); LV_LOG_INFO("enter");
luavgl_fs_t *v = luaL_checkudata(L, 1, "lv_fs"); luavgl_fs_t *v = luaL_checkudata(L, 1, "lv_fs");
if (!v->closed) { 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); lv_fs_res_t res = lv_fs_dir_open(&d->dir, path);
if (res != LV_FS_RES_OK) { if (res != LV_FS_RES_OK) {
debug("open failed: %s\n", path); LV_LOG_ERROR("open failed: %s", path);
lua_pushnil(L); lua_pushnil(L);
lua_pushfstring(L, "open failed: %s\n", path); lua_pushfstring(L, "open failed: %s\n", path);
lua_pushinteger(L, res); /* return lv_fs error number */ 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); luavgl_dir_t *d = luavgl_to_dir(L, 1);
char buffer[PATH_MAX]; 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') { if (res != LV_FS_RES_OK || buffer[0] == '\0') {
lua_pushnil(L); lua_pushnil(L);
} else { } else {
@ -280,7 +280,7 @@ static int luavgl_dir_read(lua_State *L)
static int luavgl_dir_close(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); luavgl_dir_t *d = luavgl_to_dir(L, 1);
d->closed = true; d->closed = true;
lv_fs_dir_close(&d->dir); 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) static int luavgl_dir_gc(lua_State *L)
{ {
debug("\n"); LV_LOG_INFO("enter");
luavgl_dir_t *v = luaL_checkudata(L, 1, "lv_dir"); luavgl_dir_t *v = luaL_checkudata(L, 1, "lv_dir");
if (!v->closed) { if (!v->closed) {

@ -87,7 +87,7 @@ static int luavgl_group_delete(lua_State *L)
g->group = NULL; g->group = NULL;
#endif #endif
debug("delete group:%p\n", g); LV_LOG_INFO("delete group:%p", g);
return 0; return 0;
} }
@ -289,7 +289,7 @@ static int luavgl_group_gc(lua_State *L)
g->group = NULL; g->group = NULL;
#endif #endif
debug("gc group: %p\n", g); LV_LOG_INFO("gc group: %p", g);
return 0; return 0;
} }

@ -1,12 +1,11 @@
#include "draw/lv_img_buf.h" #include "draw/lv_image_decoder.h"
#include "draw/lv_img_decoder.h"
#include "lauxlib.h" #include "lauxlib.h"
#include "lua.h" #include "lua.h"
#include "luavgl.h" #include "luavgl.h"
#include "misc/lv_color.h" #include "misc/lv_color.h"
#include "misc/lv_mem.h"
#include "misc/lv_types.h" #include "misc/lv_types.h"
#include "private.h" #include "private.h"
#include "stdlib/lv_mem.h"
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
@ -16,22 +15,21 @@ static int luavgl_imgdata_create(lua_State *L)
return luaL_argerror(L, 1, "expect string"); return luaL_argerror(L, 1, "expect string");
} }
lv_img_decoder_dsc_t descriptor; lv_image_decoder_dsc_t descriptor;
lv_res_t res = lv_res_t res = lv_image_decoder_open(&descriptor, lua_tostring(L, 1), NULL);
lv_img_decoder_open(&descriptor, lua_tostring(L, 1), lv_color_black(), 0);
if (res != LV_RES_OK) { if (res != LV_RES_OK) {
return luaL_error(L, "failed to decode image."); 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->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); uint8_t *data_copy = lv_malloc(data->data_size);
memcpy(data_copy, descriptor.img_data, data->data_size); memcpy(data_copy, descriptor.decoded->data, data->data_size);
data->data = data_copy; data->data = data_copy;
lv_img_decoder_close(&descriptor); lv_image_decoder_close(&descriptor);
lua_pushlightuserdata(L, data); lua_pushlightuserdata(L, data);
return 1; return 1;

@ -55,6 +55,7 @@ static int luavgl_indev_get_act(lua_State *L)
return luavgl_indev_get(L, indev); return luavgl_indev_get(L, indev);
} }
#if 0
static int luavgl_indev_get_obj_act(lua_State *L) static int luavgl_indev_get_obj_act(lua_State *L)
{ {
lv_obj_t *obj = lv_indev_get_obj_act(); 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; return 1;
} }
#endif
static int luavgl_indev_get_next(lua_State *L) static int luavgl_indev_get_next(lua_State *L)
{ {
@ -201,6 +203,7 @@ static int luavgl_indev_wait_release(lua_State *L)
return 0; return 0;
} }
#if 0
static void indev_feedback_cb(lv_indev_drv_t *driver, uint8_t code) static void indev_feedback_cb(lv_indev_drv_t *driver, uint8_t code)
{ {
lua_State *L = driver->user_data; lua_State *L = driver->user_data;
@ -249,8 +252,8 @@ static int luavgl_indev_on_event(lua_State *L)
lua_setuservalue(L, 1); lua_setuservalue(L, 1);
} }
debug("add feedback_cb code %d, for indev->driver: %p\n", code, LV_LOG_INFO("add feedback_cb code %d, for indev->driver: %p\n", code,
i->indev->driver); i->indev->driver);
lua_pushvalue(L, 3); lua_pushvalue(L, 3);
lua_rawseti(L, -2, code); lua_rawseti(L, -2, code);
@ -259,6 +262,7 @@ static int luavgl_indev_on_event(lua_State *L)
lua_settop(L, 1); lua_settop(L, 1);
return 1; return 1;
} }
#endif
static int luavgl_indev_tostring(lua_State *L) 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) 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 /* If set_feedback_cb is used, then the indev only gets gc'ed when lua vm
* exits. * exits.
*/ */
@ -281,6 +286,7 @@ static int luavgl_indev_gc(lua_State *L)
lua_rawset(L, LUA_REGISTRYINDEX); lua_rawset(L, LUA_REGISTRYINDEX);
i->indev->driver->feedback_cb = NULL; i->indev->driver->feedback_cb = NULL;
} }
#endif
return 0; return 0;
} }
@ -290,7 +296,9 @@ static int luavgl_indev_gc(lua_State *L)
*/ */
static const luaL_Reg indev_lib[] = { static const luaL_Reg indev_lib[] = {
{"get_act", luavgl_indev_get_act }, {"get_act", luavgl_indev_get_act },
#if 0
{"get_obj_act", luavgl_indev_get_obj_act}, {"get_obj_act", luavgl_indev_get_obj_act},
#endif
{"get_next", luavgl_indev_get_next }, {"get_next", luavgl_indev_get_next },
{NULL, NULL }, {NULL, NULL },
@ -312,8 +320,9 @@ static const luaL_Reg methods[] = {
{"get_scroll_obj", luavgl_indev_get_scroll_obj }, {"get_scroll_obj", luavgl_indev_get_scroll_obj },
{"get_vect", luavgl_indev_get_vect }, {"get_vect", luavgl_indev_get_vect },
{"wait_release", luavgl_indev_wait_release }, {"wait_release", luavgl_indev_wait_release },
#if 0
{"on_event", luavgl_indev_on_event }, {"on_event", luavgl_indev_on_event },
#endif
{NULL, NULL }, {NULL, NULL },
}; };

@ -7,7 +7,6 @@
#include "font.c" #include "font.c"
#include "fs.c" #include "fs.c"
#include "group.c" #include "group.c"
#include "imgdata.c"
#include "indev.c" #include "indev.c"
#include "obj.c" #include "obj.c"
#include "timer.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 */ /* create it if not exist in registry */
lua_pushstring(L, luavglgl_key); lua_pushstring(L, luavglgl_key);
ctx = (luavgl_ctx_t *)lua_newuserdata(L, sizeof(*ctx)); 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); lua_rawset(L, LUA_REGISTRYINDEX);
} else { } else {
ctx = (luavgl_ctx_t *)lua_touserdata(L, -1); 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) static int root_gc(lua_State *L)
{ {
debug("enter.\n"); LV_LOG_INFO("enter");
luavgl_ctx_t *ctx = luavgl_context(L); luavgl_ctx_t *ctx = luavgl_context(L);
lv_obj_del(ctx->root); lv_obj_del(ctx->root);
return 0; return 0;
@ -84,7 +83,7 @@ static int root_gc(lua_State *L)
static int root_clean(lua_State *L) static int root_clean(lua_State *L)
{ {
debug("enter.\n"); LV_LOG_INFO("enter");
luavgl_ctx_t *ctx = luavgl_context(L); luavgl_ctx_t *ctx = luavgl_context(L);
lv_obj_clean(ctx->root); lv_obj_clean(ctx->root);
return 0; return 0;
@ -104,7 +103,7 @@ LUALIB_API int luaopen_lvgl(lua_State *L)
lv_obj_t *root = ctx->root; lv_obj_t *root = ctx->root;
if (root == NULL) { 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()); root = lv_obj_create(lv_scr_act());
ctx->root = root; ctx->root = root;
} }

@ -14,7 +14,7 @@ extern "C" {
typedef const lv_font_t *(*make_font_cb)(const char *name, int size, typedef const lv_font_t *(*make_font_cb)(const char *name, int size,
int weight); 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 int (*luavgl_pcall_t)(lua_State *L, int nargs, int nresults);
typedef struct { typedef struct {
@ -48,13 +48,17 @@ typedef struct {
}; };
} luavgl_value_setter_t; } 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 { typedef struct luavgl_obj_s {
lv_obj_t *obj; /* NULL means obj deleted, but not gc'ed in lua */ lv_obj_t *obj; /* NULL means obj deleted, but not gc'ed in lua */
bool lua_created; /* this object is created from lua */ bool lua_created; /* this object is created from lua */
lv_array_t events; /* events added from lua, need it to distinguish between lua */
/* internally used variables */
int n_events;
struct event_callback_s *events;
} luavgl_obj_t; } luavgl_obj_t;
#define luavgl_obj_newmetatable(L, clz, name, l) \ #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); 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 * @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); 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 * @brief Convert value to integer
* *

@ -1,5 +1,3 @@
#include "core/lv_group.h"
#include "core/lv_obj.h"
#include "luavgl.h" #include "luavgl.h"
#include "private.h" #include "private.h"
@ -10,16 +8,18 @@
static int luavgl_anim_create(lua_State *L); static int luavgl_anim_create(lua_State *L);
static int luavgl_obj_delete(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)) { if (lua_isinteger(L, -1)) {
lv_obj_align(obj, lua_tointeger(L, -1), 0, 0); lv_obj_align(obj, lua_tointeger(L, -1), 0, 0);
return; return;
} }
if (!lua_istable(L, -1)) { if (!lua_istable(L, -1)) {
luaL_argerror(L, -1, "should be table."); luaL_argerror(L, -1, "should be table");
debug("para should be table."); LV_LOG_ERROR("para should be table");
return; return;
} }
@ -43,11 +43,13 @@ static void _lv_obj_set_align(void *obj, lua_State *L) {
* *
* Internally used. * 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); 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_State *L = e->user_data;
lua_pushlightuserdata(L, e->current_target); lua_pushlightuserdata(L, e->current_target);
lua_rawget(L, LUA_REGISTRYINDEX); lua_rawget(L, LUA_REGISTRYINDEX);
@ -67,7 +69,33 @@ static void obj_delete_cb(lv_event_t *e) {
goto pop_exit; 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; return;
pop_exit: pop_exit:
@ -80,7 +108,8 @@ pop_exit:
* one. result stack: table(from uservalue) * one. result stack: table(from uservalue)
* return uservalue type: LUA_TTABLE * 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); int type = lua_getuservalue(L, idx);
if (type == LUA_TTABLE) if (type == LUA_TTABLE)
return type; return type;
@ -99,11 +128,13 @@ LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx) {
return LUA_TTABLE; 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); 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; luavgl_obj_t *lobj;
/** /**
@ -146,14 +177,15 @@ static int luavgl_obj_delete(lua_State *L) {
lua_pushnil(L); lua_pushnil(L);
lua_rawset(L, LUA_REGISTRYINDEX); lua_rawset(L, LUA_REGISTRYINDEX);
debug("delete obj: %p\n", lobj->obj); LV_LOG_INFO("delete obj: %p", lobj->obj);
lobj->obj = NULL; lobj->obj = NULL;
lua_pop(L, 1); /* remove the userdata para */ lua_pop(L, 1); /* remove the userdata para */
return 0; 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); luavgl_obj_t *lobj = luavgl_to_lobj(L, -1);
if (lobj == NULL || lobj->obj == NULL) if (lobj == NULL || lobj->obj == NULL)
return 0; return 0;
@ -170,31 +202,36 @@ static int luavgl_obj_clean(lua_State *L) {
luavgl_obj_delete(L); luavgl_obj_delete(L);
} }
lua_pop(L, 1); /* remove the userdata para */ lua_settop(L, 1);
return 0; 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_istable(L, -1)) { if (!lua_istable(L, -1)) {
luaL_error(L, "expect a table on 2nd para."); luaL_error(L, "expect a table on 2nd para");
return 0; lua_settop(L, 1);
return 1;
} }
luavgl_setup_obj(L, obj); 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}) * 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_istable(L, 2)) { if (!lua_istable(L, 2)) {
debug("para should be table."); LV_LOG_ERROR("para should be table");
return luaL_argerror(L, 2, "should be table."); return luaL_argerror(L, 2, "should be table");
} }
lua_getfield(L, 2, "type"); 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; lv_obj_t *base = luavgl_to_lobj(L, -1)->obj;
lua_pop(L, 1); lua_pop(L, 1);
if (base == NULL) { 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"); 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); lua_pop(L, 1);
lv_obj_align_to(obj, base, align, x_ofs, y_ofs); 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 *obj = luavgl_to_obj(L, 1);
lv_obj_t *parent = luavgl_to_obj(L, 2); lv_obj_t *parent = luavgl_to_obj(L, 2);
lv_obj_set_parent(obj, parent); 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 *obj = luavgl_to_obj(L, 1);
lv_obj_t *screen = lv_obj_get_screen(obj); lv_obj_t *screen = lv_obj_get_screen(obj);
@ -246,7 +288,8 @@ static int luavgl_obj_get_screen(lua_State *L) {
return 1; 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 *obj = luavgl_to_obj(L, 1);
lv_obj_t *parent = lv_obj_get_parent(obj); lv_obj_t *parent = lv_obj_get_parent(obj);
@ -263,7 +306,8 @@ static int luavgl_obj_get_parent(lua_State *L) {
return 1; 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_isnoneornil(L, 2)) { if (!lua_isnoneornil(L, 2)) {
lv_obj_t *parent = luavgl_to_obj(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); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
int id = luavgl_tointeger(L, 2); int id = luavgl_tointeger(L, 2);
@ -293,13 +338,15 @@ static int luavgl_obj_get_child(lua_State *L) {
return 1; 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushinteger(L, lv_obj_get_child_cnt(obj)); lua_pushinteger(L, lv_obj_get_child_cnt(obj));
return 1; 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_obj_t *obj = luavgl_to_obj(L, 1);
lv_state_t state = lv_obj_get_state(obj); lv_state_t state = lv_obj_get_state(obj);
lua_pushinteger(L, state); 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, anim=true})
* obj:scroll_to({x=10, y=100, anim=false}) * 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_istable(L, -1)) { if (!lua_istable(L, -1)) {
@ -338,176 +386,231 @@ static int luavgl_obj_scroll_to(lua_State *L) {
} }
lua_pop(L, 1); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushboolean(L, lv_obj_is_visible(obj)); lua_pushboolean(L, lv_obj_is_visible(obj));
return 1; 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_t *obj = luavgl_to_obj(L, 1);
lv_obj_flag_t flag = lua_tointeger(L, 2); lv_obj_flag_t flag = lua_tointeger(L, 2);
lv_obj_add_flag(obj, flag); 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_t *obj = luavgl_to_obj(L, 1);
lv_obj_flag_t flag = lua_tointeger(L, 2); lv_obj_flag_t flag = lua_tointeger(L, 2);
lv_obj_clear_flag(obj, flag); 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_obj_t *obj = luavgl_to_obj(L, 1);
lv_state_t state = lua_tointeger(L, 2); lv_state_t state = lua_tointeger(L, 2);
lv_obj_add_state(obj, state); 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_obj_t *obj = luavgl_to_obj(L, 1);
lv_state_t state = lua_tointeger(L, 2); lv_state_t state = lua_tointeger(L, 2);
lv_obj_clear_state(obj, state); lv_obj_clear_state(obj, state);
return 0;
lua_settop(L, 1);
return 1;
} }
/** /**
* obj:scroll_by(x, y, anim_en) * 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
int x = luavgl_tointeger(L, 2); int x = luavgl_tointeger(L, 2);
int y = luavgl_tointeger(L, 3); int y = luavgl_tointeger(L, 3);
int anim_en = luavgl_tointeger(L, 4); int anim_en = luavgl_tointeger(L, 4);
lv_obj_scroll_by(obj, x, y, anim_en); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
int dx = luavgl_tointeger(L, 2); int dx = luavgl_tointeger(L, 2);
int dy = luavgl_tointeger(L, 3); int dy = luavgl_tointeger(L, 3);
int anim_en = luavgl_tointeger(L, 4); int anim_en = luavgl_tointeger(L, 4);
lv_obj_scroll_by_bounded(obj, dx, dy, anim_en); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
int anim_en = luavgl_tointeger(L, 2); int anim_en = luavgl_tointeger(L, 2);
lv_obj_scroll_to_view(obj, anim_en); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
int anim_en = luavgl_tointeger(L, 2); int anim_en = luavgl_tointeger(L, 2);
lv_obj_scroll_to_view_recursive(obj, anim_en); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
int x = luavgl_tointeger(L, 2); int x = luavgl_tointeger(L, 2);
int y = luavgl_tointeger(L, 3); int y = luavgl_tointeger(L, 3);
_lv_obj_scroll_by_raw(obj, x, y); _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); lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushboolean(L, lv_obj_is_scrolling(obj)); lua_pushboolean(L, lv_obj_is_scrolling(obj));
return 1; 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_t *obj = luavgl_to_obj(L, 1);
lv_obj_scrollbar_invalidate(obj); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
int anim_en = luavgl_tointeger(L, 2); int anim_en = luavgl_tointeger(L, 2);
lv_obj_readjust_scroll(obj, anim_en); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushboolean(L, lv_obj_is_editable(obj)); lua_pushboolean(L, lv_obj_is_editable(obj));
return 1; 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushboolean(L, lv_obj_is_group_def(obj)); lua_pushboolean(L, lv_obj_is_group_def(obj));
return 1; 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushboolean(L, lv_obj_is_layout_positioned(obj)); lua_pushboolean(L, lv_obj_is_layout_positioned(obj));
return 1; 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_t *obj = luavgl_to_obj(L, 1);
lv_obj_mark_layout_as_dirty(obj); 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_t *obj = luavgl_to_obj(L, 1);
lv_obj_center(obj); 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_t *obj = luavgl_to_obj(L, 1);
lv_obj_invalidate(obj); 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_obj_t *obj = luavgl_to_obj(L, 1);
lv_flex_flow_t flow = luavgl_tointeger(L, 2); lv_flex_flow_t flow = luavgl_tointeger(L, 2);
lv_obj_set_flex_flow(obj, flow); 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_obj_t *obj = luavgl_to_obj(L, 1);
lv_flex_align_t m = luavgl_tointeger(L, 2); lv_flex_align_t m = luavgl_tointeger(L, 2);
lv_flex_align_t c = luavgl_tointeger(L, 3); lv_flex_align_t c = luavgl_tointeger(L, 3);
lv_flex_align_t t = luavgl_tointeger(L, 4); lv_flex_align_t t = luavgl_tointeger(L, 4);
lv_obj_set_flex_align(obj, m, c, t); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
uint8_t grow = luavgl_tointeger(L, 2); uint8_t grow = luavgl_tointeger(L, 2);
lv_obj_set_flex_grow(obj, grow); 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_obj_t *obj = luavgl_to_obj(L, 1);
lv_point_t point; lv_point_t point;
if (lua_istable(L, 2)) { if (lua_istable(L, 2)) {
@ -537,7 +640,8 @@ static int luavgl_obj_indev_search(lua_State *L) {
return 1; 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_area_t area;
lv_obj_t *obj = luavgl_to_obj(L, 1); lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_get_coords(obj, &area); 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 * 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_newtable(L); lua_newtable(L);
@ -580,39 +685,18 @@ static int luavgl_obj_get_pos(lua_State *L) {
return 1; 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 * 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_obj_t *obj = luavgl_to_obj(L, 1);
lv_anim_del(obj, NULL); lv_anim_del(obj, NULL);
return 1; 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 (lua_type(L, 1) != LUA_TUSERDATA) {
/* If t = setmetatable({}, obj_meta_table), this will happen when t is /* 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 * 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; return 0;
} }
debug("\n"); LV_LOG_INFO("enter");
luavgl_obj_t *lobj = lua_touserdata(L, 1); luavgl_obj_t *lobj = lua_touserdata(L, 1);
if (lobj == NULL || lobj->obj == NULL) { if (lobj == NULL || lobj->obj == NULL) {
@ -629,70 +713,69 @@ static int luavgl_obj_gc(lua_State *L) {
return 0; return 0;
} }
debug("GC for obj: %p\n", lobj->obj); LV_LOG_INFO("GC for obj: %p", lobj->obj);
luavgl_obj_delete(L); luavgl_obj_delete(L);
return 0; return 0;
} }
static const luaL_Reg luavgl_obj_methods[] = { static const luaL_Reg luavgl_obj_methods[] = {
{"set", luavgl_obj_set}, {"set", luavgl_obj_set },
{"set_style", luavgl_obj_set_style}, {"set_style", luavgl_obj_set_style },
{"align_to", luavgl_obj_align_to}, {"align_to", luavgl_obj_align_to },
{"delete", luavgl_obj_delete}, {"delete", luavgl_obj_delete },
{"clean", luavgl_obj_clean}, {"clean", luavgl_obj_clean },
/* misc. functions */ /* misc. functions */
{"parent", luavgl_obj_set_get_parent}, {"parent", luavgl_obj_set_get_parent },
{"set_parent", luavgl_obj_set_parent}, {"set_parent", luavgl_obj_set_parent },
{"get_parent", luavgl_obj_get_parent}, {"get_parent", luavgl_obj_get_parent },
{"get_child", luavgl_obj_get_child}, {"get_child", luavgl_obj_get_child },
{"get_child_cnt", luavgl_obj_get_child_cnt}, {"get_child_cnt", luavgl_obj_get_child_cnt },
{"get_screen", luavgl_obj_get_screen}, {"get_screen", luavgl_obj_get_screen },
{"get_state", luavgl_obj_get_state}, {"get_state", luavgl_obj_get_state },
{"scroll_to", luavgl_obj_scroll_to}, {"scroll_to", luavgl_obj_scroll_to },
{"is_scrolling", luavgl_obj_is_scrolling}, {"is_scrolling", luavgl_obj_is_scrolling },
{"is_visible", luavgl_obj_is_visible}, {"is_visible", luavgl_obj_is_visible },
{"add_flag", luavgl_obj_add_flag}, {"add_flag", luavgl_obj_add_flag },
{"clear_flag", luavgl_obj_clear_flag}, {"clear_flag", luavgl_obj_clear_flag },
{"add_state", luavgl_obj_add_state}, {"add_state", luavgl_obj_add_state },
{"clear_state", luavgl_obj_clear_state}, {"clear_state", luavgl_obj_clear_state },
{"add_style", luavgl_obj_add_style}, {"add_style", luavgl_obj_add_style },
{"remove_style", luavgl_obj_remove_style}, {"remove_style", luavgl_obj_remove_style },
{"remove_style_all", luavgl_obj_remove_style_all}, {"remove_style_all", luavgl_obj_remove_style_all },
{"scroll_by", luavgl_obj_scroll_by}, {"scroll_by", luavgl_obj_scroll_by },
{"scroll_by_bounded", luavgl_obj_scroll_by_bounded}, {"scroll_by_bounded", luavgl_obj_scroll_by_bounded },
{"scroll_to_view", luavgl_obj_scroll_to_view}, {"scroll_to_view", luavgl_obj_scroll_to_view },
{"scroll_to_view_recursive", luavgl_obj_scroll_to_view_recursive}, {"scroll_to_view_recursive", luavgl_obj_scroll_to_view_recursive},
{"scroll_by_raw", luavgl_obj_scroll_by_raw}, {"scroll_by_raw", luavgl_obj_scroll_by_raw },
{"scrollbar_invalidate", luavgl_obj_scrollbar_invalidate}, {"scrollbar_invalidate", luavgl_obj_scrollbar_invalidate },
{"readjust_scroll", luavgl_obj_readjust_scroll}, {"readjust_scroll", luavgl_obj_readjust_scroll },
{"is_editable", luavgl_obj_is_editable}, {"is_editable", luavgl_obj_is_editable },
{"is_group_def", luavgl_obj_is_group_def}, {"is_group_def", luavgl_obj_is_group_def },
{"is_layout_positioned", luavgl_obj_is_layout_positioned}, {"is_layout_positioned", luavgl_obj_is_layout_positioned },
{"mark_layout_as_dirty", luavgl_obj_mark_layout_as_dirty}, {"mark_layout_as_dirty", luavgl_obj_mark_layout_as_dirty },
{"center", luavgl_obj_center}, {"center", luavgl_obj_center },
{"invalidate", luavgl_obj_invalidate}, {"invalidate", luavgl_obj_invalidate },
{"set_flex_flow", luavgl_obj_set_flex_flow}, {"set_flex_flow", luavgl_obj_set_flex_flow },
{"set_flex_align", luavgl_obj_set_flex_align}, {"set_flex_align", luavgl_obj_set_flex_align },
{"set_flex_grow", luavgl_obj_set_flex_grow}, {"set_flex_grow", luavgl_obj_set_flex_grow },
{"indev_search", luavgl_obj_indev_search}, {"indev_search", luavgl_obj_indev_search },
{"get_coords", luavgl_obj_get_coords}, {"get_coords", luavgl_obj_get_coords },
{"get_pos", luavgl_obj_get_pos}, {"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 },
{"onevent", luavgl_obj_on_event}, {"onClicked", luavgl_obj_on_clicked },
{"onPressed", luavgl_obj_on_pressed}, {"onShortClicked", luavgl_obj_on_short_clicked },
{"onClicked", luavgl_obj_on_clicked}, {"anim", luavgl_anim_create },
{"onShortClicked", luavgl_obj_on_short_clicked}, {"Anim", luavgl_anim_create },
{"anim", luavgl_anim_create}, {"remove_all_anim", luavgl_obj_remove_anim_all }, /* remove all */
{"Anim", luavgl_anim_create}, {NULL, NULL },
{"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 */ /* base lv_obj */
luavgl_obj_newmetatable(L, &lv_obj_class, "lv_obj", luavgl_obj_methods); luavgl_obj_newmetatable(L, &lv_obj_class, "lv_obj", luavgl_obj_methods);
lua_pushcfunction(L, luavgl_obj_gc); 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[] = { static const luavgl_value_setter_t obj_property_table[] = {
{"x", 0, {.setter = (setter_int_t)lv_obj_set_x}}, {"x", 0, {.setter = (setter_int_t)lv_obj_set_x} },
{"y", 0, {.setter = (setter_int_t)lv_obj_set_y}}, {"y", 0, {.setter = (setter_int_t)lv_obj_set_y} },
{"w", 0, {.setter = (setter_int_t)lv_obj_set_width}}, {"w", 0, {.setter = (setter_int_t)lv_obj_set_width} },
{"h", 0, {.setter = (setter_int_t)lv_obj_set_height}}, {"h", 0, {.setter = (setter_int_t)lv_obj_set_height} },
{"align", SETTER_TYPE_STACK, {.setter_stack = _lv_obj_set_align}}, {"align", SETTER_TYPE_STACK, {.setter_stack = _lv_obj_set_align} },
{"scrollbar_mode", 0, {.setter = (setter_int_t)lv_obj_set_scrollbar_mode}}, {"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_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_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}}, {"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[-2]: key(property name)
* stack[-1]: value(could be any lua data) * 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; 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); int ret = luavgl_set_property(L, obj, obj_property_table);
if (ret == 0) 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, 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); luavgl_ctx_t *ctx = luavgl_context(L);
lv_obj_t *parent; lv_obj_t *parent;
@ -765,7 +858,7 @@ LUALIB_API int luavgl_obj_create_helper(lua_State *L,
lua_remove(L, 1); 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); lv_obj_t *obj = create(parent);
luavgl_add_lobj(L, obj)->lua_created = true; 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); lua_rawget(L, LUA_REGISTRYINDEX);
} }
debug("create obj: %p\n", obj); LV_LOG_INFO("create obj: %p", obj);
return 1; 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 * If no metatable not found for this obj class, then lv_obj_class metatable is
* used * 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; luavgl_obj_t *lobj;
/* In rare case, obj may be deleted but not gc'ed in lua, and lvgl quickly /* 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) { if (luavgl_obj_getmetatable(L, obj->class_p) == LUA_TNIL) {
lua_pop(L, 1); 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 */ /* use base obj metatable instead */
luavgl_obj_getmetatable(L, &lv_obj_class); luavgl_obj_getmetatable(L, &lv_obj_class);
} }
lua_setmetatable(L, -2); lua_setmetatable(L, -2);
memset(lobj, 0, sizeof(*lobj)); lv_memset(lobj, 0, sizeof(*lobj));
luavgl_obj_event_init(lobj);
lobj->obj = obj; 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); lv_obj_add_event_cb(obj, obj_delete_cb, LV_EVENT_DELETE, L);
/* registry[obj] = lobj */ /* registry[obj] = lobj */

@ -6,19 +6,6 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h>
/* 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 dumpstack(lua_State *L);
static void dumptable(lua_State *L, int index); 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_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); 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); static void luavgl_obj_remove_event_all(lua_State *L, luavgl_obj_t *obj);
/* util functions */ /* util functions */

@ -54,10 +54,13 @@ static const struct style_map_s {
{"transform_height", LV_STYLE_TRANSFORM_HEIGHT, STYLE_TYPE_INT }, {"transform_height", LV_STYLE_TRANSFORM_HEIGHT, STYLE_TYPE_INT },
{"translate_x", LV_STYLE_TRANSLATE_X, STYLE_TYPE_INT }, {"translate_x", LV_STYLE_TRANSLATE_X, STYLE_TYPE_INT },
{"translate_y", LV_STYLE_TRANSLATE_Y, STYLE_TYPE_INT }, {"translate_y", LV_STYLE_TRANSLATE_Y, STYLE_TYPE_INT },
{"transform_zoom", LV_STYLE_TRANSFORM_ZOOM, STYLE_TYPE_INT }, {"transform_scale_x", LV_STYLE_TRANSFORM_SCALE_X, STYLE_TYPE_INT },
{"transform_angle", LV_STYLE_TRANSFORM_ANGLE, 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_x", LV_STYLE_TRANSFORM_PIVOT_X, STYLE_TYPE_INT },
{"transform_pivot_y", LV_STYLE_TRANSFORM_PIVOT_Y, 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_top", LV_STYLE_PAD_TOP, STYLE_TYPE_INT },
{"pad_bottom", LV_STYLE_PAD_BOTTOM, STYLE_TYPE_INT }, {"pad_bottom", LV_STYLE_PAD_BOTTOM, STYLE_TYPE_INT },
{"pad_left", LV_STYLE_PAD_LEFT, 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_grad_dir", LV_STYLE_BG_GRAD_DIR, STYLE_TYPE_INT },
{"bg_main_stop", LV_STYLE_BG_MAIN_STOP, 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_grad_stop", LV_STYLE_BG_GRAD_STOP, STYLE_TYPE_INT },
{"bg_dither_mode", LV_STYLE_BG_DITHER_MODE, STYLE_TYPE_INT }, {"bg_image_src", LV_STYLE_BG_IMAGE_SRC, STYLE_TYPE_IMGSRC },
{"bg_img_src", LV_STYLE_BG_IMG_SRC, STYLE_TYPE_IMGSRC }, {"bg_image_opa", LV_STYLE_BG_IMAGE_OPA, STYLE_TYPE_INT },
{"bg_img_opa", LV_STYLE_BG_IMG_OPA, STYLE_TYPE_INT }, {"bg_image_recolor", LV_STYLE_BG_IMAGE_RECOLOR, STYLE_TYPE_COLOR },
{"bg_img_recolor", LV_STYLE_BG_IMG_RECOLOR, STYLE_TYPE_COLOR }, {"bg_image_recolor_opa", LV_STYLE_BG_IMAGE_RECOLOR_OPA, STYLE_TYPE_INT },
{"bg_img_recolor_opa", LV_STYLE_BG_IMG_RECOLOR_OPA, STYLE_TYPE_INT }, {"bg_image_tiled", LV_STYLE_BG_IMAGE_TILED, STYLE_TYPE_INT },
{"bg_img_tiled", LV_STYLE_BG_IMG_TILED, STYLE_TYPE_INT },
{"border_color", LV_STYLE_BORDER_COLOR, STYLE_TYPE_COLOR }, {"border_color", LV_STYLE_BORDER_COLOR, STYLE_TYPE_COLOR },
{"border_opa", LV_STYLE_BORDER_OPA, STYLE_TYPE_INT }, {"border_opa", LV_STYLE_BORDER_OPA, STYLE_TYPE_INT },
{"border_width", LV_STYLE_BORDER_WIDTH, 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_opa", LV_STYLE_OUTLINE_OPA, STYLE_TYPE_INT },
{"outline_pad", LV_STYLE_OUTLINE_PAD, STYLE_TYPE_INT }, {"outline_pad", LV_STYLE_OUTLINE_PAD, STYLE_TYPE_INT },
{"shadow_width", LV_STYLE_SHADOW_WIDTH, STYLE_TYPE_INT }, {"shadow_width", LV_STYLE_SHADOW_WIDTH, STYLE_TYPE_INT },
{"shadow_ofs_x", LV_STYLE_SHADOW_OFS_X, STYLE_TYPE_INT }, {"shadow_offset_x", LV_STYLE_SHADOW_OFFSET_X, STYLE_TYPE_INT },
{"shadow_ofs_y", LV_STYLE_SHADOW_OFS_Y, STYLE_TYPE_INT }, {"shadow_offset_y", LV_STYLE_SHADOW_OFFSET_Y, STYLE_TYPE_INT },
{"shadow_spread", LV_STYLE_SHADOW_SPREAD, STYLE_TYPE_INT }, {"shadow_spread", LV_STYLE_SHADOW_SPREAD, STYLE_TYPE_INT },
{"shadow_color", LV_STYLE_SHADOW_COLOR, STYLE_TYPE_COLOR }, {"shadow_color", LV_STYLE_SHADOW_COLOR, STYLE_TYPE_COLOR },
{"shadow_opa", LV_STYLE_SHADOW_OPA, STYLE_TYPE_INT }, {"shadow_opa", LV_STYLE_SHADOW_OPA, STYLE_TYPE_INT },
{"img_opa", LV_STYLE_IMG_OPA, STYLE_TYPE_INT }, {"image_opa", LV_STYLE_IMAGE_OPA, STYLE_TYPE_INT },
{"img_recolor", LV_STYLE_IMG_RECOLOR, STYLE_TYPE_COLOR }, {"image_recolor", LV_STYLE_IMAGE_RECOLOR, STYLE_TYPE_COLOR },
{"img_recolor_opa", LV_STYLE_IMG_RECOLOR_OPA, STYLE_TYPE_INT }, {"image_recolor_opa", LV_STYLE_IMAGE_RECOLOR_OPA, STYLE_TYPE_INT },
{"line_width", LV_STYLE_LINE_WIDTH, 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_width", LV_STYLE_LINE_DASH_WIDTH, STYLE_TYPE_INT },
{"line_dash_gap", LV_STYLE_LINE_DASH_GAP, 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_color", LV_STYLE_LINE_COLOR, STYLE_TYPE_INT },
{"line_opa", LV_STYLE_LINE_OPA, STYLE_TYPE_INT }, {"line_opa", LV_STYLE_LINE_OPA, STYLE_TYPE_INT },
{"arc_width", LV_STYLE_ARC_WIDTH, 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_rounded", LV_STYLE_ARC_ROUNDED, STYLE_TYPE_INT },
{"arc_color", LV_STYLE_ARC_COLOR, STYLE_TYPE_COLOR }, {"arc_color", LV_STYLE_ARC_COLOR, STYLE_TYPE_COLOR },
{"arc_opa", LV_STYLE_ARC_OPA, STYLE_TYPE_INT }, {"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 }, {"opa", LV_STYLE_OPA, STYLE_TYPE_INT },
{"color_filter_opa", LV_STYLE_COLOR_FILTER_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_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 }, {"blend_mode", LV_STYLE_BLEND_MODE, STYLE_TYPE_INT },
{"layout", LV_STYLE_LAYOUT, STYLE_TYPE_INT }, {"layout", LV_STYLE_LAYOUT, STYLE_TYPE_INT },
{"base_dir", LV_STYLE_BASE_DIR, 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 */ /* need to build pointer from table parameter */
{"bg_grad", LV_STYLE_BG_GRAD, STYLE_TYPE_SPECIAL }, /* pointer from table */ {"bg_grad", LV_STYLE_BG_GRAD, STYLE_TYPE_SPECIAL }, /* pointer from table */
{"color_filter_dsc", LV_STYLE_COLOR_FILTER_DSC, STYLE_TYPE_SPECIAL }, /**/ {"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 */ {"anim", LV_STYLE_ANIM, STYLE_TYPE_SPECIAL }, /* anim para */
#endif
{"transition", LV_STYLE_TRANSITION, STYLE_TYPE_SPECIAL }, /* transition */ {"transition", LV_STYLE_TRANSITION, STYLE_TYPE_SPECIAL }, /* transition */
/* styles combined */ /* 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); 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, static void lv_style_set_inherit_cb(lv_style_prop_t prop,
lv_style_value_t value, void *args) lv_style_value_t value, void *args)
{ {
lv_style_t *s = args; lv_style_t *s = args;
lv_style_set_prop_meta(s, prop, LV_STYLE_PROP_META_INHERIT); lv_style_set_prop_meta(s, prop, LV_STYLE_PROP_META_INHERIT);
} }
#endif
static uint8_t to_int(char c) 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; return LV_FLEX_ALIGN_START;
const char *str = lua_tostring(L, idx); 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; return LV_FLEX_ALIGN_START;
if (strcmp("flex-end", str) == 0) if (lv_strcmp("flex-end", str) == 0)
return LV_FLEX_ALIGN_END; return LV_FLEX_ALIGN_END;
if (strcmp("center", str) == 0) if (lv_strcmp("center", str) == 0)
return LV_FLEX_ALIGN_CENTER; return LV_FLEX_ALIGN_CENTER;
if (strcmp("space-evenly", str) == 0) if (lv_strcmp("space-evenly", str) == 0)
return LV_FLEX_ALIGN_SPACE_EVENLY; 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; 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_SPACE_BETWEEN;
return LV_FLEX_ALIGN_START; 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, static int luavgl_set_flex_layout_kv(lua_State *L, style_set_cb_t cb,
void *args) void *args)
{ {
if (!lua_istable(L, -1)) { if (!lua_istable(L, -1)) {
debug("para should be table."); LV_LOG_ERROR("para should be table");
return luaL_argerror(L, -1, "should be table."); return luaL_argerror(L, -1, "should be table");
} }
const char *str; 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) { if (lua_type(L, -1) == LUA_TSTRING) {
str = lua_tostring(L, -1); str = lua_tostring(L, -1);
/* starts with */ /* starts with */
if (strncmp("row", str, 3) == 0) { if (lv_strcmp("row", str) == 0) {
flow = LV_FLEX_FLOW_ROW; flow = LV_FLEX_FLOW_ROW;
} else if (strncmp("column", str, 3) == 0) { } else if (lv_strcmp("column", str) == 0) {
flow = LV_FLEX_FLOW_COLUMN; flow = LV_FLEX_FLOW_COLUMN;
} }
/* if reverse presents */ /* if reverse presents */
if (strstr(str, "-reverse")) { if (luavgl_strstr(str, "-reverse")) {
flow |= _LV_FLEX_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"); lua_getfield(L, -1, "flex_wrap");
if (lua_type(L, -1) == LUA_TSTRING) { if (lua_type(L, -1) == LUA_TSTRING) {
str = lua_tostring(L, -1); str = lua_tostring(L, -1);
if (strcmp("wrap", str) == 0) { if (lv_strcmp("wrap", str) == 0) {
flow |= _LV_FLEX_WRAP; 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; flow |= _LV_FLEX_WRAP | _LV_FLEX_REVERSE;
} }
/* else: normal */ /* else: normal */
@ -316,7 +341,7 @@ static inline bool luavgl_is_style_inherit(lua_State *L)
{ {
const char *str; const char *str;
return (lua_type(L, -1) == LUA_TSTRING) && (str = lua_tostring(L, -1)) && 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); const char *key = lua_tostring(L, -2);
if (key == NULL) { if (key == NULL) {
debug("Null key, ignored.\n"); LV_LOG_WARN("Null key, ignored");
return -1; 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}; lv_style_value_t value = {0};
const struct style_map_s *p = NULL; const struct style_map_s *p = NULL;
for (int i = 0; i < STYLE_MAP_LEN; i++) { 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]; p = &g_style_map[i];
break; 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) { if (p->type & STYLE_TYPE_SPECIAL) {
switch ((int)p->prop) { switch ((int)prop) {
/* style combinations */ /* style combinations */
case LV_STYLE_SIZE: case LV_STYLE_SIZE:
cb(LV_STYLE_WIDTH, value, args); 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: case LV_STYLE_COLOR_FILTER_DSC:
break; break;
#if LV_VERSION_CHECK(8, 3, 0)
case LV_STYLE_ANIM: case LV_STYLE_ANIM:
break; break;
#endif
case LV_STYLE_TRANSITION: case LV_STYLE_TRANSITION:
break; break;
@ -442,8 +477,8 @@ static int luavgl_set_style_kv(lua_State *L, style_set_cb_t cb, void *args)
default: default:
break; break;
} }
} else if (p->prop <= _LV_STYLE_LAST_BUILT_IN_PROP) { } else if ((prop & mask) <= _LV_STYLE_LAST_BUILT_IN_PROP) {
cb(p->prop, value, args); cb(prop & mask, value, args);
} else { } else {
return luaL_error(L, "unknown style"); 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); luavgl_style_t *s = luavgl_check_style(L, 1);
if (!lua_istable(L, 2)) { 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; return 0;
} }
@ -468,16 +503,21 @@ static int luavgl_style_set(lua_State *L)
/* -1: value, -2: key */ /* -1: value, -2: key */
if (!lua_isstring(L, -2)) { if (!lua_isstring(L, -2)) {
/* we expect string as key, ignore it if not */ /* 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); lua_pop(L, 1);
continue; continue;
} }
#if LV_VERSION_CHECK(8, 3, 0)
/* special value check */ /* special value check */
bool inherit = luavgl_is_style_inherit(L); bool inherit = luavgl_is_style_inherit(L);
luavgl_set_style_kv(L, inherit ? lv_style_set_inherit_cb : lv_style_set_cb, luavgl_set_style_kv(L, inherit ? lv_style_set_inherit_cb : lv_style_set_cb,
s); s);
#else
luavgl_set_style_kv(L, lv_style_set_cb, s);
#endif
lua_pop(L, 1); /* remove value, keep the key to continue. */ 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)); luavgl_style_t *s = malloc(sizeof(luavgl_style_t));
if (s == NULL) { if (s == NULL) {
return luaL_error(L, "No memory."); return luaL_error(L, "No memory");
} }
lv_style_init(&s->style); 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++) { for (int i = 0; i < STYLE_MAP_LEN; i++) {
const struct style_map_s *p = &g_style_map[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); lv_style_remove_prop(&s->style, p->prop);
return 0; return 0;
} }
@ -553,7 +593,7 @@ static int luavgl_style_gc(lua_State *L)
luavgl_style_t *s = luavgl_check_style(L, 1); luavgl_style_t *s = luavgl_check_style(L, 1);
lv_style_reset(&s->style); lv_style_reset(&s->style);
free(s); free(s);
debug("gc style:%p\n", s); LV_LOG_INFO("gc style:%p", s);
return 0; 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); 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, static void obj_style_inherit_set_cb(lv_style_prop_t prop,
lv_style_value_t value, void *args) 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, lv_obj_set_local_style_prop_meta(info->obj, prop, LV_STYLE_PROP_META_INHERIT,
info->selector); info->selector);
} }
#endif
static int luavgl_obj_set_style_kv(lua_State *L, lv_obj_t *obj, int selector) 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, .selector = selector,
}; };
#if LV_VERSION_CHECK(8, 3, 0)
/* special value check */ /* special value check */
bool inherit = luavgl_is_style_inherit(L); bool inherit = luavgl_is_style_inherit(L);
return luavgl_set_style_kv( return luavgl_set_style_kv(
L, inherit ? obj_style_inherit_set_cb : obj_style_set_cb, &info); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
if (obj == NULL) { if (obj == NULL) {
luaL_argerror(L, 1, "obj could already been deleted."); luaL_argerror(L, 1, "obj could already been deleted");
return 0; return 0;
} }
if (!lua_istable(L, 2)) { 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; return 0;
} }
@ -622,7 +668,7 @@ static int luavgl_obj_set_style(lua_State *L)
/* -1: value, -2: key */ /* -1: value, -2: key */
if (!lua_isstring(L, -2)) { if (!lua_isstring(L, -2)) {
/* we expect string as key, ignore it if not */ /* 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); lua_pop(L, 1);
continue; continue;
} }

@ -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); int ret = luavgl_set_property(L, data, timer_property_table);
if (ret != 0) { if (ret != 0) {
debug("failed\n"); LV_LOG_ERROR("failed");
} }
return ret; return ret;
@ -88,7 +88,7 @@ static int luavgl_timer_create(lua_State *L)
{ {
luavgl_timer_t *data = malloc(sizeof(luavgl_timer_t)); luavgl_timer_t *data = malloc(sizeof(luavgl_timer_t));
if (data == NULL) { if (data == NULL) {
return luaL_error(L, "No memory."); return luaL_error(L, "No memory");
} }
data->ref = LUA_NOREF; data->ref = LUA_NOREF;
data->L = L; data->L = L;
@ -119,7 +119,7 @@ static int luavgl_timer_set(lua_State *L)
{ {
lv_timer_t *t = luavgl_check_timer(L, 1); lv_timer_t *t = luavgl_check_timer(L, 1);
if (t == NULL) { 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); 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); lv_timer_t *t = luavgl_check_timer(L, 1);
if (t == NULL) { if (t == NULL) {
return luaL_argerror(L, 1, "timer is null."); return luaL_argerror(L, 1, "timer is null");
} }
lv_timer_ready(t); 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); lv_timer_t *t = luavgl_check_timer(L, 1);
if (t == NULL) { if (t == NULL) {
return luaL_argerror(L, 1, "timer is null."); return luaL_argerror(L, 1, "timer is null");
} }
lv_timer_resume(t); 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); lv_timer_t *t = luavgl_check_timer(L, 1);
if (t == NULL) { if (t == NULL) {
return luaL_argerror(L, 1, "timer is null."); return luaL_argerror(L, 1, "timer is null");
} }
lv_timer_pause(t); 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); lv_timer_t *t = luavgl_check_timer(L, 1);
if (t == NULL) { 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; 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 */ /* we can only release memory in gc, since we need t->use_data */
lv_timer_pause(t); lv_timer_pause(t);
debug("delete timer:%p\n", t); LV_LOG_INFO("delete timer:%p", t);
return 0; return 0;
} }
@ -194,7 +194,7 @@ static int luavgl_timer_gc(lua_State *L)
free(t->user_data); free(t->user_data);
lv_timer_del(t); lv_timer_del(t);
debug("gc timer:%p\n", t); LV_LOG_INFO("gc timer:%p", t);
return 0; return 0;
} }

@ -16,7 +16,7 @@ LUALIB_API luavgl_obj_t *luavgl_to_lobj(lua_State *L, int idx)
return lobj; return lobj;
fail: fail:
debug("arg not lv_obj userdata.\n"); LV_LOG_ERROR("arg not lv_obj userdata");
luaL_argerror(L, idx, "Expected lv_obj userdata"); luaL_argerror(L, idx, "Expected lv_obj userdata");
return NULL; return NULL;
} }
@ -55,19 +55,19 @@ static void dumpvalue(lua_State *L, int i, bool cr)
const char ending = cr ? '\n' : '\0'; const char ending = cr ? '\n' : '\0';
switch (lua_type(L, i)) { switch (lua_type(L, i)) {
case LUA_TNUMBER: case LUA_TNUMBER:
printf("number: %g%c", lua_tonumber(L, i), ending); LV_LOG_USER("number: %g%c", lua_tonumber(L, i), ending);
break; break;
case LUA_TSTRING: case LUA_TSTRING:
printf("string: %s%c", lua_tostring(L, i), ending); LV_LOG_USER("string: %s%c", lua_tostring(L, i), ending);
break; break;
case LUA_TBOOLEAN: 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; break;
case LUA_TNIL: case LUA_TNIL:
printf("nil: %s%c", "nil", ending); LV_LOG_USER("nil: %s%c", "nil", ending);
break; break;
default: default:
printf("pointer: %p%c", lua_topointer(L, i), ending); LV_LOG_USER("pointer: %p%c", lua_topointer(L, i), ending);
break; break;
} }
} }
@ -79,7 +79,7 @@ static void dumptable(lua_State *L, int index)
while (lua_next(L, i)) { while (lua_next(L, i)) {
/* -1: value, -2: key */ /* -1: value, -2: key */
dumpvalue(L, -2, 0); dumpvalue(L, -2, 0);
printf(" "); LV_LOG_USER(" ");
dumpvalue(L, -1, 1); dumpvalue(L, -1, 1);
lua_pop(L, 1); /* remove value, keep the key to continue. */ 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) static void dumpstack(lua_State *L)
{ {
int top = lua_gettop(L); int top = lua_gettop(L);
printf("\n");
for (int i = 1; i <= top; i++) { for (int i = 1; i <= top; i++) {
printf("%d\t%s\t", i, luaL_typename(L, i));
switch (lua_type(L, i)) { switch (lua_type(L, i)) {
case LUA_TNUMBER: 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; break;
case LUA_TSTRING: 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; break;
case LUA_TBOOLEAN: 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; break;
case LUA_TNIL: case LUA_TNIL:
printf("nil: %s\n", "nil"); LV_LOG_USER("%s: %s", luaL_typename(L, i), "nil");
break; break;
default: default:
printf("pointer: %p\n", lua_topointer(L, i)); LV_LOG_USER("%s: %p", luaL_typename(L, i), lua_topointer(L, i));
break; 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 */ lua_insert(L, base); /* put it under function and args */
int status = lua_pcall(L, nargs, nresult, base); int status = lua_pcall(L, nargs, nresult, base);
if (status != LUA_OK) { 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 */ 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 */ /* support #RGB and #RRGGBB */
const char *s = lua_tostring(L, idx); const char *s = lua_tostring(L, idx);
if (s == NULL) { if (s == NULL) {
luaL_error(L, "unknown color."); luaL_error(L, "unknown color");
return color; return color;
} }
int len = strlen(s); int len = lv_strlen(s);
if (len == 4 && s[0] == '#') { if (len == 4 && s[0] == '#') {
/* #RGB */ /* #RGB */
int r = to_int(s[1]); 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]); int b = (to_int(s[5]) << 4) | to_int(s[6]);
color = lv_color_make(r, g, b); color = lv_color_make(r, g, b);
} else { } else {
luaL_error(L, "unknown color format."); luaL_error(L, "unknown color format");
return color; return color;
} }
} else { } else {
@ -340,11 +338,11 @@ LUALIB_API const char *luavgl_toimgsrc(lua_State *L, int idx)
const char *src = NULL; const char *src = NULL;
if (lua_isuserdata(L, idx)) { if (lua_isuserdata(L, idx)) {
src = lua_touserdata(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)) { } else if (lua_isstring(L, idx)) {
src = lua_tostring(L, idx); src = lua_tostring(L, idx);
} else { } else {
debug("img src should be string or userdata.\n"); LV_LOG_ERROR("img src should be string or userdata");
return NULL; 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 (*cb)(lua_State *, void *), void *cb_para)
{ {
int i = index < 0 ? index - 1 : index; int i = index < 0 ? index - 1 : index;
lua_pushnil(L); /* nil as initial key to iterate through table */ lua_pushnil(L); /* nil as initial key to iterate through table */
while (lua_next(L, i)) { while (lua_next(L, i)) {
/* -1: value, -2: key */ /* -1: value, -2: key */
if (!lua_isstring(L, -2)) { if (!lua_isstring(L, -2)) {
/* we expect string as key, ignore it if not */ /* 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); lua_pop(L, 1);
continue; continue;
} }
@ -376,13 +375,13 @@ LUALIB_API int luavgl_set_property_array(lua_State *L, void *obj,
{ {
const char *key = lua_tostring(L, -2); const char *key = lua_tostring(L, -2);
if (key == NULL) { if (key == NULL) {
debug("Null key, ignored.\n"); LV_LOG_ERROR("Null key, ignored");
return -1; return -1;
} }
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
const luavgl_value_setter_t *p = &table[i]; const luavgl_value_setter_t *p = &table[i];
if (strcmp(key, p->key)) if (lv_strcmp(key, p->key))
continue; continue;
if (p->type == SETTER_TYPE_INT) { 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); p->setter(obj, v);
} else if (p->type == SETTER_TYPE_COLOR) { } else if (p->type == SETTER_TYPE_COLOR) {
/* color */ /* color */
lv_color_t color = luavgl_tocolor(L, -1); union {
p->setter(obj, color.full); 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) { } else if (p->type == SETTER_TYPE_IMGSRC) {
/* img src */ /* img src */
p->setter_pointer(obj, (void *)luavgl_toimgsrc(L, -1)); 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); void *data = lua_touserdata(L, -1);
p->setter_pointer(obj, data); p->setter_pointer(obj, data);
} else { } else {
debug("unsupported type: %d\n", p->type); LV_LOG_ERROR("unsupported type: %d", p->type);
} }
return 0; return 0;
} }

@ -65,7 +65,7 @@ LUALIB_API int luavgl_calendar_set_property_kv(lua_State *L, void *data)
/* a base obj property? */ /* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj); ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) { if (ret != 0) {
debug("unkown property for calendar.\n"); LV_LOG_ERROR("unkown property for calendar.");
} }
return ret; return ret;

@ -32,7 +32,7 @@ LUALIB_API int luavgl_checkbox_set_property_kv(lua_State *L, void *data)
/* a base obj property? */ /* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj); ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) { if (ret != 0) {
debug("unkown property for checkbox.\n"); LV_LOG_ERROR("unkown property for checkbox");
} }
return ret; return ret;

@ -36,7 +36,7 @@ LUALIB_API int luavgl_dropdown_set_property_kv(lua_State *L, void *data)
/* a base obj property? */ /* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj); ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) { if (ret != 0) {
debug("unkown property for dropdown.\n"); LV_LOG_ERROR("unkown property for dropdown");
} }
return ret; return ret;
@ -72,7 +72,7 @@ static int luavgl_dropdown_get(lua_State *L)
} }
const char *key = lua_tostring(L, 2); 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); lv_obj_t *list = lv_dropdown_get_list(obj);
lua_pushlightuserdata(L, list); lua_pushlightuserdata(L, list);
lua_rawget(L, LUA_REGISTRYINDEX); lua_rawget(L, LUA_REGISTRYINDEX);
@ -83,45 +83,47 @@ static int luavgl_dropdown_get(lua_State *L)
return 1; return 1;
} }
if (strcmp(key, "text") == 0) { if (lv_strcmp(key, "text") == 0) {
lua_pushstring(L, lv_dropdown_get_text(obj)); lua_pushstring(L, lv_dropdown_get_text(obj));
return 1; return 1;
} }
if (strcmp(key, "options") == 0) { if (lv_strcmp(key, "options") == 0) {
lua_pushstring(L, lv_dropdown_get_options(obj)); lua_pushstring(L, lv_dropdown_get_options(obj));
return 1; return 1;
} }
if (strcmp(key, "selected") == 0) { if (lv_strcmp(key, "selected") == 0) {
lua_pushinteger(L, lv_dropdown_get_selected(obj)); lua_pushinteger(L, lv_dropdown_get_selected(obj));
return 1; return 1;
} }
if (strcmp(key, "option_cnt") == 0) { if (lv_strcmp(key, "option_cnt") == 0) {
lua_pushinteger(L, lv_dropdown_get_option_cnt(obj)); lua_pushinteger(L, lv_dropdown_get_option_cnt(obj));
return 1; return 1;
} }
if (strcmp(key, "selected_str") == 0) { if (lv_strcmp(key, "selected_str") == 0) {
char buf[64]; char buf[64];
lv_dropdown_get_selected_str(obj, buf, sizeof(buf)); lv_dropdown_get_selected_str(obj, buf, sizeof(buf));
lua_pushstring(L, buf); lua_pushstring(L, buf);
return 1; 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); const char *option = lua_tostring(L, 3);
lua_pushinteger(L, lv_dropdown_get_option_index(obj, option)); lua_pushinteger(L, lv_dropdown_get_option_index(obj, option));
return 1; return 1;
} }
#endif
if (strcmp(key, "symbol") == 0) { if (lv_strcmp(key, "symbol") == 0) {
lua_pushlightuserdata(L, (void *)lv_dropdown_get_symbol(obj)); lua_pushlightuserdata(L, (void *)lv_dropdown_get_symbol(obj));
return 1; return 1;
} }
if (strcmp(key, "dir") == 0) { if (lv_strcmp(key, "dir") == 0) {
lua_pushinteger(L, lv_dropdown_get_dir(obj)); lua_pushinteger(L, lv_dropdown_get_dir(obj));
return 1; return 1;
} }

@ -3,14 +3,14 @@
static int luavgl_img_create(lua_State *L) 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)) { if (!lua_istable(L, -1)) {
luaL_argerror(L, -1, "should be table."); luaL_argerror(L, -1, "should be table.");
debug("para should be table."); LV_LOG_ERROR("para should be table.");
return; return;
} }
@ -22,18 +22,18 @@ static void _lv_img_set_pivot(void *obj, lua_State *L)
lv_coord_t y = lua_tointeger(L, -1); lv_coord_t y = lua_tointeger(L, -1);
lua_pop(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[] = { static const luavgl_value_setter_t img_property_table[] = {
{"src", {"src",
SETTER_TYPE_IMGSRC, {.setter_pointer = (setter_pointer_t)lv_img_set_src}}, SETTER_TYPE_IMGSRC, {.setter_pointer = (setter_pointer_t)lv_image_set_src}},
{"offset_x", 0, {.setter = (setter_int_t)lv_img_set_offset_x} }, {"offset_x", 0, {.setter = (setter_int_t)lv_image_set_offset_x} },
{"offset_y", 0, {.setter = (setter_int_t)lv_img_set_offset_y} }, {"offset_y", 0, {.setter = (setter_int_t)lv_image_set_offset_y} },
{"angle", 0, {.setter = (setter_int_t)lv_img_set_angle} }, {"angle", 0, {.setter = (setter_int_t)lv_img_set_angle} },
{"zoom", 0, {.setter = (setter_int_t)lv_img_set_zoom} }, {"zoom", 0, {.setter = (setter_int_t)lv_img_set_zoom} },
{"antialias", 0, {.setter = (setter_int_t)lv_img_set_antialias} }, {"antialias", 0, {.setter = (setter_int_t)lv_image_set_antialias} },
{"pivot", SETTER_TYPE_STACK, {.setter_stack = _lv_img_set_pivot} }, {"pivot", SETTER_TYPE_STACK, {.setter_stack = lv_image_set_pivot_} },
}; };
LUALIB_API int luavgl_img_set_property_kv(lua_State *L, void *data) 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? */ /* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj); ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) { if (ret != 0) {
debug("unkown property for image.\n"); LV_LOG_ERROR("unkown property for image");
} }
return ret; return ret;
@ -69,11 +69,11 @@ static int luavgl_img_set(lua_State *L)
const char *src = NULL; const char *src = NULL;
if (lua_isuserdata(L, -1)) { if (lua_isuserdata(L, -1)) {
src = lua_touserdata(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 { } else {
src = lua_tostring(L, -1); src = lua_tostring(L, -1);
} }
lv_img_set_src(obj, src); lv_image_set_src(obj, src);
} }
lua_pop(L, 1); 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); lv_obj_t *obj = luavgl_to_obj(L, 1);
const char *src = luavgl_toimgsrc(L, 2); const char *src = luavgl_toimgsrc(L, 2);
if (src != NULL) { if (src != NULL) {
lv_img_set_src(obj, src); lv_image_set_src(obj, src);
} }
return 0; return 0;
@ -114,14 +114,14 @@ static int luavgl_img_set_offset(lua_State *L)
if (!lua_isnil(L, -1)) { if (!lua_isnil(L, -1)) {
v = lua_tointeger(L, -1); v = lua_tointeger(L, -1);
lua_pop(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"); lua_getfield(L, -1, "y");
if (!lua_isnil(L, -1)) { if (!lua_isnil(L, -1)) {
v = lua_tointeger(L, -1); v = lua_tointeger(L, -1);
lua_pop(L, 1); lua_pop(L, 1);
lv_img_set_offset_y(obj, v); lv_image_set_offset_y(obj, v);
} }
return 0; return 0;
@ -145,7 +145,7 @@ static int luavgl_img_set_pivot(lua_State *L)
lua_getfield(L, -1, "y"); lua_getfield(L, -1, "y");
y = lua_tointeger(L, -1); y = lua_tointeger(L, -1);
lv_img_set_pivot(obj, x, y); lv_image_set_pivot(obj, x, y);
return 0; return 0;
} }
@ -161,13 +161,13 @@ static int luavgl_get_img_size(lua_State *L)
const void *src = NULL; const void *src = NULL;
if (lua_isnoneornil(L, 2)) { if (lua_isnoneornil(L, 2)) {
src = lv_img_get_src(obj); src = lv_image_get_src(obj);
} else { } else {
src = luavgl_toimgsrc(L, 2); src = luavgl_toimgsrc(L, 2);
} }
lv_img_header_t header; lv_image_header_t header;
if (src == NULL || lv_img_decoder_get_info(src, &header) != LV_RES_OK) { if (src == NULL || lv_image_decoder_get_info(src, &header) != LV_RES_OK) {
lua_pushnil(L); lua_pushnil(L);
lua_pushnil(L); lua_pushnil(L);
} else { } else {
@ -191,6 +191,6 @@ static const luaL_Reg luavgl_img_methods[] = {
static void luavgl_img_init(lua_State *L) 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); lua_pop(L, 1);
} }

@ -36,7 +36,7 @@ LUALIB_API int luavgl_keyboard_set_property_kv(lua_State *L, void *data)
/* a base obj property? */ /* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj); ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) { if (ret != 0) {
debug("unkown property for keyboard.\n"); LV_LOG_ERROR("unkown property for keyboard");
} }
return ret; return ret;
@ -67,7 +67,7 @@ static void luavgl_keyboard_init(lua_State *L)
static const luaL_Reg btm_methods[] = { static const luaL_Reg btm_methods[] = {
{NULL, NULL}, {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); lua_pop(L, 1);
luavgl_obj_newmetatable(L, &lv_keyboard_class, "lv_keyboard", luavgl_obj_newmetatable(L, &lv_keyboard_class, "lv_keyboard",

@ -47,7 +47,7 @@ LUALIB_API int luavgl_label_set_property_kv(lua_State *L, void *data)
/* a base obj property? */ /* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj); ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) { if (ret != 0) {
debug("unkown property for label.\n"); LV_LOG_ERROR("unkown property for label");
} }
return ret; return ret;

@ -25,7 +25,7 @@ LUALIB_API int luavgl_led_set_property_kv(lua_State *L, void *data)
/* a base obj property? */ /* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj); ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) { if (ret != 0) {
debug("unkown property for led.\n"); LV_LOG_ERROR("unkown property for led");
} }
return ret; return ret;

@ -24,7 +24,7 @@ LUALIB_API int luavgl_list_set_property_kv(lua_State *L, void *data)
/* a base obj property? */ /* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj); ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) { if (ret != 0) {
debug("unkown property for list.\n"); LV_LOG_ERROR("unkown property for list");
} }
return ret; return ret;

@ -69,7 +69,7 @@ LUALIB_API int luavgl_roller_set_property_kv(lua_State *L, void *data)
/* a base obj property? */ /* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj); ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) { if (ret != 0) {
debug("unkown property for roller.\n"); LV_LOG_ERROR("unkown property for roller");
} }
return ret; return ret;

@ -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) static void _lv_textarea_set_password_bullet(void *obj, lua_State *L)
{ {
#if LV_VERSION_CHECK(8, 3, 0)
if (!lua_isstring(L, -1)) { if (!lua_isstring(L, -1)) {
luaL_argerror(L, -1, "expect string"); luaL_argerror(L, -1, "expect string");
return; return;
} }
lv_textarea_set_password_bullet(obj, lua_tostring(L, -1)); lv_textarea_set_password_bullet(obj, lua_tostring(L, -1));
#endif
} }
static void _lv_textarea_set_accepted_chars(void *obj, lua_State *L) 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? */ /* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj); ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) { 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; return -1;

@ -21,7 +21,7 @@
#include "dropdown.c" #include "dropdown.c"
#endif #endif
#if LV_USE_IMG #if LV_USE_IMAGE
#include "img.c" #include "img.c"
#endif #endif
@ -82,7 +82,7 @@ static const luaL_Reg widget_create_methods[] = {
{"Dropdown", luavgl_dropdown_create}, {"Dropdown", luavgl_dropdown_create},
#endif #endif
#if LV_USE_IMG #if LV_USE_IMAGE
{"Image", luavgl_img_create }, {"Image", luavgl_img_create },
#endif #endif
@ -122,7 +122,7 @@ static const luaL_Reg widget_create_methods[] = {
static void luavgl_widgets_init(lua_State *L) static void luavgl_widgets_init(lua_State *L)
{ {
#if LV_USE_IMG #if LV_USE_IMAGE
luavgl_img_init(L); luavgl_img_init(L);
#endif #endif

Loading…
Cancel
Save