implement textfield callbacks (Motif)

Tue, 18 Nov 2025 13:33:38 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Tue, 18 Nov 2025 13:33:38 +0100
changeset 907
d54a72c94320
parent 906
edfdf9776da9
child 908
54150a21abb4

implement textfield callbacks (Motif)

application/demo_bindings.c file | annotate | diff | comparison | revisions
ui/gtk/text.c file | annotate | diff | comparison | revisions
ui/motif/text.c file | annotate | diff | comparison | revisions
ui/motif/text.h file | annotate | diff | comparison | revisions
--- a/application/demo_bindings.c	Tue Nov 18 12:55:28 2025 +0100
+++ b/application/demo_bindings.c	Tue Nov 18 13:33:38 2025 +0100
@@ -74,9 +74,6 @@
         ui_attach_document(event->obj->ctx, doc);
         
     }
-    //UiListSelection sel = ui_list_getselection(wdata->doclist);
-    //printf("sel: %d\n", sel.rows[0]);
-    //ui_listselection_free(sel);
 }
 
 void* doclist_get_value(void *elm, int col) {
--- a/ui/gtk/text.c	Tue Nov 18 12:55:28 2025 +0100
+++ b/ui/gtk/text.c	Tue Nov 18 13:33:38 2025 +0100
@@ -706,14 +706,14 @@
         return;
     }
     
-    UiString *value = textfield->var->value;
+    UiString *value = textfield->var ? textfield->var->value : NULL;
     
     UiEvent e;
     e.obj = textfield->obj;
     e.window = e.obj->window;
     e.document = textfield->obj->ctx->document;
     e.eventdata = value;
-    e.eventdatatype = UI_EVENT_DATA_TEXT_VALUE;
+    e.eventdatatype = value ? UI_EVENT_DATA_TEXT_VALUE : 0;
     e.intval = 0;
     e.set = ui_get_setop();
     
@@ -728,12 +728,14 @@
 
 void ui_textfield_activate(GtkEntry* self, UiTextField *textfield) {
     if(textfield->onactivate) {
+        UiString *value = textfield->var ? textfield->var->value : NULL;
+        
         UiEvent e;
         e.obj = textfield->obj;
         e.window = e.obj->window;
         e.document = textfield->obj->ctx->document;
-        e.eventdata = NULL;
-        e.eventdatatype = 0;
+        e.eventdata = value;
+        e.eventdatatype = value ? UI_EVENT_DATA_TEXT_VALUE : 0;
         e.intval = 0;
         e.set = ui_get_setop();
         textfield->onactivate(&e, textfield->onactivatedata);
--- a/ui/motif/text.c	Tue Nov 18 12:55:28 2025 +0100
+++ b/ui/motif/text.c	Tue Nov 18 13:33:38 2025 +0100
@@ -407,8 +407,18 @@
     
     ui_set_widget_groups(obj->ctx, textfield, args->groups);
     
+    UiEventDataExt *eventdata = malloc(sizeof(UiEventDataExt));
+    memset(eventdata, 0, sizeof(UiEventDataExt));
+    eventdata->obj = obj;
+    eventdata->callback = args->onactivate;
+    eventdata->userdata = args->onactivatedata;
+    eventdata->callback2 = args->onchange;
+    eventdata->userdata2 = args->onchangedata;
+    
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING);
     if(var) {
+        eventdata->customdata0 = var;
+        
         UiString *value = (UiString*)var->value;
         value->obj = textfield;
         value->get = ui_textfield_get;
@@ -419,9 +429,54 @@
         }
     }
     
+    XtAddCallback(
+            textfield,
+            XmNactivateCallback,
+            (XtCallbackProc)ui_textfield_activate,
+            eventdata);
+    XtAddCallback(
+            textfield,
+            XmNvalueChangedCallback,
+            (XtCallbackProc)ui_textfield_value_changed,
+            eventdata);
+    XtAddCallback(
+            textfield,
+            XmNdestroyCallback,
+            (XtCallbackProc)ui_destroy_data,
+            eventdata);
+    
     return textfield;
 }
 
+static void textfield_event(UiEventDataExt *eventdata, ui_callback callback, void *userdata) {
+    if(callback) {
+        UiVar *var = eventdata->customdata0;
+        UiString *value = var ? var->value : NULL;
+        
+        UiEvent e;
+        e.obj = eventdata->obj;
+        e.window = e.obj->window;
+        e.document = e.obj->ctx->document;
+        e.eventdata = value;
+        e.eventdatatype = value ? UI_EVENT_DATA_TEXT_VALUE : 0;
+        e.intval = 0;
+        e.set = ui_get_setop();
+        callback(&e, userdata);
+    }
+}
+
+void ui_textfield_activate(Widget widget, XtPointer ud, XtPointer cb) {
+    UiEventDataExt *eventdata = ud;
+    textfield_event(ud, eventdata->callback, eventdata->userdata);
+}
+
+void ui_textfield_value_changed(Widget widget, XtPointer ud, XtPointer cb) {
+    UiEventDataExt *eventdata = ud;
+    if(ui_onchange_events_is_enabled()) {
+        textfield_event(ud, eventdata->callback2, eventdata->userdata2);
+    }
+}
+
 UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) {
     return create_textfield(obj, args, FALSE, FALSE);
 }
--- a/ui/motif/text.h	Tue Nov 18 12:55:28 2025 +0100
+++ b/ui/motif/text.h	Tue Nov 18 13:33:38 2025 +0100
@@ -86,6 +86,9 @@
 int ui_check_insertstr(char *oldstr, int oldlen, char *newstr, int newlen);
 void ui_free_textbuf_op(UiTextBufOp *op);
 
+void ui_textfield_activate(Widget widget, XtPointer ud, XtPointer cb);
+void ui_textfield_value_changed(Widget widget, XtPointer ud, XtPointer cb);
+
 char* ui_textfield_get(UiString *str);
 void ui_textfield_set(UiString *str, const char *value);
 

mercurial