ui/motif/text.c

changeset 907
d54a72c94320
parent 898
0484fc666c1d
child 925
df27741d02b5
--- 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);
 }

mercurial