ui/common/action.c

changeset 1127
d3a8c29ebdaa
parent 1092
0accf125a65f
--- a/ui/common/action.c	Wed May 13 11:57:43 2026 +0200
+++ b/ui/common/action.c	Sun May 17 10:46:35 2026 +0200
@@ -28,6 +28,7 @@
 
 #include "action.h"
 #include "context.h"
+#include "object.h"
 
 #include <cx/string.h>
 
@@ -141,3 +142,62 @@
         }
     }
 }
+
+void ui_call_action(UiContext *ctx, const char *action_name) {
+    ui_call_action2(ctx, action_name, NULL, 0);
+}
+
+void ui_call_action2(UiContext *ctx, const char *action_name, void *eventdata, int intval) {
+    UiAction *action = uic_resolve_action(ctx, action_name);
+    if(action && action->callback) {
+        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 = UI_EVENT_DATA_POINTER;
+        }
+        event.intval = intval;
+        action->callback(&event, action->userdata);
+    }
+}
+
+void ui_broadcast_action(const char *action_name) {
+    ui_broadcast_action2(action_name, 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);
+    }
+}
+
+typedef struct UiActionBroadcast {
+    char *action;
+    void *eventdata;
+    int intval;
+} UiActionBroadcast;
+
+void ui_mainthread_broadcast(const char *action_name) {
+    ui_mainthread_broadcast2(action_name, NULL, 0);
+}
+
+static int mainthread_action_broadcast(void *data) {
+    UiActionBroadcast *broadcast = data;
+    ui_broadcast_action2(broadcast->action, broadcast->eventdata, broadcast->intval);
+    free(broadcast->action);
+    free(broadcast);
+    return 0;
+}
+
+void ui_mainthread_broadcast2(const char *action_name, void *eventdata, int intval) {
+    UiActionBroadcast *broadcast = malloc(sizeof(UiActionBroadcast));
+    broadcast->action = strdup(action_name);
+    broadcast->eventdata = eventdata;
+    broadcast->intval = intval;
+    ui_call_mainthread(mainthread_action_broadcast, broadcast);
+}

mercurial