diff -r 13b18989113c -r abb4d3851061 ui/common/context.c --- a/ui/common/context.c Sun Jun 14 11:17:45 2026 +0200 +++ b/ui/common/context.c Sun Jun 14 12:10:34 2026 +0200 @@ -196,6 +196,7 @@ event.document = document; doc_ctx->onattach(&event, doc_ctx->onattachdata); } + uic_send_status_change(doc_ctx); } static void uic_context_unbind_vars(UiContext *ctx) { @@ -242,7 +243,6 @@ UiContext *doc_ctx = ui_document_context(document); uic_context_unbind_vars(doc_ctx); // unbind all doc/subdoc vars from the parent doc_ctx->parent = NULL; - ui_document_unref(document); ui_update_action_bindings(ctx); if(doc_ctx->ondetach) { @@ -251,6 +251,9 @@ event.document = document; doc_ctx->ondetach(&event, doc_ctx->ondetachdata); } + + uic_send_status_change(doc_ctx); + ui_document_unref(document); } void uic_context_detach_all(UiContext *ctx) { @@ -265,12 +268,40 @@ i = cxListIterator(ls); cx_foreach(void *, doc, i) { uic_context_detach_document(ctx, doc); + uic_send_status_change(ui_document_context(doc)); } cxListFree(ls); ui_update_action_bindings(ctx); } +static void send_status_change(UiContext *ctx, UiEvent *event) { + CxIterator i = cxListIterator(ctx->documents); + cx_foreach(void *, doc, i) { + UiContext *doc_ctx = ui_document_context(doc); + if(doc_ctx->onattachmentstatuschange) { + event->obj = doc_ctx->obj; + event->window = event->obj ? event->obj->window : NULL; + event->document = doc_ctx->self_doc ? doc_ctx->self_doc : doc_ctx->document; + doc_ctx->onattachmentstatuschange(event, doc_ctx->onattachmentstatuschangedata); + } + } + + if(ctx->onattachmentstatuschange) { + event->obj = ctx->obj; + event->window = event->obj ? event->obj->window : NULL; + event->document = ctx->self_doc ? ctx->self_doc : ctx->document; + ctx->onattachmentstatuschange(event, ctx->onattachmentstatuschangedata); + } +} + +void uic_send_status_change(UiContext *ctx) { + UiEvent event; + memset(&event, 0, sizeof(UiEvent)); + send_status_change(ctx, &event); +} + + static UiVar* ctx_getvar(UiContext *ctx, CxHashKey key) { UiVar *var = cxMapGet(ctx->vars, key); if(!var && ctx->documents) { @@ -956,6 +987,11 @@ ctx->ondetachdata = data; } +void ui_context_onattachmentstatuschange(UiContext *ctx, ui_callback cb, void *data) { + ctx->onattachmentstatuschange = cb; + ctx->onattachmentstatuschangedata = data; +} + static void attachment_action_callback(UiEvent *event, void *action) { if(event->document) { UiContext *ctx = ui_document_context(event->document); @@ -972,3 +1008,23 @@ ctx->ondetach = attachment_action_callback; ctx->ondetachdata = ui_strdup(ctx, action); } + +void ui_context_onattachmentstatuschange_action(UiContext *ctx, const char *action) { + ctx->onattachmentstatuschange = attachment_action_callback; + ctx->onattachmentstatuschangedata = ui_strdup(ctx, action); +} + + +int ui_context_is_attached(UiContext *ctx) { + return ctx->parent != NULL; +} + +int ui_context_is_attached_to_obj(UiContext *ctx) { + if(ctx->obj) { + return TRUE; + } + if(ctx->parent == NULL) { + return FALSE; + } + return ui_context_is_attached_to_obj(ctx->parent); +}