summaryrefslogtreecommitdiff
path: root/lib/luavgl/src/obj.c
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-06-12 16:29:31 +1000
committerjacqueline <me@jacqueline.id.au>2024-06-12 16:29:31 +1000
commitbd01bf3845fd67dc4e03f56d044b3bc53245eeed (patch)
tree782f38292005dd84da267f4f06c7c66f994ca0ad /lib/luavgl/src/obj.c
parentb02d13f5a584c9b0a747b0cefdf92dc867181a50 (diff)
downloadtangara-fw-bd01bf3845fd67dc4e03f56d044b3bc53245eeed.tar.gz
WIP bump luavgl to latest
Diffstat (limited to 'lib/luavgl/src/obj.c')
-rw-r--r--lib/luavgl/src/obj.c446
1 files changed, 271 insertions, 175 deletions
diff --git a/lib/luavgl/src/obj.c b/lib/luavgl/src/obj.c
index fb89e3f9..496b7855 100644
--- a/lib/luavgl/src/obj.c
+++ b/lib/luavgl/src/obj.c
@@ -1,5 +1,3 @@
-#include "core/lv_group.h"
-#include "core/lv_obj.h"
#include "luavgl.h"
#include "private.h"
@@ -10,16 +8,18 @@
static int luavgl_anim_create(lua_State *L);
static int luavgl_obj_delete(lua_State *L);
+static int luavgl_obj_clean(lua_State *L);
-static void _lv_obj_set_align(void *obj, lua_State *L) {
+static void _lv_obj_set_align(void *obj, lua_State *L)
+{
if (lua_isinteger(L, -1)) {
lv_obj_align(obj, lua_tointeger(L, -1), 0, 0);
return;
}
if (!lua_istable(L, -1)) {
- luaL_argerror(L, -1, "should be table.");
- debug("para should be table.");
+ luaL_argerror(L, -1, "should be table");
+ LV_LOG_ERROR("para should be table");
return;
}
@@ -43,11 +43,13 @@ static void _lv_obj_set_align(void *obj, lua_State *L) {
*
* Internally used.
*/
-static inline void luavgl_setup_obj(lua_State *L, lv_obj_t *obj) {
+static inline void luavgl_setup_obj(lua_State *L, lv_obj_t *obj)
+{
luavgl_iterate(L, -1, luavgl_obj_set_property_kv, obj);
}
-static void obj_delete_cb(lv_event_t *e) {
+static void obj_delete_cb(lv_event_t *e)
+{
lua_State *L = e->user_data;
lua_pushlightuserdata(L, e->current_target);
lua_rawget(L, LUA_REGISTRYINDEX);
@@ -67,7 +69,33 @@ static void obj_delete_cb(lv_event_t *e) {
goto pop_exit;
}
- luavgl_obj_delete(L);
+ /* Clean its children firstly */
+ luavgl_obj_clean(L);
+
+ /* Remove events added from lua, but keep them unremoved */
+ int size = lv_array_size(&lobj->events);
+ struct event_callback_s *event;
+ struct event_callback_s **events = lv_array_front(&lobj->events);
+ for (int i = 0; i < size; i++) {
+ event = events[i];
+ if (event == NULL || event->dsc == NULL) {
+ continue;
+ }
+
+ luaL_unref(L, LUA_REGISTRYINDEX, event->ref);
+ lv_free(event);
+ }
+
+ lv_array_deinit(&lobj->events);
+
+ /* remove userdata from registry. */
+ lua_checkstack(L, 2);
+ lua_pushlightuserdata(L, lobj->obj);
+ lua_pushnil(L);
+ lua_rawset(L, LUA_REGISTRYINDEX);
+
+ LV_LOG_INFO("delete obj: %p", lobj->obj);
+ lobj->obj = NULL;
return;
pop_exit:
@@ -80,7 +108,8 @@ pop_exit:
* one. result stack: table(from uservalue)
* return uservalue type: LUA_TTABLE
*/
-LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx) {
+LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx)
+{
int type = lua_getuservalue(L, idx);
if (type == LUA_TTABLE)
return type;
@@ -99,11 +128,13 @@ LUALIB_API int luavgl_obj_getuserdatauv(lua_State *L, int idx) {
return LUA_TTABLE;
}
-static int luavgl_obj_create(lua_State *L) {
+static int luavgl_obj_create(lua_State *L)
+{
return luavgl_obj_create_helper(L, lv_obj_create);
}
-static int luavgl_obj_delete(lua_State *L) {
+static int luavgl_obj_delete(lua_State *L)
+{
luavgl_obj_t *lobj;
/**
@@ -146,14 +177,15 @@ static int luavgl_obj_delete(lua_State *L) {
lua_pushnil(L);
lua_rawset(L, LUA_REGISTRYINDEX);
- debug("delete obj: %p\n", lobj->obj);
+ LV_LOG_INFO("delete obj: %p", lobj->obj);
lobj->obj = NULL;
lua_pop(L, 1); /* remove the userdata para */
return 0;
}
-static int luavgl_obj_clean(lua_State *L) {
+static int luavgl_obj_clean(lua_State *L)
+{
luavgl_obj_t *lobj = luavgl_to_lobj(L, -1);
if (lobj == NULL || lobj->obj == NULL)
return 0;
@@ -170,31 +202,36 @@ static int luavgl_obj_clean(lua_State *L) {
luavgl_obj_delete(L);
}
- lua_pop(L, 1); /* remove the userdata para */
- return 0;
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_set(lua_State *L) {
+static int luavgl_obj_set(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_istable(L, -1)) {
- luaL_error(L, "expect a table on 2nd para.");
- return 0;
+ luaL_error(L, "expect a table on 2nd para");
+ lua_settop(L, 1);
+ return 1;
}
luavgl_setup_obj(L, obj);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
/**
* obj:align_to({base=base, type=type, x_ofs=0, y_ofs=0})
*/
-static int luavgl_obj_align_to(lua_State *L) {
+static int luavgl_obj_align_to(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_istable(L, 2)) {
- debug("para should be table.");
- return luaL_argerror(L, 2, "should be table.");
+ LV_LOG_ERROR("para should be table");
+ return luaL_argerror(L, 2, "should be table");
}
lua_getfield(L, 2, "type");
@@ -205,7 +242,7 @@ static int luavgl_obj_align_to(lua_State *L) {
lv_obj_t *base = luavgl_to_lobj(L, -1)->obj;
lua_pop(L, 1);
if (base == NULL) {
- debug("base is not lua obj");
+ LV_LOG_ERROR("base is not lua obj");
return luaL_argerror(L, -1, "base is not lua obj");
}
@@ -218,17 +255,22 @@ static int luavgl_obj_align_to(lua_State *L) {
lua_pop(L, 1);
lv_obj_align_to(obj, base, align, x_ofs, y_ofs);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_set_parent(lua_State *L) {
+static int luavgl_obj_set_parent(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_t *parent = luavgl_to_obj(L, 2);
lv_obj_set_parent(obj, parent);
- return 0;
+ lua_pop(L, 1);
+ return 1;
}
-static int luavgl_obj_get_screen(lua_State *L) {
+static int luavgl_obj_get_screen(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_t *screen = lv_obj_get_screen(obj);
@@ -246,7 +288,8 @@ static int luavgl_obj_get_screen(lua_State *L) {
return 1;
}
-static int luavgl_obj_get_parent(lua_State *L) {
+static int luavgl_obj_get_parent(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_t *parent = lv_obj_get_parent(obj);
@@ -263,7 +306,8 @@ static int luavgl_obj_get_parent(lua_State *L) {
return 1;
}
-static int luavgl_obj_set_get_parent(lua_State *L) {
+static int luavgl_obj_set_get_parent(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_isnoneornil(L, 2)) {
lv_obj_t *parent = luavgl_to_obj(L, 2);
@@ -273,7 +317,8 @@ static int luavgl_obj_set_get_parent(lua_State *L) {
return luavgl_obj_get_parent(L);
}
-static int luavgl_obj_get_child(lua_State *L) {
+static int luavgl_obj_get_child(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
int id = luavgl_tointeger(L, 2);
@@ -293,13 +338,15 @@ static int luavgl_obj_get_child(lua_State *L) {
return 1;
}
-static int luavgl_obj_get_child_cnt(lua_State *L) {
+static int luavgl_obj_get_child_cnt(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushinteger(L, lv_obj_get_child_cnt(obj));
return 1;
}
-static int luavgl_obj_get_state(lua_State *L) {
+static int luavgl_obj_get_state(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_state_t state = lv_obj_get_state(obj);
lua_pushinteger(L, state);
@@ -312,7 +359,8 @@ static int luavgl_obj_get_state(lua_State *L) {
* obj:scroll_to({x=10, anim=true})
* obj:scroll_to({x=10, y=100, anim=false})
*/
-static int luavgl_obj_scroll_to(lua_State *L) {
+static int luavgl_obj_scroll_to(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_istable(L, -1)) {
@@ -338,176 +386,231 @@ static int luavgl_obj_scroll_to(lua_State *L) {
}
lua_pop(L, 1);
- return 0;
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_is_visible(lua_State *L) {
+static int luavgl_obj_is_visible(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushboolean(L, lv_obj_is_visible(obj));
return 1;
}
-static int luavgl_obj_add_flag(lua_State *L) {
+static int luavgl_obj_add_flag(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_flag_t flag = lua_tointeger(L, 2);
lv_obj_add_flag(obj, flag);
- return 0;
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_clear_flag(lua_State *L) {
+static int luavgl_obj_clear_flag(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_flag_t flag = lua_tointeger(L, 2);
lv_obj_clear_flag(obj, flag);
- return 0;
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_add_state(lua_State *L) {
+static int luavgl_obj_add_state(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_state_t state = lua_tointeger(L, 2);
lv_obj_add_state(obj, state);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_clear_state(lua_State *L) {
+static int luavgl_obj_clear_state(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_state_t state = lua_tointeger(L, 2);
lv_obj_clear_state(obj, state);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
/**
* obj:scroll_by(x, y, anim_en)
*/
-static int luavgl_obj_scroll_by(lua_State *L) {
+static int luavgl_obj_scroll_by(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
int x = luavgl_tointeger(L, 2);
int y = luavgl_tointeger(L, 3);
int anim_en = luavgl_tointeger(L, 4);
lv_obj_scroll_by(obj, x, y, anim_en);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_scroll_by_bounded(lua_State *L) {
+static int luavgl_obj_scroll_by_bounded(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
int dx = luavgl_tointeger(L, 2);
int dy = luavgl_tointeger(L, 3);
int anim_en = luavgl_tointeger(L, 4);
lv_obj_scroll_by_bounded(obj, dx, dy, anim_en);
- return 0;
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_scroll_to_view(lua_State *L) {
+static int luavgl_obj_scroll_to_view(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
int anim_en = luavgl_tointeger(L, 2);
lv_obj_scroll_to_view(obj, anim_en);
- return 0;
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_scroll_to_view_recursive(lua_State *L) {
+static int luavgl_obj_scroll_to_view_recursive(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
int anim_en = luavgl_tointeger(L, 2);
lv_obj_scroll_to_view_recursive(obj, anim_en);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_scroll_by_raw(lua_State *L) {
+static int luavgl_obj_scroll_by_raw(lua_State *L)
+{
+#if LV_VERSION_CHECK(8, 3, 0)
lv_obj_t *obj = luavgl_to_obj(L, 1);
int x = luavgl_tointeger(L, 2);
int y = luavgl_tointeger(L, 3);
_lv_obj_scroll_by_raw(obj, x, y);
- return 0;
+#endif
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_is_scrolling(lua_State *L) {
+static int luavgl_obj_is_scrolling(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushboolean(L, lv_obj_is_scrolling(obj));
return 1;
}
-static int luavgl_obj_scrollbar_invalidate(lua_State *L) {
+static int luavgl_obj_scrollbar_invalidate(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_scrollbar_invalidate(obj);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_readjust_scroll(lua_State *L) {
+static int luavgl_obj_readjust_scroll(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
int anim_en = luavgl_tointeger(L, 2);
lv_obj_readjust_scroll(obj, anim_en);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_is_editable(lua_State *L) {
+static int luavgl_obj_is_editable(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushboolean(L, lv_obj_is_editable(obj));
return 1;
}
-static int luavgl_obj_is_group_def(lua_State *L) {
+static int luavgl_obj_is_group_def(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushboolean(L, lv_obj_is_group_def(obj));
return 1;
}
-static int luavgl_obj_is_layout_positioned(lua_State *L) {
+static int luavgl_obj_is_layout_positioned(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_pushboolean(L, lv_obj_is_layout_positioned(obj));
return 1;
}
-static int luavgl_obj_mark_layout_as_dirty(lua_State *L) {
+static int luavgl_obj_mark_layout_as_dirty(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_mark_layout_as_dirty(obj);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_center(lua_State *L) {
+static int luavgl_obj_center(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_center(obj);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_invalidate(lua_State *L) {
+static int luavgl_obj_invalidate(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_invalidate(obj);
- return 0;
+
+ return 1;
}
-static int luavgl_obj_set_flex_flow(lua_State *L) {
+static int luavgl_obj_set_flex_flow(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_flex_flow_t flow = luavgl_tointeger(L, 2);
lv_obj_set_flex_flow(obj, flow);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_set_flex_align(lua_State *L) {
+static int luavgl_obj_set_flex_align(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_flex_align_t m = luavgl_tointeger(L, 2);
lv_flex_align_t c = luavgl_tointeger(L, 3);
lv_flex_align_t t = luavgl_tointeger(L, 4);
lv_obj_set_flex_align(obj, m, c, t);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_set_flex_grow(lua_State *L) {
+static int luavgl_obj_set_flex_grow(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
uint8_t grow = luavgl_tointeger(L, 2);
lv_obj_set_flex_grow(obj, grow);
- return 0;
+
+ lua_settop(L, 1);
+ return 1;
}
-static int luavgl_obj_indev_search(lua_State *L) {
+static int luavgl_obj_indev_search(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_point_t point;
if (lua_istable(L, 2)) {
@@ -537,7 +640,8 @@ static int luavgl_obj_indev_search(lua_State *L) {
return 1;
}
-static int luavgl_obj_get_coords(lua_State *L) {
+static int luavgl_obj_get_coords(lua_State *L)
+{
lv_area_t area;
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_obj_get_coords(obj, &area);
@@ -561,7 +665,8 @@ static int luavgl_obj_get_coords(lua_State *L) {
/**
* get object real position using lv_obj_get_x/x2/y/y2
*/
-static int luavgl_obj_get_pos(lua_State *L) {
+static int luavgl_obj_get_pos(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lua_newtable(L);
@@ -581,38 +686,17 @@ static int luavgl_obj_get_pos(lua_State *L) {
}
/**
- * set this object as the current selection
- */
-static int luavgl_obj_focus(lua_State *L) {
- lv_obj_t *obj = luavgl_to_obj(L, 1);
-
- lv_group_t *group = lv_obj_get_group(obj);
- if (group == NULL) {
- return 0;
- }
- lv_group_focus_obj(obj);
-
- return 0;
-}
-
-static int luavgl_obj_move_to_index(lua_State *L) {
- lv_obj_t *obj = luavgl_to_obj(L, 1);
- int idx = luavgl_tointeger(L, 2);
-
- lv_obj_move_to_index(obj, idx);
- return 0;
-}
-
-/**
* Remove all animations associates to this object
*/
-static int luavgl_obj_remove_anim_all(lua_State *L) {
+static int luavgl_obj_remove_anim_all(lua_State *L)
+{
lv_obj_t *obj = luavgl_to_obj(L, 1);
lv_anim_del(obj, NULL);
return 1;
}
-static int luavgl_obj_gc(lua_State *L) {
+static int luavgl_obj_gc(lua_State *L)
+{
if (lua_type(L, 1) != LUA_TUSERDATA) {
/* If t = setmetatable({}, obj_meta_table), this will happen when t is
* gc;ed. Currently all metatables for classes based on obj, that has no own
@@ -621,7 +705,7 @@ static int luavgl_obj_gc(lua_State *L) {
return 0;
}
- debug("\n");
+ LV_LOG_INFO("enter");
luavgl_obj_t *lobj = lua_touserdata(L, 1);
if (lobj == NULL || lobj->obj == NULL) {
@@ -629,70 +713,69 @@ static int luavgl_obj_gc(lua_State *L) {
return 0;
}
- debug("GC for obj: %p\n", lobj->obj);
+ LV_LOG_INFO("GC for obj: %p", lobj->obj);
luavgl_obj_delete(L);
return 0;
}
static const luaL_Reg luavgl_obj_methods[] = {
- {"set", luavgl_obj_set},
- {"set_style", luavgl_obj_set_style},
- {"align_to", luavgl_obj_align_to},
- {"delete", luavgl_obj_delete},
- {"clean", luavgl_obj_clean},
-
- /* misc. functions */
- {"parent", luavgl_obj_set_get_parent},
- {"set_parent", luavgl_obj_set_parent},
- {"get_parent", luavgl_obj_get_parent},
- {"get_child", luavgl_obj_get_child},
- {"get_child_cnt", luavgl_obj_get_child_cnt},
- {"get_screen", luavgl_obj_get_screen},
- {"get_state", luavgl_obj_get_state},
- {"scroll_to", luavgl_obj_scroll_to},
- {"is_scrolling", luavgl_obj_is_scrolling},
- {"is_visible", luavgl_obj_is_visible},
- {"add_flag", luavgl_obj_add_flag},
- {"clear_flag", luavgl_obj_clear_flag},
- {"add_state", luavgl_obj_add_state},
- {"clear_state", luavgl_obj_clear_state},
- {"add_style", luavgl_obj_add_style},
- {"remove_style", luavgl_obj_remove_style},
- {"remove_style_all", luavgl_obj_remove_style_all},
- {"scroll_by", luavgl_obj_scroll_by},
- {"scroll_by_bounded", luavgl_obj_scroll_by_bounded},
- {"scroll_to_view", luavgl_obj_scroll_to_view},
+ {"set", luavgl_obj_set },
+ {"set_style", luavgl_obj_set_style },
+ {"align_to", luavgl_obj_align_to },
+ {"delete", luavgl_obj_delete },
+ {"clean", luavgl_obj_clean },
+
+ /* misc. functions */
+ {"parent", luavgl_obj_set_get_parent },
+ {"set_parent", luavgl_obj_set_parent },
+ {"get_parent", luavgl_obj_get_parent },
+ {"get_child", luavgl_obj_get_child },
+ {"get_child_cnt", luavgl_obj_get_child_cnt },
+ {"get_screen", luavgl_obj_get_screen },
+ {"get_state", luavgl_obj_get_state },
+ {"scroll_to", luavgl_obj_scroll_to },
+ {"is_scrolling", luavgl_obj_is_scrolling },
+ {"is_visible", luavgl_obj_is_visible },
+ {"add_flag", luavgl_obj_add_flag },
+ {"clear_flag", luavgl_obj_clear_flag },
+ {"add_state", luavgl_obj_add_state },
+ {"clear_state", luavgl_obj_clear_state },
+ {"add_style", luavgl_obj_add_style },
+ {"remove_style", luavgl_obj_remove_style },
+ {"remove_style_all", luavgl_obj_remove_style_all },
+ {"scroll_by", luavgl_obj_scroll_by },
+ {"scroll_by_bounded", luavgl_obj_scroll_by_bounded },
+ {"scroll_to_view", luavgl_obj_scroll_to_view },
{"scroll_to_view_recursive", luavgl_obj_scroll_to_view_recursive},
- {"scroll_by_raw", luavgl_obj_scroll_by_raw},
- {"scrollbar_invalidate", luavgl_obj_scrollbar_invalidate},
- {"readjust_scroll", luavgl_obj_readjust_scroll},
- {"is_editable", luavgl_obj_is_editable},
- {"is_group_def", luavgl_obj_is_group_def},
- {"is_layout_positioned", luavgl_obj_is_layout_positioned},
- {"mark_layout_as_dirty", luavgl_obj_mark_layout_as_dirty},
- {"center", luavgl_obj_center},
- {"invalidate", luavgl_obj_invalidate},
- {"set_flex_flow", luavgl_obj_set_flex_flow},
- {"set_flex_align", luavgl_obj_set_flex_align},
- {"set_flex_grow", luavgl_obj_set_flex_grow},
- {"indev_search", luavgl_obj_indev_search},
- {"get_coords", luavgl_obj_get_coords},
- {"get_pos", luavgl_obj_get_pos},
- {"focus", luavgl_obj_focus},
- {"move_to_index", luavgl_obj_move_to_index},
-
- {"onevent", luavgl_obj_on_event},
- {"onPressed", luavgl_obj_on_pressed},
- {"onClicked", luavgl_obj_on_clicked},
- {"onShortClicked", luavgl_obj_on_short_clicked},
- {"anim", luavgl_anim_create},
- {"Anim", luavgl_anim_create},
- {"remove_all_anim", luavgl_obj_remove_anim_all}, /* remove all */
- {NULL, NULL},
+ {"scroll_by_raw", luavgl_obj_scroll_by_raw },
+ {"scrollbar_invalidate", luavgl_obj_scrollbar_invalidate },
+ {"readjust_scroll", luavgl_obj_readjust_scroll },
+ {"is_editable", luavgl_obj_is_editable },
+ {"is_group_def", luavgl_obj_is_group_def },
+ {"is_layout_positioned", luavgl_obj_is_layout_positioned },
+ {"mark_layout_as_dirty", luavgl_obj_mark_layout_as_dirty },
+ {"center", luavgl_obj_center },
+ {"invalidate", luavgl_obj_invalidate },
+ {"set_flex_flow", luavgl_obj_set_flex_flow },
+ {"set_flex_align", luavgl_obj_set_flex_align },
+ {"set_flex_grow", luavgl_obj_set_flex_grow },
+ {"indev_search", luavgl_obj_indev_search },
+ {"get_coords", luavgl_obj_get_coords },
+ {"get_pos", luavgl_obj_get_pos },
+
+ {"onevent", luavgl_obj_on_event },
+ {"onPressed", luavgl_obj_on_pressed },
+ {"onClicked", luavgl_obj_on_clicked },
+ {"onShortClicked", luavgl_obj_on_short_clicked },
+ {"anim", luavgl_anim_create },
+ {"Anim", luavgl_anim_create },
+ {"remove_all_anim", luavgl_obj_remove_anim_all }, /* remove all */
+ {NULL, NULL },
};
-static void luavgl_obj_init(lua_State *L) {
+static void luavgl_obj_init(lua_State *L)
+{
/* base lv_obj */
luavgl_obj_newmetatable(L, &lv_obj_class, "lv_obj", luavgl_obj_methods);
lua_pushcfunction(L, luavgl_obj_gc);
@@ -718,16 +801,16 @@ static void luavgl_obj_init(lua_State *L) {
}
static const luavgl_value_setter_t obj_property_table[] = {
- {"x", 0, {.setter = (setter_int_t)lv_obj_set_x}},
- {"y", 0, {.setter = (setter_int_t)lv_obj_set_y}},
- {"w", 0, {.setter = (setter_int_t)lv_obj_set_width}},
- {"h", 0, {.setter = (setter_int_t)lv_obj_set_height}},
- {"align", SETTER_TYPE_STACK, {.setter_stack = _lv_obj_set_align}},
-
- {"scrollbar_mode", 0, {.setter = (setter_int_t)lv_obj_set_scrollbar_mode}},
- {"scroll_dir", 0, {.setter = (setter_int_t)lv_obj_set_scroll_dir}},
- {"scroll_snap_x", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_x}},
- {"scroll_snap_y", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_y}},
+ {"x", 0, {.setter = (setter_int_t)lv_obj_set_x} },
+ {"y", 0, {.setter = (setter_int_t)lv_obj_set_y} },
+ {"w", 0, {.setter = (setter_int_t)lv_obj_set_width} },
+ {"h", 0, {.setter = (setter_int_t)lv_obj_set_height} },
+ {"align", SETTER_TYPE_STACK, {.setter_stack = _lv_obj_set_align} },
+
+ {"scrollbar_mode", 0, {.setter = (setter_int_t)lv_obj_set_scrollbar_mode}},
+ {"scroll_dir", 0, {.setter = (setter_int_t)lv_obj_set_scroll_dir} },
+ {"scroll_snap_x", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_x} },
+ {"scroll_snap_y", 0, {.setter = (setter_int_t)lv_obj_set_scroll_snap_y} },
};
/**
@@ -741,8 +824,17 @@ static const luavgl_value_setter_t obj_property_table[] = {
* stack[-2]: key(property name)
* stack[-1]: value(could be any lua data)
*/
-LUALIB_API int luavgl_obj_set_property_kv(lua_State *L, void *data) {
+LUALIB_API int luavgl_obj_set_property_kv(lua_State *L, void *data)
+{
lv_obj_t *obj = data;
+
+ /* Check for integer key with userdata as value */
+ if (lua_type(L, -2) == LUA_TNUMBER && lua_type(L, -1) == LUA_TUSERDATA) {
+ lv_obj_t *child = luavgl_to_obj(L, -1);
+ lv_obj_set_parent(child, obj);
+ return 0;
+ }
+
int ret = luavgl_set_property(L, obj, obj_property_table);
if (ret == 0)
@@ -753,7 +845,8 @@ LUALIB_API int luavgl_obj_set_property_kv(lua_State *L, void *data) {
}
LUALIB_API int luavgl_obj_create_helper(lua_State *L,
- lv_obj_t *(*create)(lv_obj_t *parent)) {
+ lv_obj_t *(*create)(lv_obj_t *parent))
+{
luavgl_ctx_t *ctx = luavgl_context(L);
lv_obj_t *parent;
@@ -765,7 +858,7 @@ LUALIB_API int luavgl_obj_create_helper(lua_State *L,
lua_remove(L, 1);
}
- debug("create obj on: %p\n", parent);
+ LV_LOG_INFO("create obj on: %p", parent);
lv_obj_t *obj = create(parent);
luavgl_add_lobj(L, obj)->lua_created = true;
@@ -790,7 +883,7 @@ LUALIB_API int luavgl_obj_create_helper(lua_State *L,
lua_rawget(L, LUA_REGISTRYINDEX);
}
- debug("create obj: %p\n", obj);
+ LV_LOG_INFO("create obj: %p", obj);
return 1;
}
@@ -799,7 +892,8 @@ LUALIB_API int luavgl_obj_create_helper(lua_State *L,
* If no metatable not found for this obj class, then lv_obj_class metatable is
* used
*/
-LUALIB_API luavgl_obj_t *luavgl_add_lobj(lua_State *L, lv_obj_t *obj) {
+LUALIB_API luavgl_obj_t *luavgl_add_lobj(lua_State *L, lv_obj_t *obj)
+{
luavgl_obj_t *lobj;
/* In rare case, obj may be deleted but not gc'ed in lua, and lvgl quickly
@@ -817,16 +911,18 @@ LUALIB_API luavgl_obj_t *luavgl_add_lobj(lua_State *L, lv_obj_t *obj) {
if (luavgl_obj_getmetatable(L, obj->class_p) == LUA_TNIL) {
lua_pop(L, 1);
- debug("cannot find metatable for class: %p\n", obj->class_p);
+ LV_LOG_ERROR("cannot find metatable for class: %p", obj->class_p);
/* use base obj metatable instead */
luavgl_obj_getmetatable(L, &lv_obj_class);
}
lua_setmetatable(L, -2);
- memset(lobj, 0, sizeof(*lobj));
- luavgl_obj_event_init(lobj);
+ lv_memset(lobj, 0, sizeof(*lobj));
lobj->obj = obj;
+
+ /* Init event array to store events added from lua. */
+ lv_array_init(&lobj->events, 0, sizeof(struct event_callback_s *));
lv_obj_add_event_cb(obj, obj_delete_cb, LV_EVENT_DELETE, L);
/* registry[obj] = lobj */