lyon 3 年 前
コミット
fe6d343b61

+ 10 - 2
package/pika_lvgl/pika_lvgl.c

@@ -1,4 +1,4 @@
-#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
+#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
 #include "lvgl.h"
 #else
 #include "../../lvgl.h"
@@ -201,11 +201,19 @@ PikaObj* pika_lvgl_scr_act(PikaObj* self) {
     return new_obj;
 }
 
+volatile g_lvgl_inited = 0;
 void pika_lvgl___init__(PikaObj* self) {
     obj_newDirectObj(self, "lv_event_listener", New_TinyObj);
     pika_lv_event_listener_g = obj_getObj(self, "lv_event_listener");
     pika_lv_id_register_g = New_args(NULL);
-    lv_png_init();
+    if (!g_lvgl_inited) {
+        lv_png_init();
+        g_lvgl_inited = 1;
+    }
+}
+
+void pika_lvgl___del__(PikaObj* self) {
+    args_deinit(pika_lv_id_register_g);
 }
 
 void pika_lvgl_obj___init__(PikaObj* self, PikaTuple* parent) {

+ 2 - 0
package/pika_lvgl/pika_lvgl.pyi

@@ -4,6 +4,7 @@ from PikaObj import *
 
 def __init__(): ...
 
+def __del__(): ...
 
 class EVENT:
     ALL: int
@@ -390,6 +391,7 @@ class lv_obj:
     def set_id(self, id: str): ...
     def get_id(self) -> str: ...
     def clean(self): ...
+    def del_(self): ...
 
 
 class indev_t:

+ 16 - 6
package/pika_lvgl/pika_lvgl_lv_obj.c

@@ -1,4 +1,4 @@
-#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
+#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
 #include "lvgl.h"
 #else
 #include "../../lvgl.h"
@@ -56,7 +56,7 @@ void pika_lvgl_lv_obj_add_state(PikaObj* self, int state) {
     lv_obj_add_state(lv_obj, state);
 }
 
-PikaObj* eventLisener_getHandler(PikaObj* self, uintptr_t event_id) {
+PikaObj* eventListener_getHandler(PikaObj* self, uintptr_t event_id) {
     Args buffs = {0};
     char* event_name =
         strsFormat(&buffs, PIKA_SPRINTF_BUFF_SIZE, "%d", event_id);
@@ -69,13 +69,13 @@ PikaObj* eventLisener_getHandler(PikaObj* self, uintptr_t event_id) {
 static void __pika_event_cb(lv_event_t* e) {
     lv_obj_t* target = lv_event_get_target(e);
     PikaObj* event_handler =
-        eventLisener_getHandler(pika_lv_event_listener_g, (uintptr_t)target);
+        eventListener_getHandler(pika_lv_event_listener_g, (uintptr_t)target);
     PikaObj* evt = obj_getObj(event_handler, "_event_evt");
     obj_setPtr(evt, "lv_event", e);
     obj_run(event_handler, "_event_cb(_event_evt)");
 }
 
-void eventLicener_registEvent(PikaObj* self,
+void eventListener_registEvent(PikaObj* self,
                               uintptr_t event_id,
                               PikaObj* event_handler) {
     Args buffs = {0};
@@ -83,7 +83,7 @@ void eventLicener_registEvent(PikaObj* self,
         strsFormat(&buffs, PIKA_SPRINTF_BUFF_SIZE, "%d", event_id);
     obj_newDirectObj(self, event_name, New_TinyObj);
     PikaObj* event_item = obj_getObj(self, event_name);
-    obj_setRef(event_item, "handler", event_handler);
+    obj_setPtr(event_item, "handler", event_handler);
     strsDeinit(&buffs);
 }
 
@@ -96,7 +96,7 @@ void pika_lvgl_lv_obj_add_event_cb(PikaObj* self,
     obj_setArg(self, "_event_cb", event_cb);
     obj_setPtr(self, "_event_user_data", user_data);
     obj_newDirectObj(self, "_event_evt", New_pika_lvgl_lv_event);
-    eventLicener_registEvent(pika_lv_event_listener_g, (uintptr_t)lv_obj, self);
+    eventListener_registEvent(pika_lv_event_listener_g, (uintptr_t)lv_obj, self);
 }
 
 void pika_lvgl_lv_obj_add_style(PikaObj* self, PikaObj* style, int selector) {
@@ -333,4 +333,14 @@ void pika_lvgl_lv_obj_clean(PikaObj *self){
     lv_obj_clean(lv_obj);
 }
 
+void pika_lvgl_lv_obj_del_(PikaObj* self) {
+    lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj");
+    Args buffs = {0};
+    char* event_name =
+        strsFormat(&buffs, PIKA_SPRINTF_BUFF_SIZE, "%d", (uintptr_t)lv_obj);
+    obj_removeArg(pika_lv_event_listener_g, event_name);
+    strsDeinit(&buffs);
+    lv_obj_del(lv_obj);
+}
+
 #endif