--- 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; }