Kaynağa Gözat

add: 支持lvgl的signal_cb

Wendal Chen 4 yıl önce
ebeveyn
işleme
fe67abe3cd

+ 7 - 3
components/lvgl/binding/luat_lib_lvgl.c

@@ -107,14 +107,18 @@ LUAMOD_API int luaopen_lvgl( lua_State *L ) {
 
 static int lv_func_unref(lua_State *L, void* ptr) {
     rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
-    luaL_unref(L, LUA_REGISTRYINDEX, msg->arg1);
+    if (msg->arg1)
+        luaL_unref(L, LUA_REGISTRYINDEX, msg->arg1);
+    if (msg->arg2)
+        luaL_unref(L, LUA_REGISTRYINDEX, msg->arg2);
     return 0;
 }
 
 void luat_lv_user_data_free(lv_obj_t * obj) {
-    if (obj == NULL || obj->user_data == 0) return;
+    if (obj == NULL || (obj->user_data.event_cb_ref == 0 && obj->user_data.signal_cb_ref)) return;
     rtos_msg_t msg = {0};
     msg.handler = lv_func_unref;
-    msg.arg1 = obj->user_data;
+    msg.arg1 = obj->user_data.event_cb_ref;
+    msg.arg2 = obj->user_data.signal_cb_ref;
     luat_msgbus_put(&msg, 0);
 }

+ 51 - 8
components/lvgl/binding/luat_lib_lvgl_cb.c

@@ -7,7 +7,7 @@
 #define LUAT_LOG_TAG "lvgl.cb"
 #include "luat_log.h"
 
-static int l_obj_event_cb(lua_State *L, void*ptr) {
+static int l_obj_es_cb(lua_State *L, void*ptr) {
     rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
     lua_geti(L, LUA_REGISTRYINDEX, msg->arg1);
     if (lua_isfunction(L, -1)) {
@@ -19,12 +19,23 @@ static int l_obj_event_cb(lua_State *L, void*ptr) {
 }
 
 static void luat_lv_obj_event_cb(struct _lv_obj_t * obj, lv_event_t event) {
-    if (obj->user_data == 0)
+    if (obj->user_data.event_cb_ref == 0)
         return;
     rtos_msg_t msg = {0};
-    msg.handler = l_obj_event_cb;
+    msg.handler = l_obj_es_cb;
     msg.ptr = obj;
-    msg.arg1 = obj->user_data;
+    msg.arg1 = obj->user_data.event_cb_ref;
+    msg.arg2 = event;
+    luat_msgbus_put(&msg, 0);
+}
+
+static void luat_lv_obj_signal_cb(struct _lv_obj_t * obj, lv_event_t event) {
+    if (obj->user_data.signal_cb_ref == 0)
+        return;
+    rtos_msg_t msg = {0};
+    msg.handler = l_obj_es_cb;
+    msg.ptr = obj;
+    msg.arg1 = obj->user_data.signal_cb_ref;
     msg.arg2 = event;
     luat_msgbus_put(&msg, 0);
 }
@@ -32,6 +43,9 @@ static void luat_lv_obj_event_cb(struct _lv_obj_t * obj, lv_event_t event) {
 /*
 设置组件的事件回调
 @api lvgl.obj_set_event_cb(obj, func)
+@userdata lvgl组件指针
+@func lua函数, 参数有2个 (obj, event), 其中obj是当前对象, event是事件类型, 为整型
+@return nil 无返回值
 */
 int luat_lv_obj_set_event_cb(lua_State *L) {
     lv_obj_t* obj = lua_touserdata(L, 1);
@@ -39,17 +53,46 @@ int luat_lv_obj_set_event_cb(lua_State *L) {
         LLOGW("obj is NULL when set event cb");
         return 0;
     }
-    if (obj->user_data != 0) {
-        luaL_unref(L, LUA_REGISTRYINDEX, obj->user_data);
+    if (obj->user_data.event_cb_ref != 0) {
+        luaL_unref(L, LUA_REGISTRYINDEX, obj->user_data.event_cb_ref);
     }
     if (lua_isfunction(L, 2)) {
         lua_settop(L, 2);
-        obj->user_data = luaL_ref(L, LUA_REGISTRYINDEX);
+        obj->user_data.event_cb_ref = luaL_ref(L, LUA_REGISTRYINDEX);
         lv_obj_set_event_cb(obj, luat_lv_obj_event_cb);
     }
     else {
-        obj->user_data = 0;
+        obj->user_data.event_cb_ref = 0;
         lv_obj_set_event_cb(obj, NULL);
     }
     return 0;
 }
+
+
+/*
+设置组件的信号回调
+@api lvgl.obj_set_signal_cb(obj, func)
+@userdata lvgl组件指针
+@func lua函数, 参数有2个 (obj, signal), 其中obj是当前对象, signal是信号类型, 为整型
+@return nil 无返回值
+*/
+int luat_lv_obj_set_signal_cb(lua_State *L) {
+    lv_obj_t* obj = lua_touserdata(L, 1);
+    if (obj == NULL) {
+        LLOGW("obj is NULL when set event cb");
+        return 0;
+    }
+    if (obj->user_data.signal_cb_ref != 0) {
+        luaL_unref(L, LUA_REGISTRYINDEX, obj->user_data.signal_cb_ref);
+    }
+    if (lua_isfunction(L, 2)) {
+        lua_settop(L, 2);
+        obj->user_data.signal_cb_ref = luaL_ref(L, LUA_REGISTRYINDEX);
+        lv_obj_set_signal_cb(obj, luat_lv_obj_signal_cb);
+    }
+    else {
+        obj->user_data.signal_cb_ref = 0;
+        lv_obj_set_signal_cb(obj, NULL);
+    }
+    return 0;
+}

+ 1 - 1
components/lvgl/binding/luat_lvgl_userdata.h

@@ -5,4 +5,4 @@
 #include "lvgl.h"
 void luat_lv_user_data_free(lv_obj_t * obj);
 
-#endif
+#endif

+ 6 - 1
components/lvgl/lv_conf.h

@@ -548,7 +548,12 @@ typedef void * lv_font_user_data_t;
 
 #if LV_USE_USER_DATA
 /*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/
-typedef int32_t lv_obj_user_data_t;
+typedef struct luat_lv_userdata {
+    int event_cb_ref;
+    int signal_cb_ref;
+}luat_lv_userdata_t;
+
+typedef struct luat_lv_userdata lv_obj_user_data_t;
 /*Provide a function to free user data*/
 #define LV_USE_USER_DATA_FREE 1
 #if LV_USE_USER_DATA_FREE