--- 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); }