refactor motif containers

Mon, 06 Oct 2025 16:50:42 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 06 Oct 2025 16:50:42 +0200
changeset 808
2b0ecad00872
parent 807
407be316311f
child 809
f5ddce392617

refactor motif containers

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
--- a/ui/motif/button.c	Mon Oct 06 13:15:09 2025 +0200
+++ b/ui/motif/button.c	Mon Oct 06 16:50:42 2025 +0200
@@ -46,9 +46,9 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
        
     XmString label = NULL;
     if(args->label) {
@@ -59,7 +59,7 @@
     char *name = args->name ? (char*)args->name : "button";
     Widget button = XmCreatePushButton(parent, name, xargs, n);
     XtManageChild(button);
-    ctn->add(ctn, button);
+    ui_container_add(ctn, button);
     
     ui_set_widget_groups(obj->ctx, button, args->groups);
     
@@ -101,9 +101,9 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     XtSetArg(xargs[n], XmNfillOnSelect, True); n++;
     XtSetArg(xargs[n], XmNindicatorOn, False); n++;
     
@@ -116,7 +116,7 @@
     char *name = args->name ? (char*)args->name : "togglebutton";
     Widget button = XmCreateToggleButton(parent, name, xargs, n);
     XtManageChild(button);
-    ctn->add(ctn, button);
+    ui_container_add(ctn, button);
     
     ui_set_widget_groups(obj->ctx, button, args->groups);
     
@@ -131,9 +131,9 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     
     XmString label = NULL;
     if(args->label) {
@@ -144,7 +144,7 @@
     char *name = args->name ? (char*)args->name : "button";
     Widget button = XmCreateToggleButton(parent, name, xargs, n);
     XtManageChild(button);
-    ctn->add(ctn, button);
+    ui_container_add(ctn, button);
     
     ui_set_widget_groups(obj->ctx, button, args->groups);
     
@@ -350,9 +350,9 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     XtSetArg(xargs[n], XmNindicatorType, XmONE_OF_MANY_ROUND); n++;
     XmString label = NULL;
     if(args->label) {
@@ -363,7 +363,7 @@
     char *name = args->name ? (char*)args->name : "button";
     Widget button = XmCreateToggleButton(parent, name, xargs, n);
     XtManageChild(button);
-    ctn->add(ctn, button);
+    ui_container_add(ctn, button);
     
     ui_set_widget_groups(obj->ctx, button, args->groups);
     
--- a/ui/motif/container.c	Mon Oct 06 13:15:09 2025 +0200
+++ b/ui/motif/container.c	Mon Oct 06 16:50:42 2025 +0200
@@ -33,6 +33,7 @@
 #include "container.h"
 #include "../common/context.h"
 #include "../common/object.h"
+#include "../common/container.h"
 
 #include <cx/array_list.h>
 
@@ -40,12 +41,26 @@
 
 
 
+Widget ui_container_prepare(UiContainerPrivate *container, UiLayout *layout, Arg *args, int *n) {
+    if(layout->margin != 0) {
+        layout->margin_left = layout->margin;
+        layout->margin_right = layout->margin;
+        layout->margin_top = layout->margin;
+        layout->margin_bottom = layout->margin;
+    }
+    return container->prepare(container, layout, args, n);
+}
+
+void ui_container_add(UiContainerPrivate *container, Widget widget) {
+    container->add(container, widget);
+}
+
 
 /* ---------------------------- Box Container ---------------------------- */
 
 static UIWIDGET box_create(UiObject *obj, UiContainerArgs *args, UiBoxOrientation orientation) { 
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
     Arg xargs[16];
     int n = 0;
@@ -56,7 +71,7 @@
         //XtSetArg(xargs[n], gridColumnSpacing, args->spacing); n++;
     }
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     Widget grid = XtCreateManagedWidget(args->name ? args->name : "boxcontainer", gridClass, parent, xargs, n);
     ctn->add(ctn, grid);
     
@@ -86,43 +101,42 @@
     return (UiContainerX*)ctn;
 }
 
-static Widget ui_box_container_prepare(UiBoxContainer *box, Arg *args, int *n) {
+static Widget ui_box_container_prepare(UiBoxContainer *box, UiLayout *layout, Arg *args, int *n) {
     int a = *n;
     box->n++;
     return box->container.widget;
 }
 
-Widget ui_vbox_prepare(UiContainerPrivate *ctn, Arg *args, int *n) {
+Widget ui_vbox_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n) {
     UiBoxContainer *box = (UiBoxContainer*)ctn;
     int a = *n;
     XtSetArg(args[a], gridRow, box->n); a++;
-    if(box->container.layout.fill == UI_ON) {
+    if(layout->fill) {
         XtSetArg(args[a], gridVExpand, TRUE); a++;
         XtSetArg(args[a], gridVFill, TRUE); a++;
     }
     XtSetArg(args[a], gridHExpand, TRUE); a++;
     XtSetArg(args[a], gridHFill, TRUE); a++;
     *n = a;
-    return ui_box_container_prepare(box, args, n);
+    return ui_box_container_prepare(box, layout, args, n);
 }
 
-Widget ui_hbox_prepare(UiContainerPrivate *ctn, Arg *args, int *n) {
+Widget ui_hbox_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n) {
     UiBoxContainer *box = (UiBoxContainer*)ctn;
     int a = *n;
     XtSetArg(args[a], gridColumn, box->n); a++;
-    if(box->container.layout.fill == UI_ON) {
+    if(layout->fill) {
         XtSetArg(args[a], gridHExpand, TRUE); a++;
         XtSetArg(args[a], gridHFill, TRUE); a++;
     }
     XtSetArg(args[a], gridVExpand, TRUE); a++;
     XtSetArg(args[a], gridVFill, TRUE); a++;
     *n = a;
-    return ui_box_container_prepare(box, args, n);
+    return ui_box_container_prepare(box, layout, args, n);
 }
 
 void ui_box_container_add(UiContainerPrivate *ctn, Widget widget) {
-    ui_reset_layout(ctn->layout);
-    
+        
 }
 
 
@@ -134,14 +148,14 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, 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);
+    ui_container_add(ctn, grid);
     
     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);
@@ -171,9 +185,9 @@
     return (UiContainerX*)ctn;
 }
 
-Widget ui_grid_container_prepare(UiContainerPrivate *ctn, Arg *args, int *n) {
+Widget ui_grid_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n) {
     UiGridContainer *grid = (UiGridContainer*)ctn;
-    if(ctn->layout.newline) {
+    if(ctn->container.newline) {
         grid->y++;
         grid->x = 0;
     }
@@ -181,61 +195,25 @@
     int a = *n;
     XtSetArg(args[a], gridColumn, grid->x); a++;
     XtSetArg(args[a], gridRow, grid->y); a++;
-    if(ctn->layout.colspan > 0) {
-        XtSetArg(args[a], gridColspan, ctn->layout.colspan); a++;
-    }
-    if(ctn->layout.rowspan > 0) {
-        XtSetArg(args[a], gridRowspan, ctn->layout.rowspan); a++;
+    if(layout->colspan > 0) {
+        XtSetArg(args[a], gridColspan, layout->colspan); a++;
     }
-    
-    int hexpand = FALSE;
-    int vexpand = FALSE;
-    int hfill = FALSE;
-    int vfill = FALSE;
-    if(!ctn->layout.override_defaults) {
-        if(grid->def_hexpand) {
-            hexpand = TRUE;
-            hfill = TRUE;
-        } else if(grid->def_hfill) {
-            hfill = TRUE;
-        }
-        if(grid->def_vexpand) {
-            vexpand = TRUE;
-            vfill = TRUE;
-        } else if(grid->def_vfill) {
-            vfill = TRUE;
-        }
+    if(layout->rowspan > 0) {
+        XtSetArg(args[a], gridRowspan, layout->rowspan); a++;
     }
     
-    if(ctn->layout.hexpand) {
-        hexpand = TRUE;
-        hfill = TRUE;
-    } else if(ctn->layout.hfill) {
-        hfill = TRUE;
-    }
-    if(ctn->layout.vexpand) {
-        vexpand = TRUE;
-        vfill = TRUE;
-    } else if(ctn->layout.vfill) {
-        vfill = TRUE;
-    }
-    if(ctn->layout.fill == UI_ON) {
-        hexpand = TRUE;
-        vexpand = TRUE;
-        hfill = TRUE;
-        vfill = TRUE;
-    }
+    uic_layout_setup_expand_fill(layout, grid->def_hexpand, grid->def_vexpand, grid->def_hfill, grid->def_vfill);
     
-    if(hfill) {
+    if(layout->hfill) {
         XtSetArg(args[a], gridHFill, TRUE); a++;
     }
-    if(vfill) {
+    if(layout->vfill) {
         XtSetArg(args[a], gridVFill, TRUE); a++;
     }
-    if(hexpand) {
+    if(layout->hexpand) {
         XtSetArg(args[a], gridHExpand, TRUE); a++;
     }
-    if(vexpand) {
+    if(layout->vexpand) {
         XtSetArg(args[a], gridVExpand, TRUE); a++;
     }
     
@@ -246,7 +224,7 @@
 void ui_grid_container_add(UiContainerPrivate *ctn, Widget widget) {
     UiGridContainer *grid = (UiGridContainer*)ctn;
     grid->x++;
-    ui_reset_layout(ctn->layout);
+    grid->container.container.newline = FALSE;
 }
 
 
@@ -313,7 +291,7 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
     // create widgets
     // form
@@ -323,9 +301,10 @@
     memset(tabview, 0, sizeof(UiMotifTabView));
     char *name = args->name ? (char*)args->name : "tabview";
     XtSetArg(xargs[n], XmNuserData, tabview); n++;
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     Widget form = XmCreateForm(parent, name, xargs, n);
     XtManageChild(form);
+    ui_container_add(ctn, parent);
     
     n = 0;
     XtSetArg(xargs[n], XmNleftAttachment, XmATTACH_FORM); n++;
@@ -569,7 +548,7 @@
     XtManageChild(tab->child);
 }
 
-Widget ui_tabview_container_prepare(UiContainerPrivate *ctn, Arg *args, int *n) {
+Widget ui_tabview_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n) {
     UiTabViewContainer *ct = (UiTabViewContainer*)ctn;
     UiMotifTabView *tabview = ct->tabview;
     int a = *n;
@@ -583,12 +562,12 @@
 }
 
 void ui_tabview_container_add(UiContainerPrivate *ctn, Widget widget) {
-    ui_reset_layout(ctn->layout);
+    
 }
 
 /* -------------------- ScrolledWindow -------------------- */
 
-Widget ui_scrolledwindow_prepare(UiContainerPrivate *ctn, Arg *args, int *n) {
+Widget ui_scrolledwindow_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n) {
     return ctn->widget;
 }
 
@@ -607,16 +586,16 @@
 
 UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs *args) {
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
     Arg xargs[16];
     int n = 0;
     
     XtSetArg(xargs[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     Widget scrolledwindow = XmCreateScrolledWindow(parent, "scrolledwindow", xargs, n);
-    ctn->add(ctn, scrolledwindow);
+    ui_container_add(ctn, scrolledwindow);
     
     UiContainerX *container = ui_scrolledwindow_container(obj, scrolledwindow);
     uic_object_push_container(obj, container);
@@ -640,15 +619,3 @@
     return 1;
 }
 
-
-/*
- * -------------------- Layout Functions --------------------
- * 
- * functions for setting layout attributes for the current container
- *
- */
-
-void ui_newline(UiObject *obj) {
-    UiContainerPrivate *ct = ui_obj_container(obj);
-    ct->layout.newline = TRUE;
-}
--- a/ui/motif/container.h	Mon Oct 06 13:15:09 2025 +0200
+++ b/ui/motif/container.h	Mon Oct 06 16:50:42 2025 +0200
@@ -62,21 +62,6 @@
 
 #define ui_obj_container(obj) (UiContainerPrivate*)obj->container_end
     
-typedef struct UiLayout UiLayout;
-
-struct UiLayout {
-    UiBool       fill;
-    UiBool       newline;
-    char         *label;
-    UiBool       hexpand;
-    UiBool       vexpand;
-    UiBool       hfill;
-    UiBool       vfill;
-    UiBool       override_defaults;
-    int          width;
-    int          colspan;
-    int          rowspan;
-};
 
 enum UiBoxOrientation {
     UI_BOX_VERTICAL = 0,
@@ -88,11 +73,10 @@
 
 struct UiContainerPrivate {
     UiContainerX    container;
-    Widget          (*prepare)(UiContainerPrivate*, Arg *, int*);
+    Widget          (*prepare)(UiContainerPrivate*, UiLayout *layout, Arg *, int*);
     void            (*add)(UiContainerPrivate*, Widget);
     Widget          widget;
     UiContainerType type;
-    UiLayout        layout;
 };
 
 typedef struct UiBoxContainer {
@@ -143,6 +127,9 @@
     UiMotifTabView *tabview;
 } UiTabViewContainer;
 
+Widget ui_container_prepare(UiContainerPrivate *container, UiLayout *layout, Arg *args, int *n);
+void ui_container_add(UiContainerPrivate *container, Widget widget);
+
 void ui_motif_tabview_select(UiMotifTabView *tabview, int tab);
 void ui_motif_tabview_add_tab(UiMotifTabView *tabview, int index, const char *name, Widget child);
 void ui_motif_tabview_remove(UiMotifTabView *tabview, int index);
@@ -150,12 +137,12 @@
 int64_t ui_tabview_get(UiInteger *i);
 void ui_tabview_set(UiInteger *i, int64_t value);
 
-Widget ui_tabview_container_prepare(UiContainerPrivate *ctn, Arg *args, int *n);
+Widget ui_tabview_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n);
 void ui_tabview_container_add(UiContainerPrivate *ctn, Widget widget);
 
 UiContainerX* ui_box_container(UiObject *obj, Widget grid, UiBoxOrientation orientation);
-Widget ui_vbox_prepare(UiContainerPrivate *ctn, Arg *args, int *n);
-Widget ui_hbox_prepare(UiContainerPrivate *ctn, Arg *args, int *n);
+Widget ui_vbox_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n);
+Widget ui_hbox_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n);
 void ui_box_container_add(UiContainerPrivate *ctn, Widget widget);
 
 
@@ -166,7 +153,7 @@
         UiBool def_vexpand,
         UiBool def_hfill,
         UiBool def_vfill);
-Widget ui_grid_container_prepare(UiContainerPrivate *ctn, Arg *args, int *n);
+Widget ui_grid_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n);
 void ui_grid_container_add(UiContainerPrivate *ctn, Widget widget);
 
 #ifdef	__cplusplus
--- a/ui/motif/label.c	Mon Oct 06 13:15:09 2025 +0200
+++ b/ui/motif/label.c	Mon Oct 06 16:50:42 2025 +0200
@@ -41,9 +41,9 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     
     XtSetArg(xargs[n], XmNalignment, align); n++;
     XmString label = NULL;
@@ -55,7 +55,7 @@
     char *name = args->name ? (char*)args->name : "label";
     Widget w = XmCreateLabel(parent, name, xargs, n);
     XtManageChild(w);
-    ctn->add(ctn, w);
+    ui_container_add(ctn, w);
       
     XmStringFree(label);
     return w;
@@ -108,12 +108,13 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     
     char *name = args->name ? (char*)args->name : "progressbar";
     Widget frame = XmCreateFrame(parent, name, xargs, n);
+    ui_container_add(ctn, frame);
     
     // create a button and get some informations about the height, shadow, highlight, ....
     // we want the frame to have the same dimensions as a normal button
@@ -191,9 +192,9 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
      
     XmString label = XmStringCreateSimple("");
     XtSetArg(xargs[n], XmNlabelString, label); n++;
@@ -203,7 +204,7 @@
     char *name = args->name ? (char*)args->name : "progresss_spinner";
     Widget w = XmCreateLabel(parent, name, xargs, n);
     XtManageChild(w);
-    ctn->add(ctn, w);
+    ui_container_add(ctn, w);
     
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
     if(var) {
--- a/ui/motif/list.c	Mon Oct 06 13:15:09 2025 +0200
+++ b/ui/motif/list.c	Mon Oct 06 16:50:42 2025 +0200
@@ -55,7 +55,7 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
     if(args->multiselection) {
         XtSetArg(xargs[n], XmNselectionPolicy, XmEXTENDED_SELECT); n++;
@@ -64,9 +64,10 @@
     }
     
     char *name = args->name ? (char*)args->name : "listview";
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     Widget widget = XmCreateScrolledList(parent, name, xargs, n);
     XtManageChild(widget);
+    ui_container_add(ctn, widget);
     
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
     
@@ -264,12 +265,13 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
     char *name = args->name ? (char*)args->name : "dropdown";
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     Widget widget = XmCreateDropDownList(parent, name, xargs, n);
     XtManageChild(widget);
+    ui_container_add(ctn, widget);
     
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
     
--- a/ui/motif/text.c	Mon Oct 06 13:15:09 2025 +0200
+++ b/ui/motif/text.c	Mon Oct 06 16:50:42 2025 +0200
@@ -45,13 +45,14 @@
     XtSetArg(xargs[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     char *name = args->name ? (char*)args->name : "textarea";
     XtSetArg(xargs[n], XmNwidth, 100); n++;
     Widget widget = XmCreateScrolledText(parent, name, xargs, n);
     XtManageChild(widget);
+    ui_container_add(ctn, widget);
     
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_TEXT);
     
@@ -396,12 +397,13 @@
     }
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     char *name = args->name ? (char*)args->name : "textfield";
     Widget textfield = XmCreateTextField(parent, name, xargs, n);
     XtManageChild(textfield);
+    ui_container_add(ctn, textfield);
     
     ui_set_widget_groups(obj->ctx, textfield, args->groups);
     
@@ -971,9 +973,9 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     // TODO: name
     
 
@@ -987,7 +989,7 @@
     
     
     XtManageChild(pathbar->widget);
-    ctn->add(ctn, pathbar->widget);
+    ui_container_add(ctn, pathbar->widget);
     
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING);
     if (var) {
--- a/ui/motif/widget.c	Mon Oct 06 13:15:09 2025 +0200
+++ b/ui/motif/widget.c	Mon Oct 06 16:50:42 2025 +0200
@@ -42,12 +42,12 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     Widget widget = create_widget(obj, args, userdata, parent, xargs, n);
     XtManageChild(widget);
-    ctn->add(ctn, widget);
+    ui_container_add(ctn, widget);
     
     return widget;
 }
@@ -58,13 +58,13 @@
     int n = 0;
     
     UiContainerPrivate *ctn = ui_obj_container(obj);
-    UI_APPLY_LAYOUT(ctn->layout, args);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     
     char *name = args->name ? (char*)args->name : "separator";
-    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
     Widget widget = XmCreateSeparator(parent, name, xargs, n);
     XtManageChild(widget);
-    ctn->add(ctn, widget);
+    ui_container_add(ctn, widget);
     
     return widget;
 }

mercurial