# HG changeset patch # User Olaf Wintermann # Date 1781431834 -7200 # Node ID abb4d3851061f5620e6f6a53b52c79e9d28bd7ae # Parent 13b18989113cf708129ec64aa3dd80b46d63a568 add callback for context attachment status changes 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); +} diff -r 13b18989113c -r abb4d3851061 ui/common/context.h --- a/ui/common/context.h Sun Jun 14 11:17:45 2026 +0200 +++ b/ui/common/context.h Sun Jun 14 12:10:34 2026 +0200 @@ -104,6 +104,9 @@ ui_callback ondetach; void *ondetachdata; + ui_callback onattachmentstatuschange; + void *onattachmentstatuschangedata; + ui_callback onclose; void *onclosedata; @@ -149,6 +152,8 @@ void uic_context_detach_context(UiContext *ctx, UiContext *doc_ctx); // TODO void uic_context_detach_all(UiContext *ctx); +void uic_send_status_change(UiContext *ctx); + UiVar* uic_get_var(UiContext *ctx, const char *name); UiVar* uic_get_var_t(UiContext *ctx, const char *name, UiVarType type); UiVar* uic_create_var(UiContext *ctx, const char *name, UiVarType type); @@ -175,8 +180,13 @@ UIEXPORT void ui_context_onattach(UiContext *ctx, ui_callback cb, void *data); UIEXPORT void ui_context_ondetach(UiContext *ctx, ui_callback cb, void *data); +UIEXPORT void ui_context_onattachmentstatuschange(UiContext *ctx, ui_callback cb, void *data); UIEXPORT void ui_context_onattach_action(UiContext *ctx, const char *action); UIEXPORT void ui_context_ondetach_action(UiContext *ctx, const char *action); +UIEXPORT void ui_context_onattachmentstatuschange_action(UiContext *ctx, const char *action); + +UIEXPORT int ui_context_is_attached(UiContext *ctx); +UIEXPORT int ui_context_is_attached_to_obj(UiContext *ctx); #ifdef __cplusplus } diff -r 13b18989113c -r abb4d3851061 ui/common/document.c --- a/ui/common/document.c Sun Jun 14 11:17:45 2026 +0200 +++ b/ui/common/document.c Sun Jun 14 12:10:34 2026 +0200 @@ -97,6 +97,11 @@ ui_context_ondetach(ctx, cb, data); } +void ui_document_onattachmentstatuschange(void *doc, ui_callback cb, void *data) { + UiContext *ctx = ui_document_context(doc); + ui_context_onattachmentstatuschange(ctx, cb, data); +} + void ui_document_onattach_action(void *doc, const char *action) { UiContext *ctx = ui_document_context(doc); ui_context_onattach_action(ctx, action); @@ -107,3 +112,18 @@ ui_context_ondetach_action(ctx, action); } +void ui_document_onattachmentstatuschange_action(void *doc, const char *action) { + UiContext *ctx = ui_document_context(doc); + ui_context_onattachmentstatuschange_action(ctx, action); +} + + +int ui_document_is_attached(void *doc) { + UiContext *ctx = ui_document_context(doc); + return ui_context_is_attached(ctx); +} + +int ui_document_is_attached_to_obj(void *doc) { + UiContext *ctx = ui_document_context(doc); + return ui_context_is_attached_to_obj(ctx); +} diff -r 13b18989113c -r abb4d3851061 ui/ui/toolkit.h --- a/ui/ui/toolkit.h Sun Jun 14 11:17:45 2026 +0200 +++ b/ui/ui/toolkit.h Sun Jun 14 12:10:34 2026 +0200 @@ -580,8 +580,13 @@ UIEXPORT void ui_document_destroy(void *doc); UIEXPORT void ui_document_onattach(void *doc, ui_callback cb, void *data); UIEXPORT void ui_document_ondetach(void *doc, ui_callback cb, void *data); +UIEXPORT void ui_document_onattachmentstatuschange(void *doc, ui_callback cb, void *data); UIEXPORT void ui_document_onattach_action(void *doc, const char *action); UIEXPORT void ui_document_ondetach_action(void *doc, const char *action); +UIEXPORT void ui_document_onattachmentstatuschange_action(void *doc, const char *action); + +UIEXPORT int ui_document_is_attached(void *doc); +UIEXPORT int ui_document_is_attached_to_obj(void *doc); UIEXPORT UiContext* ui_document_context(void *doc); UIEXPORT void* ui_context_document(UiContext *ctx);