implement buttion actions (Motif)

Fri, 29 May 2026 22:43:47 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 29 May 2026 22:43:47 +0200
changeset 1152
f560b35c8ca1
parent 1151
337a94a20097
child 1153
f15375e0480c

implement buttion actions (Motif)

ui/motif/button.c file | annotate | diff | comparison | revisions
ui/motif/button.h file | annotate | diff | comparison | revisions
ui/motif/menu.c file | annotate | diff | comparison | revisions
ui/motif/text.c file | annotate | diff | comparison | revisions
ui/motif/toolkit.c file | annotate | diff | comparison | revisions
ui/motif/toolkit.h file | annotate | diff | comparison | revisions
--- a/ui/motif/button.c	Fri May 29 15:49:51 2026 +0200
+++ b/ui/motif/button.c	Fri May 29 22:43:47 2026 +0200
@@ -32,6 +32,7 @@
 #include "button.h"
 #include "container.h"
 #include "../common/context.h"
+#include "../common/action.h"
 #include <cx/mempool.h>
 
 #include <cx/linked_list.h>
@@ -70,6 +71,7 @@
         eventdata->userdata = args->onclickdata;
         eventdata->obj = obj;
         eventdata->value = 0;
+        eventdata->action = args->action ? strdup(args->action) : NULL;
         XtAddCallback(
                 button,
                 XmNactivateCallback,
@@ -78,7 +80,7 @@
        XtAddCallback(
                 button,
                 XmNdestroyCallback,
-                (XtCallbackProc)ui_destroy_data,
+                (XtCallbackProc)ui_destroy_event_data,
                 eventdata);
     }
     
@@ -95,6 +97,10 @@
     e.intval = event->value;
     e.set = 0;
     event->callback(&e, event->userdata);
+    
+    if(event->action) {
+        uic_action_callback(&e, event->action);
+    }
 }
 
 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) {
@@ -122,7 +128,7 @@
     
     ui_set_widget_groups(obj->ctx, button, args->states);
     
-    ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_state);
+    ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->action, args->enable_state);
     
     XmStringFree(label);
     return button;
@@ -151,7 +157,7 @@
     
     ui_set_widget_groups(obj->ctx, button, args->states);
     
-    ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_state);
+    ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->action, args->enable_state);
     
     XmStringFree(label);
     return button;
@@ -184,6 +190,10 @@
         event->callback(&e, event->userdata);
     }
     
+    if(event->action) {
+        uic_action_callback(&e, event->action);
+    }
+    
     if(event->var && event->var->value) {
         UiInteger *v = event->var->value;
         v->value = e.intval;
@@ -198,6 +208,7 @@
         UiInteger *value,
         ui_callback onchange,
         void *onchangedata,
+        const char *action,
         int enable_state)
 {
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER);
@@ -216,6 +227,7 @@
     event->obj = obj;
     event->callback = onchange;
     event->userdata = onchangedata;
+    event->action = action ? strdup(action) : NULL;
     event->var = var;
     event->observers = NULL;
     event->value = enable_state;
@@ -227,7 +239,7 @@
     XtAddCallback(
             widget,
             XmNdestroyCallback,
-            (XtCallbackProc)ui_destroy_data,
+            (XtCallbackProc)ui_destroy_var_event_data,
             event);
 }
 
@@ -294,12 +306,16 @@
         event->callback(&e, event->userdata);
     }
     
+    if(event->action) {
+        uic_action_callback(&e, event->action);
+    }
+    
     if(value) {
         ui_notify_evt(value->observers, &e);
     }
 }
 
-void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, int enable_group) {
+void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, const char *action, int enable_group) {
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER);
     if(var) {
         UiInteger *value = var->value;
@@ -333,6 +349,7 @@
     event->obj = obj;
     event->callback = onchange;
     event->userdata = onchangedata;
+    event->action = action ? strdup(action) : NULL;
     event->observers = NULL;
     event->var = var;
     event->value = enable_group;
@@ -404,6 +421,7 @@
     event->obj = obj;
     event->callback = args->onchange;
     event->userdata = args->onchangedata;
+    event->action = args->action ? strdup(args->action) : NULL;
     event->observers = NULL;
     event->var = var;
     event->value = args->enable_state;
--- a/ui/motif/button.h	Fri May 29 15:49:51 2026 +0200
+++ b/ui/motif/button.h	Fri May 29 22:43:47 2026 +0200
@@ -45,12 +45,13 @@
         UiInteger *value,
         ui_callback onchange,
         void *onchangedata,
+        const char *action,
         int enable_state);
 
 int64_t ui_togglebutton_get(UiInteger *i);
 void ui_togglebutton_set(UiInteger *i, int64_t value);
 
-void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, int enable_group);
+void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, const char *action, int enable_group);
 
 int64_t ui_radiobutton_get(UiInteger *i);
 void ui_radiobutton_set(UiInteger *i, int64_t value);
--- a/ui/motif/menu.c	Fri May 29 15:49:51 2026 +0200
+++ b/ui/motif/menu.c	Fri May 29 22:43:47 2026 +0200
@@ -179,7 +179,7 @@
         XmStringFree(s);
     }
     
-    ui_bind_togglebutton(obj, checkbox, it->varname, NULL, it->callback, it->userdata, 0);
+    ui_bind_togglebutton(obj, checkbox, it->varname, NULL, it->callback, it->userdata, NULL, 0);
     
     ui_set_widget_groups(obj->ctx, checkbox, it->states);
 }
--- a/ui/motif/text.c	Fri May 29 15:49:51 2026 +0200
+++ b/ui/motif/text.c	Fri May 29 22:43:47 2026 +0200
@@ -98,6 +98,10 @@
                 var);
     }
     
+    if(args->onchange || args->action) {
+        
+    }
+    
     return widget;
 }
 
--- a/ui/motif/toolkit.c	Fri May 29 15:49:51 2026 +0200
+++ b/ui/motif/toolkit.c	Fri May 29 22:43:47 2026 +0200
@@ -348,6 +348,16 @@
     free(data);
 }
 
+void ui_destroy_event_data(Widget w, UiEventData *data, XtPointer d) {
+    free(data->action);
+    free(data);
+}
+
+void ui_destroy_var_event_data(Widget w, UiVarEventData *data, XtPointer d) {
+    free(data->action);
+    free(data);
+}
+
 void ui_set_widget_groups(UiContext *ctx, Widget widget, const int *groups) {
     if(!groups) {
         return;
--- a/ui/motif/toolkit.h	Fri May 29 15:49:51 2026 +0200
+++ b/ui/motif/toolkit.h	Fri May 29 22:43:47 2026 +0200
@@ -44,6 +44,7 @@
     void        *userdata;
     int         value;
     void        *customdata;
+    char        *action;
 } UiEventData;
 
 typedef struct UiEventDataExt {
@@ -68,6 +69,7 @@
     UiObserver  **observers;
     ui_callback callback;
     void        *userdata;
+    char        *action;
     int         value;
 } UiVarEventData;
 
@@ -94,6 +96,10 @@
 
 void ui_destroy_data(Widget w, XtPointer data, XtPointer d);
 
+void ui_destroy_event_data(Widget w, UiEventData *data, XtPointer d);
+
+void ui_destroy_var_event_data(Widget w, UiVarEventData *data, XtPointer d);
+
 void ui_set_widget_groups(UiContext *ctx, Widget widget, const int *groups) ;
 void ui_set_widget_ngroups(UiContext *ctx, Widget widget, const int *groups, size_t ngroups);
 

mercurial