add ui_call_action3 for calling actions with a typed object as argument

Fri, 05 Jun 2026 18:02:54 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 05 Jun 2026 18:02:54 +0200
changeset 1170
b79469a55540
parent 1169
c69f2941d536
child 1171
d5500e601996

add ui_call_action3 for calling actions with a typed object as argument

ui/common/action.c file | annotate | diff | comparison | revisions
ui/ui/toolkit.h file | annotate | diff | comparison | revisions
--- 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);
 }
--- 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);

mercurial