refactore widget args passing (Motif)

Thu, 29 May 2025 13:23:11 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 29 May 2025 13:23:11 +0200
changeset 595
e62047c59658
parent 594
fc854e0ab924
child 596
34866811080d

refactore widget args passing (Motif)

ui/motif/button.c file | annotate | diff | comparison | revisions
ui/motif/container.c file | annotate | diff | comparison | revisions
ui/motif/container.h file | annotate | diff | comparison | revisions
ui/motif/label.c file | annotate | diff | comparison | revisions
ui/motif/list.c file | annotate | diff | comparison | revisions
ui/motif/text.c file | annotate | diff | comparison | revisions
ui/motif/widget.c file | annotate | diff | comparison | revisions
ui/ui/widget.h file | annotate | diff | comparison | revisions
--- a/ui/motif/button.c	Thu May 29 12:03:32 2025 +0200
+++ b/ui/motif/button.c	Thu May 29 13:23:11 2025 +0200
@@ -41,7 +41,7 @@
 #include <Xm/XmAll.h>
 
 
-UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) {
+UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) {
     Arg xargs[16];
     int n = 0;
     
@@ -51,22 +51,22 @@
     Widget parent = ctn->prepare(ctn, xargs, &n);
        
     XmString label = NULL;
-    if(args.label) {
-        label = XmStringCreateLocalized((char*)args.label);
+    if(args->label) {
+        label = XmStringCreateLocalized((char*)args->label);
         XtSetArg(xargs[n], XmNlabelString, label); n++;
     }
     
-    char *name = args.name ? (char*)args.name : "button";
+    char *name = args->name ? (char*)args->name : "button";
     Widget button = XmCreatePushButton(parent, name, xargs, n);
     XtManageChild(button);
     ctn->add(ctn, button);
     
-    ui_set_widget_groups(obj->ctx, button, args.groups);
+    ui_set_widget_groups(obj->ctx, button, args->groups);
     
-    if(args.onclick) {
+    if(args->onclick) {
         UiEventData *eventdata = malloc(sizeof(UiEventData));
-        eventdata->callback = args.onclick;
-        eventdata->userdata = args.onclickdata;
+        eventdata->callback = args->onclick;
+        eventdata->userdata = args->onclickdata;
         eventdata->obj = obj;
         eventdata->value = 0;
         XtAddCallback(
@@ -96,7 +96,7 @@
     event->callback(&e, event->userdata);
 }
 
-UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) {
+UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) {
     Arg xargs[16];
     int n = 0;
     
@@ -108,25 +108,25 @@
     XtSetArg(xargs[n], XmNindicatorOn, False); n++;
     
     XmString label = NULL;
-    if(args.label) {
-        label = XmStringCreateLocalized((char*)args.label);
+    if(args->label) {
+        label = XmStringCreateLocalized((char*)args->label);
         XtSetArg(xargs[n], XmNlabelString, label); n++;
     }
     
-    char *name = args.name ? (char*)args.name : "togglebutton";
+    char *name = args->name ? (char*)args->name : "togglebutton";
     Widget button = XmCreateToggleButton(parent, name, xargs, n);
     XtManageChild(button);
     ctn->add(ctn, button);
     
-    ui_set_widget_groups(obj->ctx, button, args.groups);
+    ui_set_widget_groups(obj->ctx, button, args->groups);
     
-    ui_bind_togglebutton(obj, button, args.varname, args.value, args.onchange, args.onchangedata, args.enable_group);
+    ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_group);
     
     XmStringFree(label);
     return button;
 }
 
-UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) {
+UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) {
     Arg xargs[16];
     int n = 0;
     
@@ -136,25 +136,25 @@
     Widget parent = ctn->prepare(ctn, xargs, &n);
     
     XmString label = NULL;
-    if(args.label) {
-        label = XmStringCreateLocalized((char*)args.label);
+    if(args->label) {
+        label = XmStringCreateLocalized((char*)args->label);
         XtSetArg(xargs[n], XmNlabelString, label); n++;
     }
     
-    char *name = args.name ? (char*)args.name : "button";
+    char *name = args->name ? (char*)args->name : "button";
     Widget button = XmCreateToggleButton(parent, name, xargs, n);
     XtManageChild(button);
     ctn->add(ctn, button);
     
-    ui_set_widget_groups(obj->ctx, button, args.groups);
+    ui_set_widget_groups(obj->ctx, button, args->groups);
     
-    ui_bind_togglebutton(obj, button, args.varname, args.value, args.onchange, args.onchangedata, args.enable_group);
+    ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_group);
     
     XmStringFree(label);
     return button;
 }
 
-UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) {
+UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) {
     return ui_checkbox_create(obj, args);
 }
 
@@ -343,7 +343,7 @@
             event);
 }
 
-UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) {
+UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) {
     Arg xargs[16];
     int n = 0;
     
@@ -353,19 +353,19 @@
     Widget parent = ctn->prepare(ctn, xargs, &n);
     XtSetArg(xargs[n], XmNindicatorType, XmONE_OF_MANY_ROUND); n++;
     XmString label = NULL;
-    if(args.label) {
-        label = XmStringCreateLocalized((char*)args.label);
+    if(args->label) {
+        label = XmStringCreateLocalized((char*)args->label);
         XtSetArg(xargs[n], XmNlabelString, label); n++;
     }
     
-    char *name = args.name ? (char*)args.name : "button";
+    char *name = args->name ? (char*)args->name : "button";
     Widget button = XmCreateToggleButton(parent, name, xargs, n);
     XtManageChild(button);
     ctn->add(ctn, button);
     
-    ui_set_widget_groups(obj->ctx, button, args.groups);
+    ui_set_widget_groups(obj->ctx, button, args->groups);
     
-    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER);
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
     if(var) {
         UiInteger *value = var->value;
         CxList *rb = value->obj;
@@ -396,11 +396,11 @@
     // other buttons in the radio button group
     UiVarEventData *event = malloc(sizeof(UiVarEventData));
     event->obj = obj;
-    event->callback = args.onchange;
-    event->userdata = args.onchangedata;
+    event->callback = args->onchange;
+    event->userdata = args->onchangedata;
     event->observers = NULL;
     event->var = var;
-    event->value = args.enable_group;
+    event->value = args->enable_group;
     XtAddCallback(
             button,
             XmNvalueChangedCallback,
--- a/ui/motif/container.c	Thu May 29 12:03:32 2025 +0200
+++ b/ui/motif/container.c	Thu May 29 13:23:11 2025 +0200
@@ -43,7 +43,7 @@
 
 /* ---------------------------- Box Container ---------------------------- */
 
-static UIWIDGET box_create(UiObject *obj, UiContainerArgs args, UiBoxOrientation orientation) { 
+static UIWIDGET box_create(UiObject *obj, UiContainerArgs *args, UiBoxOrientation orientation) { 
     UiContainerPrivate *ctn = ui_obj_container(obj);
     UI_APPLY_LAYOUT(ctn->layout, args);
     
@@ -51,13 +51,13 @@
     int n = 0;
     
     if(orientation == UI_BOX_VERTICAL) {
-        //XtSetArg(xargs[n], gridRowSpacing, args.spacing); n++;
+        //XtSetArg(xargs[n], gridRowSpacing, args->spacing); n++;
     } else {
-        //XtSetArg(xargs[n], gridColumnSpacing, args.spacing); n++;
+        //XtSetArg(xargs[n], gridColumnSpacing, args->spacing); n++;
     }
     
     Widget parent = ctn->prepare(ctn, xargs, &n);
-    Widget grid = XtCreateManagedWidget(args.name ? args.name : "boxcontainer", gridClass, parent, xargs, n);
+    Widget grid = XtCreateManagedWidget(args->name ? args->name : "boxcontainer", gridClass, parent, xargs, n);
     ctn->add(ctn, grid);
     
     UiContainerX *container = ui_box_container(obj, grid, orientation);
@@ -67,12 +67,12 @@
 }
 
 // public
-UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) {
+UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args) {
     return box_create(obj, args, UI_BOX_VERTICAL);
 }
 
 // public
-UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) {
+UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) {
     return box_create(obj, args, UI_BOX_HORIZONTAL);
 }
 
@@ -129,7 +129,7 @@
 /* ---------------------------- Grid Container ---------------------------- */
 
 // public
-UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) {
+UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) {
     Arg xargs[16];
     int n = 0;
     
@@ -137,13 +137,13 @@
     UI_APPLY_LAYOUT(ctn->layout, args);
     
     Widget parent = ctn->prepare(ctn, xargs, &n);
-    XtSetArg(xargs[n], gridMargin, args.margin); n++;
-    XtSetArg(xargs[n], gridColumnSpacing, args.columnspacing); n++;
-    XtSetArg(xargs[n], gridRowSpacing, args.rowspacing); n++;
-    Widget grid = XtCreateManagedWidget(args.name ? args.name : "gridcontainer", gridClass, parent, xargs, n);
+    XtSetArg(xargs[n], gridMargin, args->margin); n++;
+    XtSetArg(xargs[n], gridColumnSpacing, args->columnspacing); n++;
+    XtSetArg(xargs[n], gridRowSpacing, args->rowspacing); n++;
+    Widget grid = XtCreateManagedWidget(args->name ? args->name : "gridcontainer", gridClass, parent, xargs, n);
     ctn->add(ctn, grid);
     
-    UiContainerX *container = ui_grid_container(obj, grid, args.def_hexpand, args.def_vexpand, args.def_hfill, args.def_vfill);
+    UiContainerX *container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill);
     uic_object_push_container(obj, container);
     
     return grid;
@@ -308,7 +308,7 @@
     }
 }
 
-UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs args) {
+UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs *args) {
     Arg xargs[16];
     int n = 0;
     
@@ -321,7 +321,7 @@
     // - content (Frame)
     UiMotifTabView *tabview = malloc(sizeof(UiMotifTabView));
     memset(tabview, 0, sizeof(UiMotifTabView));
-    char *name = args.name ? (char*)args.name : "tabview";
+    char *name = args->name ? (char*)args->name : "tabview";
     XtSetArg(xargs[n], XmNuserData, tabview); n++;
     Widget parent = ctn->prepare(ctn, xargs, &n);
     Widget form = XmCreateForm(parent, name, xargs, n);
@@ -354,8 +354,8 @@
     tabview->form = form;
     tabview->tabbar = tabbar;
     tabview->content = content;
-    tabview->tabview = args.tabview;
-    tabview->subcontainer = args.subcontainer;
+    tabview->tabview = args->tabview;
+    tabview->subcontainer = args->subcontainer;
     tabview->select = ui_motif_tabview_select;
     tabview->add = ui_motif_tabview_add_tab;
     tabview->remove = ui_motif_tabview_remove;
@@ -369,7 +369,7 @@
     ct->container.add = ui_tabview_container_add;
     ct->tabview = tabview;
     
-    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER);
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
     if(var) {
         UiInteger *i = var->value;
         i->obj = tabview;
@@ -411,7 +411,7 @@
     }
     
     
-    Widget child = ui_vbox_create(obj, (UiContainerArgs) { 0 });
+    Widget child = ui_vbox_create(obj, &(UiContainerArgs) { 0 });
     if(tabview->current) {
         XtUnmanageChild(child);
     } else {
@@ -605,7 +605,7 @@
     return (UiContainerX*)ctn;
 }
 
-UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs args) {
+UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs *args) {
     UiContainerPrivate *ctn = ui_obj_container(obj);
     UI_APPLY_LAYOUT(ctn->layout, args);
     
--- a/ui/motif/container.h	Thu May 29 12:03:32 2025 +0200
+++ b/ui/motif/container.h	Thu May 29 13:23:11 2025 +0200
@@ -39,14 +39,14 @@
 #endif
     
 #define UI_APPLY_LAYOUT(layout, args) \
-    layout.fill = args.fill; \
-    layout.hexpand = args.hexpand; \
-    layout.vexpand = args.vexpand; \
-    layout.hfill = args.hfill; \
-    layout.vfill = args.vfill; \
-    layout.override_defaults = args.override_defaults; \
-    layout.colspan = args.colspan; \
-    layout.rowspan = args.rowspan
+    layout.fill = args->fill; \
+    layout.hexpand = args->hexpand; \
+    layout.vexpand = args->vexpand; \
+    layout.hfill = args->hfill; \
+    layout.vfill = args->vfill; \
+    layout.override_defaults = args->override_defaults; \
+    layout.colspan = args->colspan; \
+    layout.rowspan = args->rowspan
     
 typedef enum UiBoxOrientation UiBoxOrientation;
 
--- a/ui/motif/label.c	Thu May 29 12:03:32 2025 +0200
+++ b/ui/motif/label.c	Thu May 29 13:23:11 2025 +0200
@@ -36,7 +36,7 @@
 
 #include "Grid.h"
 
-static UIWIDGET label_create(UiObject *obj, UiLabelArgs args, int align) {
+static UIWIDGET label_create(UiObject *obj, UiLabelArgs *args, int align) {
     Arg xargs[16];
     int n = 0;
     
@@ -47,12 +47,12 @@
     
     XtSetArg(xargs[n], XmNalignment, align); n++;
     XmString label = NULL;
-    if(args.label) {
-        label = XmStringCreateLocalized((char*)args.label);
+    if(args->label) {
+        label = XmStringCreateLocalized((char*)args->label);
         XtSetArg(xargs[n], XmNlabelString, label); n++;
     }
     
-    char *name = args.name ? (char*)args.name : "label";
+    char *name = args->name ? (char*)args->name : "label";
     Widget w = XmCreateLabel(parent, name, xargs, n);
     XtManageChild(w);
     ctn->add(ctn, w);
@@ -61,15 +61,15 @@
     return w;
 } 
 
-UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs args) {
+UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs *args) {
     return label_create(obj, args, XmALIGNMENT_CENTER);
 }
 
-UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs args) {
+UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs *args) {
     return label_create(obj, args, XmALIGNMENT_BEGINNING);
 }
 
-UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs args) {
+UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs *args) {
     return label_create(obj, args, XmALIGNMENT_END);
 }
 
