diff -r b34bd1557c6c -r 77254bd6dccb ui/motif/text.c --- a/ui/motif/text.c Sat Apr 05 17:57:04 2025 +0200 +++ b/ui/motif/text.c Sun Jul 20 22:04:39 2025 +0200 @@ -38,7 +38,7 @@ /* ------------------------------ Text Area ------------------------------ */ -UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { +UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { Arg xargs[16]; int n = 0; @@ -48,12 +48,12 @@ UI_APPLY_LAYOUT(ctn->layout, args); Widget parent = ctn->prepare(ctn, xargs, &n); - char *name = args.name ? (char*)args.name : "textarea"; + char *name = args->name ? (char*)args->name : "textarea"; XtSetArg(xargs[n], XmNwidth, 100); n++; Widget widget = XmCreateScrolledText(parent, name, xargs, n); XtManageChild(widget); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_TEXT); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_TEXT); UiTextArea *textarea = malloc(sizeof(UiTextArea)); memset(textarea, 0, sizeof(UiTextArea)); @@ -68,6 +68,9 @@ value->value.ptr = NULL; } + value->save = ui_textarea_save; + value->restore = ui_textarea_restore; + value->destroy = ui_textarea_text_destroy; value->set = ui_textarea_set; value->get = ui_textarea_get; value->getsubstr = ui_textarea_getsubstr; @@ -79,8 +82,8 @@ value->value.ptr = NULL; value->obj = widget; - if(!value->undomgr) { - value->undomgr = ui_create_undomgr(); + if(!value->data2) { + value->data2 = ui_create_undomgr(); } XtAddCallback( @@ -103,6 +106,25 @@ return str; } +void ui_textarea_save(UiText *text) { + (void)ui_textarea_get(text); +} + +void ui_textarea_restore(UiText *text) { + if(text->value.ptr) { + ui_textarea_set(text, text->value.ptr); + } +} + +void ui_textarea_text_destroy(UiText *text) { + if(text->value.free) { + text->value.free(text->value.ptr); + } + if(text->data2) { + ui_destroy_undomgr(text->data2); + } +} + void ui_textarea_set(UiText *text, const char *str) { XmTextSetString(text->obj, (char*)str); if(text->value.ptr) { @@ -201,13 +223,13 @@ // TODO: bug, fix return; } - if(!value->undomgr) { - value->undomgr = ui_create_undomgr(); + if(!value->data2) { + value->data2 = ui_create_undomgr(); } XmTextVerifyCallbackStruct *txv = (XmTextVerifyCallbackStruct*)data; int type = txv->text->length > 0 ? UI_TEXTBUF_INSERT : UI_TEXTBUF_DELETE; - UiUndoMgr *mgr = value->undomgr; + UiUndoMgr *mgr = value->data2; if(!mgr->event) { return; } @@ -307,7 +329,7 @@ void ui_text_undo(UiText *value) { - UiUndoMgr *mgr = value->undomgr; + UiUndoMgr *mgr = value->data2; if(mgr->cur) { UiTextBufOp *op = mgr->cur; @@ -328,7 +350,7 @@ } void ui_text_redo(UiText *value) { - UiUndoMgr *mgr = value->undomgr; + UiUndoMgr *mgr = value->data2; UiTextBufOp *elm = NULL; if(mgr->cur) { @@ -361,7 +383,7 @@ /* ------------------------------ Text Field ------------------------------ */ -static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs args, int frameless, int password) { +static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs *args, int frameless, int password) { Arg xargs[16]; int n = 0; @@ -377,13 +399,13 @@ UI_APPLY_LAYOUT(ctn->layout, args); Widget parent = ctn->prepare(ctn, xargs, &n); - char *name = args.name ? (char*)args.name : "textfield"; + char *name = args->name ? (char*)args->name : "textfield"; Widget textfield = XmCreateTextField(parent, name, xargs, n); XtManageChild(textfield); - ui_set_widget_groups(obj->ctx, textfield, args.groups); + ui_set_widget_groups(obj->ctx, textfield, args->groups); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); if(var) { UiString *value = (UiString*)var->value; value->obj = textfield; @@ -398,20 +420,22 @@ return textfield; } -UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args) { +UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) { return create_textfield(obj, args, FALSE, FALSE); } -UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args) { +UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args) { return create_textfield(obj, args, TRUE, FALSE); } -UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args) { +UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) { return create_textfield(obj, args, FALSE, FALSE); } char* ui_textfield_get(UiString *str) { - str->value.free(str->value.ptr); + if(str->value.free) { + str->value.free(str->value.ptr); + } char *value = XmTextFieldGetString(str->obj); str->value.ptr = value; str->value.free = (ui_freefunc)XtFree; @@ -420,8 +444,10 @@ void ui_textfield_set(UiString *str, const char *value) { XmTextFieldSetString(str->obj, (void*)value); + if(str->value.free) { + str->value.free(str->value.ptr); + } str->value.ptr = NULL; - str->value.free(str->value.ptr); } @@ -935,11 +961,12 @@ evt.window = evt.obj->window; evt.document = evt.obj->ctx->document; evt.eventdata = path; + evt.eventdatatype = UI_EVENT_DATA_STRING; evt.intval = index; event->callback(&evt, event->userdata); } -UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { +UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { Arg xargs[16]; int n = 0; @@ -951,18 +978,18 @@ PathBar *pathbar = CreatePathBar(parent, xargs, n); - if(!args.getpathelm) { + if(!args->getpathelm) { pathbar->getpathelm= default_pathelm_func; } else { - pathbar->getpathelm = args.getpathelm; - pathbar->getpathelmdata = args.getpathelmdata; + pathbar->getpathelm = args->getpathelm; + pathbar->getpathelmdata = args->getpathelmdata; } XtManageChild(pathbar->widget); ctn->add(ctn, pathbar->widget); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); if (var) { UiString* value = (UiString*)var->value; value->obj = pathbar; @@ -976,10 +1003,10 @@ } } - if(args.onactivate) { + if(args->onactivate) { UiEventData *eventdata = malloc(sizeof(UiEventData)); - eventdata->callback = args.onactivate; - eventdata->userdata = args.onactivatedata; + eventdata->callback = args->onactivate; + eventdata->userdata = args->onactivatedata; eventdata->obj = obj; eventdata->value = 0;