Wed, 15 Apr 2026 11:19:25 +0200
add document/context reference counter
| ui/common/context.c | file | annotate | diff | comparison | revisions | |
| ui/common/context.h | file | annotate | diff | comparison | revisions | |
| ui/common/document.c | file | annotate | diff | comparison | revisions | |
| ui/ui/toolkit.h | file | annotate | diff | comparison | revisions |
--- a/ui/common/context.c Tue Apr 14 18:08:20 2026 +0200 +++ b/ui/common/context.c Wed Apr 15 11:19:25 2026 +0200 @@ -81,6 +81,8 @@ } #endif + ctx->ref = 1; + return ctx; } @@ -100,6 +102,25 @@ cxListClear(ctx->state_widgets); } +void uic_context_destroy(UiContext *ctx, void *document) { + if(!ctx) { + return; + } + + UiEvent ev; + ev.window = NULL; + ev.document = document; + ev.obj = NULL; + ev.eventdata = NULL; + ev.eventdatatype = 0; + ev.intval = 0; + + if(ctx->close_callback) { + ctx->close_callback(&ev, ctx->close_data); + } + cxMempoolFree(ctx->mp); +} + void uic_context_attach_document(UiContext *ctx, void *document) { if(ctx->single_document_mode) { if(ctx->document) {
--- a/ui/common/context.h Tue Apr 14 18:08:20 2026 +0200 +++ b/ui/common/context.h Wed Apr 15 11:19:25 2026 +0200 @@ -100,6 +100,8 @@ ui_callback close_callback; void *close_data; + + unsigned int ref; }; struct UiVar { @@ -131,6 +133,7 @@ void uic_context_add_destructor(UiContext *ctx, cx_destructor_func func, void *data); void uic_context_prepare_close(UiContext *ctx); +void uic_context_destroy(UiContext *ctx, void *document); void uic_context_attach_document(UiContext *ctx, void *document); void uic_context_detach_document(UiContext *ctx, void *document);
--- a/ui/common/document.c Tue Apr 14 18:08:20 2026 +0200 +++ b/ui/common/document.c Wed Apr 15 11:19:25 2026 +0200 @@ -49,20 +49,22 @@ } void ui_document_destroy(void *doc) { + uic_context_destroy(ui_document_context(doc), doc); +} + +void ui_document_ref(void *doc) { UiContext *ctx = ui_document_context(doc); if(ctx) { - UiEvent ev; - ev.window = NULL; - ev.document = doc; - ev.obj = NULL; - ev.eventdata = NULL; - ev.eventdatatype = 0; - ev.intval = 0; + ctx->ref++; + } +} - if(ctx->close_callback) { - ctx->close_callback(&ev, ctx->close_data); +void ui_document_unref(void *doc) { + UiContext *ctx = ui_document_context(doc); + if(ctx) { + if(--ctx->ref == 0) { + uic_context_destroy(ctx, doc); } - cxMempoolFree(ctx->mp); } }
--- a/ui/ui/toolkit.h Tue Apr 14 18:08:20 2026 +0200 +++ b/ui/ui/toolkit.h Wed Apr 15 11:19:25 2026 +0200 @@ -572,6 +572,8 @@ UIEXPORT void ui_threadpool_job(UiThreadpool* pool, UiObject* obj, ui_threadfunc tf, void* td, ui_callback f, void* fd); UIEXPORT void* ui_document_new(size_t size); +UIEXPORT void ui_document_ref(void *doc); +UIEXPORT void ui_document_unref(void *doc); UIEXPORT void ui_document_destroy(void *doc); UIEXPORT void* ui_get_subdocument(void *document); // deprecated