send broadcast to all receivers

Sun, 07 Jun 2026 17:43:15 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 07 Jun 2026 17:43:15 +0200
changeset 1183
51c0e1053592
parent 1182
ec28b0c22af0
child 1184
2436f03c8aca

send broadcast to all receivers

ui/common/action.c file | annotate | diff | comparison | revisions
ui/ui/toolkit.h file | annotate | diff | comparison | revisions
--- a/ui/common/action.c	Sun Jun 07 13:51:18 2026 +0200
+++ b/ui/common/action.c	Sun Jun 07 17:43:15 2026 +0200
@@ -180,21 +180,53 @@
     return ret;
 }
 
+static void call_action_recursive(const char *action_name, UiContext *ctx, void *eventdata, UiEventType eventdatatype, int intval) {
+    UiEvent event;
+    memset(&event, 0, sizeof(UiEvent));
+    event.obj = ctx->obj;
+    event.window = event.obj ? event.obj->window : NULL;
+    event.document = ctx->self_doc ? ctx->self_doc : ctx->document;
+    if(eventdata) {
+        event.eventdata = eventdata;
+        event.eventdatatype = eventdatatype;
+    }
+    event.intval = intval;
+    
+    UiAction *a = NULL;
+    if(ctx->actions) {
+        a = cxMapGet(ctx->actions, action_name);
+    }
+    if(a && a->callback) {
+        a->callback(&event, a->userdata);
+    }
+    
+    CxIterator i = cxListIterator(ctx->documents);
+    cx_foreach(void *, doc, i) {
+        UiContext *doc_ctx = ui_document_context(doc);
+        call_action_recursive(action_name, doc_ctx, eventdata, eventdatatype, intval);
+    }
+}
+
+static void broadcast_action(const char *action_name, void *eventdata, UiEventType eventdatatype, int intval) {
+    CxList *objects = uic_object_list();
+    CxIterator i = cxListIterator(objects);
+    cx_foreach(UiObject*, obj, i) {
+        call_action_recursive(action_name, obj->ctx, eventdata, eventdatatype, intval);
+    }
+}
+
 void ui_broadcast_action(const char *action_name) {
-    ui_broadcast_action2(action_name, NULL, 0);
+    broadcast_action(action_name, NULL, UI_EVENT_DATA_NULL, 0);
 }
 
 void ui_broadcast_action2(const char *action_name, void *eventdata, int intval) {
-    CxList *objects = uic_object_list();
-    CxIterator i = cxListIterator(objects);
-    cx_foreach(UiObject*, obj, i) {
-        ui_call_action2(obj->ctx, action_name, eventdata, intval);
-    }
+    broadcast_action(action_name, eventdata, UI_EVENT_DATA_POINTER, intval);
 }
 
 typedef struct UiActionBroadcast {
     char *action;
     void *eventdata;
+    UiEventType eventdatataype;
     int intval;
 } UiActionBroadcast;
 
@@ -204,7 +236,10 @@
 
 static int mainthread_action_broadcast(void *data) {
     UiActionBroadcast *broadcast = data;
-    ui_broadcast_action2(broadcast->action, broadcast->eventdata, broadcast->intval);
+    broadcast_action(broadcast->action, broadcast->eventdata, broadcast->eventdatataype, broadcast->intval);
+    if(broadcast->eventdatataype == UI_EVENT_DATA_TYPED_OBJECT) {
+        free(broadcast->eventdata);
+    }
     free(broadcast->action);
     free(broadcast);
     return 0;
@@ -214,6 +249,20 @@
     UiActionBroadcast *broadcast = malloc(sizeof(UiActionBroadcast));
     broadcast->action = strdup(action_name);
     broadcast->eventdata = eventdata;
+    broadcast->eventdatataype = UI_EVENT_DATA_POINTER;
     broadcast->intval = intval;
     ui_call_mainthread(mainthread_action_broadcast, broadcast);
 }
+
+void ui_mainthread_broadcast3(const char *action_name, void *ptr, uint64_t type_id) {
+    UiTypedObj *obj = malloc(sizeof(UiTypedObj));
+    obj->ptr = ptr;
+    obj->type = type_id;
+    
+    UiActionBroadcast *broadcast = malloc(sizeof(UiActionBroadcast));
+    broadcast->action = strdup(action_name);
+    broadcast->eventdata = obj;
+    broadcast->eventdatataype = UI_EVENT_DATA_TYPED_OBJECT;
+    broadcast->intval = 0;
+    ui_call_mainthread(mainthread_action_broadcast, broadcast);
+}
--- a/ui/ui/toolkit.h	Sun Jun 07 13:51:18 2026 +0200
+++ b/ui/ui/toolkit.h	Sun Jun 07 17:43:15 2026 +0200
@@ -604,8 +604,10 @@
 UIEXPORT int ui_call_action3(UiContext *ctx, const char *action_name, void *ptr, uint64_t type_id);
 UIEXPORT void ui_broadcast_action(const char *action_name);
 UIEXPORT void ui_broadcast_action2(const char *action_name, void *eventdata, int intval);
+UIEXPORT void ui_broadcast_action3(const char *action_name, void *ptr, uint64_t type_id);
 UIEXPORT void ui_mainthread_broadcast(const char *action_name);
 UIEXPORT void ui_mainthread_broadcast2(const char *action_name, void *eventdata, int intval);
+UIEXPORT void ui_mainthread_broadcast3(const char *action_name, void *ptr, uint64_t type_id);
 
 UIEXPORT void ui_set_state(UiContext *ctx, int state);
 UIEXPORT void ui_unset_state(UiContext *ctx, int state);

mercurial