ui/motif/text.c

changeset 108
77254bd6dccb
parent 103
6606616eca9f
child 112
c3f2f16fa4b8
--- 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;
         

mercurial