@@ -103,7 +103,7 @@
     XFillRectangle(dp, w, pb->gc, 0, 0, valueW, widget->core.height);
 }
 
-UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args) {
+UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs *args) {
     Arg xargs[16];
     int n = 0;
     
@@ -112,7 +112,7 @@
     
     Widget parent = ctn->prepare(ctn, xargs, &n);
     
-    char *name = args.name ? (char*)args.name : "progressbar";
+    char *name = args->name ? (char*)args->name : "progressbar";
     Widget frame = XmCreateFrame(parent, name, xargs, n);
     
     // create a button and get some informations about the height, shadow, highlight, ....
@@ -137,12 +137,12 @@
     Widget drawingArea = XmCreateDrawingArea(frame, "progressbar_drawingarea", xargs, n);
     XtManageChild(drawingArea);
     
-    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_DOUBLE);
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_DOUBLE);
     
     UiProgressBar *progressbarData = malloc(sizeof(UiProgressBar));
     progressbarData->widget = drawingArea;
-    progressbarData->min = args.min;
-    progressbarData->max = args.max == 0 ? 100 : args.max;
+    progressbarData->min = args->min;
+    progressbarData->max = args->max == 0 ? 100 : args->max;
     progressbarData->value = 50;
     progressbarData->var = var;
     progressbarData->color = highlightColor;
@@ -186,7 +186,7 @@
 }
 
 
-UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs args) {
+UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs *args) {
     Arg xargs[16];
     int n = 0;
     
@@ -200,12 +200,12 @@
     XtSetArg(xargs[n], XmNalignment, XmALIGNMENT_END); n++;
     XtSetArg(xargs[n], gridMinWidth, 40); n++;
     
-    char *name = args.name ? (char*)args.name : "progresss_spinner";
+    char *name = args->name ? (char*)args->name : "progresss_spinner";
     Widget w = XmCreateLabel(parent, name, xargs, n);
     XtManageChild(w);
     ctn->add(ctn, w);
     
-    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER);
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
     if(var) {
         UiInteger *value = var->value;
         value->obj = w;
--- a/ui/motif/list.c	Thu May 29 12:03:32 2025 +0200
+++ b/ui/motif/list.c	Thu May 29 13:23:11 2025 +0200
@@ -34,36 +34,36 @@
 #include "list.h"
 #include "../common/object.h"
 
-UIWIDGET ui_listview_create(UiObject* obj, UiListArgs args) {
+UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) {
     Arg xargs[16];
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
     UI_APPLY_LAYOUT(ctn->layout, args);
     
-    if(args.multiselection) {
+    if(args->multiselection) {
         XtSetArg(xargs[n], XmNselectionPolicy, XmEXTENDED_SELECT); n++;
     } else {
         XtSetArg(xargs[n], XmNselectionPolicy, XmSINGLE_SELECT); n++;
     }
     
-    char *name = args.name ? (char*)args.name : "listview";
+    char *name = args->name ? (char*)args->name : "listview";
     Widget parent = ctn->prepare(ctn, xargs, &n);
     Widget widget = XmCreateScrolledList(parent, name, xargs, n);
     XtManageChild(widget);
     
-    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.list, args.varname, UI_VAR_LIST);
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
     
     UiListView *listview = malloc(sizeof(UiListView));
     memset(listview, 0, sizeof(UiListView));
     listview->obj = obj;
     listview->widget = widget;
-    listview->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue;
+    listview->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
     listview->var = var;
-    listview->onactivate = args.onactivate;
-    listview->onactivatedata = args.onactivatedata;
-    listview->onselection = args.onselection;
-    listview->onselectiondata = args.onselectiondata;
+    listview->onactivate = args->onactivate;
+    listview->onactivatedata = args->onactivatedata;
+    listview->onselection = args->onselection;
+    listview->onselectiondata = args->onselectiondata;
     
     if(var) {
         UiList *list = var->value;
@@ -227,30 +227,30 @@
     }
 }
 
-UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs args) {
+UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs *args) {
     Arg xargs[16];
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
     UI_APPLY_LAYOUT(ctn->layout, args);
     
-    char *name = args.name ? (char*)args.name : "dropdown";
+    char *name = args->name ? (char*)args->name : "dropdown";
     Widget parent = ctn->prepare(ctn, xargs, &n);
     Widget widget = XmCreateDropDownList(parent, name, xargs, n);
     XtManageChild(widget);
     
-    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.list, args.varname, UI_VAR_LIST);
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
     
     UiListView *listview = malloc(sizeof(UiListView));
     memset(listview, 0, sizeof(UiListView));
     listview->obj = obj;
     listview->widget = widget;
