add callback for context attachment status changes default tip

Sun, 14 Jun 2026 12:10:34 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 14 Jun 2026 12:10:34 +0200
changeset 1200
abb4d3851061
parent 1199
13b18989113c

add callback for context attachment status changes

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

mercurial