--- 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 -------------------------- */