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