add functions for registering global object creation/destruction callbacks

Mon, 16 Jun 2025 21:21:00 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 16 Jun 2025 21:21:00 +0200
changeset 626
724c7036a03e
parent 625
1726c5109ccd
child 627
3f0c9fe60c68

add functions for registering global object creation/destruction callbacks

ui/common/object.c file | annotate | diff | comparison | revisions
ui/common/object.h file | annotate | diff | comparison | revisions
--- 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;
 }
 
--- a/ui/common/object.h	Mon Jun 16 21:04:10 2025 +0200
+++ b/ui/common/object.h	Mon Jun 16 21:21:00 2025 +0200
@@ -35,6 +35,14 @@
 extern "C" {
 #endif
 
+typedef void (*ui_object_callback)(UiObject *obj, void *userdata);
+
+void ui_register_object_creation_callback(ui_object_callback func, void *userdata);
+void ui_register_object_destruction_callback(ui_object_callback func, void *userdata);
+
+void uic_object_created(UiObject *obj);
+void uic_object_destroyed(UiObject *obj);
+    
 void uic_object_destroy(UiObject *obj);
     
 UiObject* uic_object_new(UiObject *toplevel, UIWIDGET widget);

mercurial