set event obj in attachment change events

Fri, 19 Jun 2026 19:59:02 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 19 Jun 2026 19:59:02 +0200
changeset 1215
00515f6dbbd7
parent 1214
beba01f68a9f
child 1216
c9702a6d7306

set event obj in attachment change events

ui/common/context.c file | annotate | diff | comparison | revisions
ui/common/context.h file | annotate | diff | comparison | revisions
--- a/ui/common/context.c	Fri Jun 19 17:49:31 2026 +0200
+++ b/ui/common/context.c	Fri Jun 19 19:59:02 2026 +0200
@@ -199,7 +199,13 @@
         doc_ctx->onattach(&event, doc_ctx->onattachdata);
     }
     uic_check_state_widgets(ui_context_toplevel_parent(ctx));
-    uic_send_status_change(doc_ctx);
+    UiObject *obj = ui_context_get_parent_obj(ctx);
+    uic_send_status_change(doc_ctx, obj);
+    
+    UiContext *obj_ctx = uic_obj_context(ctx);
+    if(obj_ctx) {
+        ui_update_action_bindings(obj_ctx);
+    }
 }
 
 static void uic_context_unbind_vars(UiContext *ctx) {
@@ -247,7 +253,10 @@
     uic_context_unbind_vars(doc_ctx); // unbind all doc/subdoc vars from the parent
     doc_ctx->parent = NULL;
     
-    ui_update_action_bindings(ctx);
+    UiContext *obj_ctx = uic_obj_context(ctx);
+    if(obj_ctx) {
+        ui_update_action_bindings(obj_ctx);
+    }
     if(doc_ctx->ondetach) {
         UiEvent event;
         memset(&event, 0, sizeof(UiEvent));
@@ -256,7 +265,7 @@
     }
     
     uic_check_state_widgets(ui_context_toplevel_parent(ctx));
-    uic_send_status_change(doc_ctx);
+    uic_send_status_change(doc_ctx, NULL);
     ui_document_unref(document);
 }
 
@@ -272,19 +281,19 @@
     i = cxListIterator(ls);
     cx_foreach(void *, doc, i) {
         uic_context_detach_document(ctx, doc);
-        uic_send_status_change(ui_document_context(doc));
+        uic_send_status_change(ui_document_context(doc), NULL);
     }
     
     cxListFree(ls);
     ui_update_action_bindings(ctx);
 }
 
-static void send_status_change(UiContext *ctx, UiEvent *event) {
+static void send_status_change(UiContext *ctx, UiEvent *event, UiObject *obj) {
     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->obj = doc_ctx->obj ? doc_ctx->obj : 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);
@@ -292,17 +301,17 @@
     }
     
     if(ctx->onattachmentstatuschange) {
-        event->obj = ctx->obj;
+        event->obj = ctx->obj ? ctx->obj : 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) {
+void uic_send_status_change(UiContext *ctx, UiObject *obj) {
     UiEvent event;
     memset(&event, 0, sizeof(UiEvent));
-    send_status_change(ctx, &event);
+    send_status_change(ctx, &event, obj);
 }
 
 
@@ -1104,11 +1113,20 @@
 }
 
 int ui_context_is_attached_to_obj(UiContext *ctx) {
+    return uic_obj_context(ctx) != NULL;
+}
+
+UIEXPORT UiObject* ui_context_get_parent_obj(UiContext *ctx) {
+    UiContext *obj_ctx = uic_obj_context(ctx);
+    return obj_ctx ? obj_ctx->obj : NULL;
+}
+
+UiContext* uic_obj_context(UiContext *ctx) {
     if(ctx->obj) {
-        return TRUE;
+        return ctx;
     }
     if(ctx->parent == NULL) {
-        return FALSE;
+        return NULL;
     }
-    return ui_context_is_attached_to_obj(ctx->parent);
+    return uic_obj_context(ctx->parent);
 }
--- a/ui/common/context.h	Fri Jun 19 17:49:31 2026 +0200
+++ b/ui/common/context.h	Fri Jun 19 19:59:02 2026 +0200
@@ -153,7 +153,7 @@
 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);
+void uic_send_status_change(UiContext *ctx, UiObject *obj);
 
 UiVar* uic_get_var(UiContext *ctx, const char *name);
 UiVar* uic_get_var_t(UiContext *ctx, const char *name, UiVarType type);
@@ -179,6 +179,8 @@
 void uic_add_state_widget_i(UiContext *ctx, void *widget, ui_enablefunc enable, const int *states, size_t numstates);
 void uic_remove_state_widget(UiContext *ctx, void *widget);
 
+UiContext* uic_obj_context(UiContext *ctx);
+
 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);
@@ -188,6 +190,7 @@
 
 UIEXPORT int ui_context_is_attached(UiContext *ctx);
 UIEXPORT int ui_context_is_attached_to_obj(UiContext *ctx);
+UIEXPORT UiObject* ui_context_get_parent_obj(UiContext *ctx);
 
 #ifdef	__cplusplus
 }

mercurial