ui/motif/label.c

changeset 113
dde28a806552
parent 112
c3f2f16fa4b8
--- a/ui/motif/label.c	Sun Oct 19 21:20:08 2025 +0200
+++ b/ui/motif/label.c	Mon Nov 10 21:52:51 2025 +0100
@@ -47,17 +47,34 @@
     
     XtSetArg(xargs[n], XmNalignment, align); n++;
     XmString label = NULL;
-    if(args->label) {
-        label = XmStringCreateLocalized((char*)args->label);
-        XtSetArg(xargs[n], XmNlabelString, label); n++;
+    char *lbl = (char*)args->label;
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING);
+    if(var) {
+        UiString *s = var->value;
+        lbl = s->value.ptr;    
     }
     
+    if(lbl) {
+        label = XmStringCreateLocalized(lbl); 
+    } else {
+        label = XmStringCreateLocalized("");
+    }
+    
+    XtSetArg(xargs[n], XmNlabelString, label); n++;
     char *name = args->name ? (char*)args->name : "label";
     Widget w = XmCreateLabel(parent, name, xargs, n);
     XtManageChild(w);
     ui_container_add(ctn, w);
       
     XmStringFree(label);
+    
+    if(var) {
+        UiString *s = var->value;
+        s->obj = w;
+        s->get = ui_label_get;
+        s->set = ui_label_set;
+    }
+    
     return w;
 } 
 
@@ -73,6 +90,36 @@
     return label_create(obj, args, XmALIGNMENT_END);
 }
 
+char* ui_label_get(UiString *s) {
+    if(s->value.free) {
+        s->value.free(s->value.ptr);
+        s->value.free = NULL;
+        s->value.ptr = NULL;
+    }
+    Widget w = s->obj;
+    XmString s1 = NULL;
+    XtVaGetValues(w, XmNlabelString, &s1, NULL);
+    if(s1) {
+        char *value;
+        if(XmStringGetLtoR(s1, XmFONTLIST_DEFAULT_TAG, &value)) {
+            s->value.ptr = value;
+            s->value.free = (cx_destructor_func)XtFree;
+        }
+    }
+    return s->value.ptr;
+}
+
+void ui_label_set(UiString *s, const char *str) {
+    if(s->value.free) {
+        s->value.free(s->value.ptr);
+        s->value.free = NULL;
+        s->value.ptr = NULL;
+    }
+    Widget w = s->obj;
+    XmString s1 = XmStringCreateLocalized(str ? (char*)str : "");
+    XtVaSetValues(w, XmNlabelString, s1, NULL);
+    XmStringFree(s1);
+}
 
 /* -------------------------- progressbar/spiner -------------------------- */
 

mercurial