-    listview->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue;
+    listview->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
     listview->var = var;
-    listview->onactivate = args.onactivate;
-    listview->onactivatedata = args.onactivatedata;
-    listview->onselection = args.onselection;
-    listview->onselectiondata = args.onselectiondata;
+    listview->onactivate = args->onactivate;
+    listview->onactivatedata = args->onactivatedata;
+    listview->onselection = args->onselection;
+    listview->onselectiondata = args->onselectiondata;
     
     if(var) {
         UiList *list = var->value;
--- a/ui/motif/text.c	Thu May 29 12:03:32 2025 +0200
+++ b/ui/motif/text.c	Thu May 29 13:23:11 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));
@@ -383,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;
     
@@ -399,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;
@@ -420,15 +420,15 @@
     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);
 }
 
@@ -965,7 +965,7 @@
     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;
     
@@ -977,18 +977,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;
@@ -1002,10 +1002,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;
         
--- a/ui/motif/widget.c	Thu May 29 12:03:32 2025 +0200
+++ b/ui/motif/widget.c	Thu May 29 13:23:11 2025 +0200
@@ -37,7 +37,7 @@
 #include "../common/object.h"
 
 
-UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs args) {
+UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs *args) {
     Arg xargs[64];
     int n = 0;
     
@@ -56,12 +56,11 @@
 UIEXPORT UIWIDGET ui_separator_create(UiObject *obj, UiWidgetArgs *args) {
     Arg xargs[64];
     int n = 0;
-    UiWidgetArgs a = *args;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, a);
+    UI_APPLY_LAYOUT(ctn->layout, args);
     
-    char *name = a.name ? (char*)a.name : "separator";
+    char *name = args->name ? (char*)args->name : "separator";
     Widget parent = ctn->prepare(ctn, xargs, &n);
     Widget widget = XmCreateSeparator(parent, name, xargs, n);
     XtManageChild(widget);
--- a/ui/ui/widget.h	Thu May 29 12:03:32 2025 +0200
+++ b/ui/ui/widget.h	Thu May 29 13:23:11 2025 +0200
@@ -48,21 +48,21 @@
 } UiWidgetArgs;
 
 #ifdef UI_GTK
-typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata);
+typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata);
 #elif defined(UI_QT)
-typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata);
+typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata);
 #elif defined(UI_MOTIF)
-typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata, Widget parent, Arg *a, int n);
+typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata, Widget parent, Arg *a, int n);
 #elif defined(UI_COCOA)
-typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata);
+typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata);
 #elif defined(UI_WINUI)
-typedef UIWIDGET(*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata);
+typedef UIWIDGET(*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata);
 #elif defined(UI_WIN32)
-typedef UIWIDGET(*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata);
+typedef UIWIDGET(*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata);
 #endif
-UIEXPORT UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs args);
+UIEXPORT UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs *args);
 
-#define ui_customwidget(obj, create_widget, userdata, ...) ui_customwidget_create(obj, create_widget, userdata, (UiWidgetArgs) { __VA_ARGS__ })
+#define ui_customwidget(obj, create_widget, userdata, ...) ui_customwidget_create(obj, create_widget, userdata, &(UiWidgetArgs) { __VA_ARGS__ })
 
 
 UIEXPORT UIWIDGET ui_separator_create(UiObject *obj, UiWidgetArgs *args);

mercurial