|
@@ -7,7 +7,7 @@
|
|
|
#define LUAT_LOG_TAG "lvgl.cb"
|
|
#define LUAT_LOG_TAG "lvgl.cb"
|
|
|
#include "luat_log.h"
|
|
#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);
|
|
rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
|
|
|
lua_geti(L, LUA_REGISTRYINDEX, msg->arg1);
|
|
lua_geti(L, LUA_REGISTRYINDEX, msg->arg1);
|
|
|
if (lua_isfunction(L, -1)) {
|
|
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) {
|
|
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;
|
|
return;
|
|
|
rtos_msg_t msg = {0};
|
|
rtos_msg_t msg = {0};
|
|
|
- msg.handler = l_obj_event_cb;
|
|
|
|
|
|
|
+ msg.handler = l_obj_es_cb;
|
|
|
msg.ptr = obj;
|
|
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;
|
|
msg.arg2 = event;
|
|
|
luat_msgbus_put(&msg, 0);
|
|
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)
|
|
@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) {
|
|
int luat_lv_obj_set_event_cb(lua_State *L) {
|
|
|
lv_obj_t* obj = lua_touserdata(L, 1);
|
|
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");
|
|
LLOGW("obj is NULL when set event cb");
|
|
|
return 0;
|
|
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)) {
|
|
if (lua_isfunction(L, 2)) {
|
|
|
lua_settop(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);
|
|
lv_obj_set_event_cb(obj, luat_lv_obj_event_cb);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
- obj->user_data = 0;
|
|
|
|
|
|
|
+ obj->user_data.event_cb_ref = 0;
|
|
|
lv_obj_set_event_cb(obj, NULL);
|
|
lv_obj_set_event_cb(obj, NULL);
|
|
|
}
|
|
}
|
|
|
return 0;
|
|
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;
|
|
|
|
|
+}
|