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