# HG changeset patch # User Olaf Wintermann # Date 1750101660 -7200 # Node ID 724c7036a03e29c3f56047d60a311a7c5ba503c9 # Parent 1726c5109ccd4e0368d9074acb2ee5b96ea36f34 add functions for registering global object creation/destruction callbacks diff -r 1726c5109ccd -r 724c7036a03e ui/common/object.c --- 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 + #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; } diff -r 1726c5109ccd -r 724c7036a03e ui/common/object.h --- 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);