# HG changeset patch # User Olaf Wintermann # Date 1763469218 -3600 # Node ID d54a72c9432093c4139cf812da86c17e842d22bd # Parent edfdf9776da9693a80667727139ed93f14b2d5ec implement textfield callbacks (Motif) diff -r edfdf9776da9 -r d54a72c94320 application/demo_bindings.c --- 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) { diff -r edfdf9776da9 -r d54a72c94320 ui/gtk/text.c --- 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); diff -r edfdf9776da9 -r d54a72c94320 ui/motif/text.c --- 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); } diff -r edfdf9776da9 -r d54a72c94320 ui/motif/text.h --- 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);