# HG changeset patch # User Olaf Wintermann # Date 1780675374 -7200 # Node ID b79469a55540a8035d883d90205c28106f1b21ad # Parent c69f2941d536bbeacc22defa21be0c12d881eec0 add ui_call_action3 for calling actions with a typed object as argument diff -r c69f2941d536 -r b79469a55540 ui/common/action.c --- a/ui/common/action.c Thu Jun 04 20:35:31 2026 +0200 +++ b/ui/common/action.c Fri Jun 05 18:02:54 2026 +0200 @@ -143,11 +143,7 @@ } } -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) { +static int call_action(UiContext *ctx, const char *action_name, void *eventdata, UiEventType eventdatatype, int intval) { UiAction *action = uic_resolve_action(ctx, action_name); if(action && action->callback) { UiEvent event; @@ -157,13 +153,33 @@ event.document = ctx->self_doc ? ctx->self_doc : ctx->document; if(eventdata) { event.eventdata = eventdata; - event.eventdatatype = UI_EVENT_DATA_POINTER; + event.eventdatatype = eventdatatype; } event.intval = intval; action->callback(&event, action->userdata); + return 1; + } else { + return 0; } } +int ui_call_action(UiContext *ctx, const char *action_name) { + return ui_call_action2(ctx, action_name, NULL, 0); +} + +int ui_call_action2(UiContext *ctx, const char *action_name, void *eventdata, int intval) { + return call_action(ctx, action_name, eventdata, UI_EVENT_DATA_POINTER, intval); +} + +int ui_call_action3(UiContext *ctx, const char *action_name, void *ptr, uint64_t type_id) { + UiTypedObj *obj = malloc(sizeof(UiTypedObj)); + obj->ptr = ptr; + obj->type = type_id; + int ret = call_action(ctx, action_name, obj, UI_EVENT_DATA_TYPED_OBJECT, 0); + free(obj); + return ret; +} + void ui_broadcast_action(const char *action_name) { ui_broadcast_action2(action_name, NULL, 0); } diff -r c69f2941d536 -r b79469a55540 ui/ui/toolkit.h --- a/ui/ui/toolkit.h Thu Jun 04 20:35:31 2026 +0200 +++ b/ui/ui/toolkit.h Fri Jun 05 18:02:54 2026 +0200 @@ -213,6 +213,8 @@ typedef struct UiTextStyle UiTextStyle; typedef struct UiColor UiColor; +typedef enum UiEventType UiEventType; + /* begin opaque types */ typedef struct UiContext UiContext; typedef struct UiContainer UiContainer; @@ -317,14 +319,32 @@ unsigned int ref; }; +enum UiEventType { + UI_EVENT_DATA_NULL = 0, + UI_EVENT_DATA_POINTER, + UI_EVENT_DATA_STRING, + UI_EVENT_DATA_INTEGER_VALUE, + UI_EVENT_DATA_STRING_VALUE, + UI_EVENT_DATA_TEXT_VALUE, + UI_EVENT_DATA_DOUBLE_VALUE, + UI_EVENT_DATA_RANGE_VALUE, + UI_EVENT_DATA_TEXT_CHANGED, + UI_EVENT_DATA_LIST_SELECTION, + UI_EVENT_DATA_LIST_ELM, + UI_EVENT_DATA_DND, + UI_EVENT_DATA_SUBLIST, + UI_EVENT_DATA_FILE_LIST, + UI_EVENT_DATA_TYPED_OBJECT +}; + struct UiEvent { - UiObject *obj; - void *document; - void *window; - void *eventdata; - int eventdatatype; - int intval; - int set; + UiObject *obj; + void *document; + void *window; + void *eventdata; + UiEventType eventdatatype; + int intval; + int set; }; struct UiMouseEvent { @@ -486,22 +506,11 @@ int intdata; } UiCondVar; -enum UiEventType { - UI_EVENT_DATA_NULL = 0, - UI_EVENT_DATA_POINTER, - UI_EVENT_DATA_STRING, - UI_EVENT_DATA_INTEGER_VALUE, - UI_EVENT_DATA_STRING_VALUE, - UI_EVENT_DATA_TEXT_VALUE, - UI_EVENT_DATA_DOUBLE_VALUE, - UI_EVENT_DATA_RANGE_VALUE, - UI_EVENT_DATA_TEXT_CHANGED, - UI_EVENT_DATA_LIST_SELECTION, - UI_EVENT_DATA_LIST_ELM, - UI_EVENT_DATA_DND, - UI_EVENT_DATA_SUBLIST, - UI_EVENT_DATA_FILE_LIST -}; +// eventdata in case eventdatatype is UI_EVENT_DATA_TYPED_OBJECT +typedef struct UiTypedObj { + void *ptr; + uint64_t type; +} UiTypedObj; #define UI_COLOR(r, g, b) (UiColor){r, g, b} struct UiColor { @@ -587,8 +596,9 @@ const char *accelerator, const char *accelerator_text); UIEXPORT void ui_update_action_bindings(UiContext *ctx); -UIEXPORT void ui_call_action(UiContext *ctx, const char *action_name); -UIEXPORT void ui_call_action2(UiContext *ctx, const char *action_name, void *eventdata, int intval); +UIEXPORT int ui_call_action(UiContext *ctx, const char *action_name); +UIEXPORT int ui_call_action2(UiContext *ctx, const char *action_name, void *eventdata, int intval); +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_mainthread_broadcast(const char *action_name);