ui/common/object.c

changeset 626
724c7036a03e
parent 440
7c4b9cba09ca
child 627
3f0c9fe60c68
--- a/ui/common/object.c	Mon Jun 16 21:04:10 2025 +0200
+++ b/ui/common/object.c	Mon Jun 16 21:21:00 2025 +0200
@@ -32,8 +32,48 @@
 #include "object.h"
 #include "context.h"
 
+#include <cx/linked_list.h>
+
 #include "../ui/container.h"
 
+static CxList *creation_callbacks;
+static CxList *destruction_callbacks;
+
+typedef struct objcallback {
+    ui_object_callback func;
+    void *userdata;
+} objcallback;
+
+void ui_register_object_creation_callback(ui_object_callback func, void *userdata) {
+    if(!creation_callbacks) {
+        creation_callbacks = cxLinkedListCreateSimple(sizeof(objcallback));
+    }
+    objcallback cb = { func, userdata };
+    cxListAdd(creation_callbacks, &cb);
+}
+
+void ui_register_object_destruction_callback(ui_object_callback func, void *userdata) {
+    if(!destruction_callbacks) {
+        destruction_callbacks = cxLinkedListCreateSimple(sizeof(objcallback));
+    }
+    objcallback cb = { func, userdata };
+    cxListAdd(destruction_callbacks, &cb);
+}
+
+void uic_object_created(UiObject *obj) {
+    CxIterator i = cxListIterator(creation_callbacks);
+    cx_foreach(objcallback *, cb, i) {
+        cb->func(obj, cb->userdata);
+    }
+}
+
+void uic_object_destroyed(UiObject *obj) {
+    CxIterator i = cxListIterator(destruction_callbacks);
+    cx_foreach(objcallback *, cb, i) {
+        cb->func(obj, cb->userdata);
+    }
+}
+
 void ui_end(UiObject *obj) {
     if(!obj->next) {
         return;
@@ -87,6 +127,7 @@
         ev.intval = 0;
         obj->ctx->close_callback(&ev, obj->ctx->close_data);
     }
+    uic_object_destroyed(obj);
     cxMempoolFree(obj->ctx->mp);
 }
 
@@ -98,7 +139,7 @@
     UiObject *newobj = cxCalloc(ctx->allocator, 1, sizeof(UiObject));
     newobj->ctx = ctx;
     newobj->widget = widget;
-    
+    uic_object_created(newobj);
     return newobj;
 }
 

mercurial