pass Args structs per pointer (GTK)

Thu, 29 May 2025 12:03:32 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 29 May 2025 12:03:32 +0200
changeset 594
fc854e0ab924
parent 593
7061c9cf3b52
child 595
e62047c59658

pass Args structs per pointer (GTK)

application/main.c file | annotate | diff | comparison | revisions
ui/common/document.c file | annotate | diff | comparison | revisions
ui/common/menu.c file | annotate | diff | comparison | revisions
ui/common/toolbar.c file | annotate | diff | comparison | revisions
ui/gtk/button.c file | annotate | diff | comparison | revisions
ui/gtk/container.c file | annotate | diff | comparison | revisions
ui/gtk/container.h file | annotate | diff | comparison | revisions
ui/gtk/display.c file | annotate | diff | comparison | revisions
ui/gtk/entry.c file | annotate | diff | comparison | revisions
ui/gtk/image.c file | annotate | diff | comparison | revisions
ui/gtk/list.c file | annotate | diff | comparison | revisions
ui/gtk/text.c file | annotate | diff | comparison | revisions
ui/gtk/webview.c file | annotate | diff | comparison | revisions
ui/ui/button.h file | annotate | diff | comparison | revisions
ui/ui/container.h file | annotate | diff | comparison | revisions
ui/ui/display.h file | annotate | diff | comparison | revisions
ui/ui/entry.h file | annotate | diff | comparison | revisions
ui/ui/image.h file | annotate | diff | comparison | revisions
ui/ui/menu.h file | annotate | diff | comparison | revisions
ui/ui/text.h file | annotate | diff | comparison | revisions
ui/ui/toolbar.h file | annotate | diff | comparison | revisions
ui/ui/tree.h file | annotate | diff | comparison | revisions
ui/ui/webview.h file | annotate | diff | comparison | revisions
--- a/application/main.c	Thu May 15 12:55:54 2025 +0200
+++ b/application/main.c	Thu May 29 12:03:32 2025 +0200
@@ -608,7 +608,7 @@
         }
         ui_tab(obj, "Tab 3") {
             UiTabViewArgs args = {0};
-            UI_CTN(obj, tabview=ui_tabview_create(obj, args)) {
+            UI_CTN(obj, tabview=ui_tabview_create(obj, &args)) {
                 UiObject *tab1 = ui_tabview_add(tabview, "Sub 1", -1);
                 ui_button(tab1, .label = "Button 1");
 
--- a/ui/common/document.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/common/document.c	Thu May 29 12:03:32 2025 +0200
@@ -83,7 +83,7 @@
 }
 
 void* ui_document_new(size_t size) {
-    CxMempool *mp = cxMempoolCreate(256, NULL);
+    CxMempool *mp = cxMempoolCreateSimple(256);
     const CxAllocator *a = mp->allocator;
     UiContext *ctx = uic_context(NULL, mp);
     
--- a/ui/common/menu.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/common/menu.c	Thu May 29 12:03:32 2025 +0200
@@ -125,19 +125,19 @@
 
 
 
-void ui_menuitem_create(UiMenuItemArgs args) {
+void ui_menuitem_create(UiMenuItemArgs *args) {
     UiMenuItem* item = malloc(sizeof(UiMenuItem));
     mitem_set_id(&item->item);
     item->item.prev = NULL;
     item->item.next = NULL;
     item->item.type = UI_MENU_ITEM;
 
-    item->label = nl_strdup(args.label);
-    item->stockid = nl_strdup(args.stockid);
-    item->icon = nl_strdup(args.icon);
-    item->userdata = args.onclickdata;
-    item->callback = args.onclick;
-    item->groups = uic_copy_groups(args.groups, &item->ngroups);
+    item->label = nl_strdup(args->label);
+    item->stockid = nl_strdup(args->stockid);
+    item->icon = nl_strdup(args->icon);
+    item->userdata = args->onclickdata;
+    item->callback = args->onclick;
+    item->groups = uic_copy_groups(args->groups, &item->ngroups);
 
     add_item((UiMenuItemI*)item);
 }
@@ -152,79 +152,79 @@
     add_item((UiMenuItemI*)item);
 }
 
-void ui_menu_toggleitem_create(UiMenuToggleItemArgs args) {
+void ui_menu_toggleitem_create(UiMenuToggleItemArgs *args) {
     UiMenuCheckItem *item = malloc(sizeof(UiMenuCheckItem));
     mitem_set_id(&item->item);
     item->item.prev = NULL;
     item->item.next = NULL;
     item->item.type = UI_MENU_CHECK_ITEM;
 
-    item->label = nl_strdup(args.label);
-    item->stockid = nl_strdup(args.stockid);
-    item->icon = nl_strdup(args.icon);
-    item->varname = nl_strdup(args.varname);
-    item->userdata = args.onchangedata;
-    item->callback = args.onchange;
-    item->groups = uic_copy_groups(args.groups, &item->ngroups);
+    item->label = nl_strdup(args->label);
+    item->stockid = nl_strdup(args->stockid);
+    item->icon = nl_strdup(args->icon);
+    item->varname = nl_strdup(args->varname);
+    item->userdata = args->onchangedata;
+    item->callback = args->onchange;
+    item->groups = uic_copy_groups(args->groups, &item->ngroups);
     
     add_item((UiMenuItemI*)item);
 }
 
-void ui_menu_radioitem_create(UiMenuToggleItemArgs args) {
+void ui_menu_radioitem_create(UiMenuToggleItemArgs *args) {
     UiMenuCheckItem* item = malloc(sizeof(UiMenuCheckItem));
     mitem_set_id(&item->item);
     item->item.prev = NULL;
     item->item.next = NULL;
     item->item.type = UI_MENU_RADIO_ITEM;
 
-    item->label = nl_strdup(args.label);
-    item->stockid = nl_strdup(args.stockid);
-    item->icon = nl_strdup(args.icon);
-    item->varname = nl_strdup(args.varname);
-    item->userdata = args.onchangedata;
-    item->callback = args.onchange;
-    item->groups = uic_copy_groups(args.groups, &item->ngroups);
+    item->label = nl_strdup(args->label);
+    item->stockid = nl_strdup(args->stockid);
+    item->icon = nl_strdup(args->icon);
+    item->varname = nl_strdup(args->varname);
+    item->userdata = args->onchangedata;
+    item->callback = args->onchange;
+    item->groups = uic_copy_groups(args->groups, &item->ngroups);
 
     add_item((UiMenuItemI*)item);
 }
 
-void ui_menu_itemlist_create(UiMenuItemListArgs args) {
+void ui_menu_itemlist_create(UiMenuItemListArgs *args) {
     UiMenuItemList*item = malloc(sizeof(UiMenuItemList));
     mitem_set_id(&item->item);
     item->item.prev = NULL;
     item->item.next = NULL;
     item->item.type = UI_MENU_ITEM_LIST;
-    item->getvalue = args.getvalue;
-    item->callback = args.onselect;
-    item->userdata = args.onselectdata;
-    item->varname = nl_strdup(args.varname);
-    item->addseparator = args.addseparator;
+    item->getvalue = args->getvalue;
+    item->callback = args->onselect;
+    item->userdata = args->onselectdata;
+    item->varname = nl_strdup(args->varname);
+    item->addseparator = args->addseparator;
     
     add_item((UiMenuItemI*)item);
 }
 
-void ui_menu_checkitemlist_create(UiMenuItemListArgs args) {
+void ui_menu_checkitemlist_create(UiMenuItemListArgs *args) {
     UiMenuItemList* item = malloc(sizeof(UiMenuItemList));
     mitem_set_id(&item->item);
     item->item.prev = NULL;
     item->item.next = NULL;
     item->item.type = UI_MENU_CHECKITEM_LIST;
-    item->callback = args.onselect;
-    item->userdata = args.onselectdata;
-    item->varname = nl_strdup(args.varname);
+    item->callback = args->onselect;
+    item->userdata = args->onselectdata;
+    item->varname = nl_strdup(args->varname);
 
     add_item((UiMenuItemI*)item);
 }
 
-void ui_menu_radioitemlist_create(UiMenuItemListArgs args) {
+void ui_menu_radioitemlist_create(UiMenuItemListArgs *args) {
     UiMenuItemList* item = malloc(sizeof(UiMenuItemList));
     mitem_set_id(&item->item);
     item->item.prev = NULL;
     item->item.next = NULL;
     item->item.type = UI_MENU_RADIOITEM_LIST;
-    item->callback = args.onselect;
-    item->userdata = args.onselectdata;
-    item->varname = nl_strdup(args.varname);
+    item->callback = args->onselect;
+    item->userdata = args->onselectdata;
+    item->varname = nl_strdup(args->varname);
 
     add_item((UiMenuItemI*)item);
 }
--- a/ui/common/toolbar.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/common/toolbar.c	Thu May 29 12:03:32 2025 +0200
@@ -49,18 +49,18 @@
     return str ? strdup(str) : NULL;
 }
 
-static UiToolbarItemArgs itemargs_copy(UiToolbarItemArgs args, size_t *ngroups) {
+static UiToolbarItemArgs itemargs_copy(UiToolbarItemArgs *args, size_t *ngroups) {
     UiToolbarItemArgs newargs;
-    newargs.label = nl_strdup(args.label);
-    newargs.stockid = nl_strdup(args.stockid);
-    newargs.icon = nl_strdup(args.icon);
-    newargs.onclick = args.onclick;
-    newargs.onclickdata = args.onclickdata;
-    newargs.groups = uic_copy_groups(args.groups, ngroups);
+    newargs.label = nl_strdup(args->label);
+    newargs.stockid = nl_strdup(args->stockid);
+    newargs.icon = nl_strdup(args->icon);
+    newargs.onclick = args->onclick;
+    newargs.onclickdata = args->onclickdata;
+    newargs.groups = uic_copy_groups(args->groups, ngroups);
     return newargs;
 }
 
-void ui_toolbar_item_create(const char* name, UiToolbarItemArgs args) {
+void ui_toolbar_item_create(const char* name, UiToolbarItemArgs *args) {
     UiToolbarItem* item = malloc(sizeof(UiToolbarItem));
     item->item.type = UI_TOOLBAR_ITEM;
     item->args = itemargs_copy(args, &item->ngroups);
@@ -68,34 +68,34 @@
 }
 
 
-static UiToolbarToggleItemArgs toggleitemargs_copy(UiToolbarToggleItemArgs args, size_t *ngroups) {
+static UiToolbarToggleItemArgs toggleitemargs_copy(UiToolbarToggleItemArgs *args, size_t *ngroups) {
     UiToolbarToggleItemArgs newargs;
-    newargs.label = nl_strdup(args.label);
-    newargs.stockid = nl_strdup(args.stockid);
-    newargs.icon = nl_strdup(args.icon);
-    newargs.varname = nl_strdup(args.varname);
-    newargs.onchange = args.onchange;
-    newargs.onchangedata = args.onchangedata;
-    newargs.groups = uic_copy_groups(args.groups, ngroups);
+    newargs.label = nl_strdup(args->label);
+    newargs.stockid = nl_strdup(args->stockid);
+    newargs.icon = nl_strdup(args->icon);
+    newargs.varname = nl_strdup(args->varname);
+    newargs.onchange = args->onchange;
+    newargs.onchangedata = args->onchangedata;
+    newargs.groups = uic_copy_groups(args->groups, ngroups);
     return newargs;
 }
 
-void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs args) {
+void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs *args) {
     UiToolbarToggleItem* item = malloc(sizeof(UiToolbarToggleItem));
     item->item.type = UI_TOOLBAR_TOGGLEITEM;
     item->args = toggleitemargs_copy(args, &item->ngroups);
     cxMapPut(toolbar_items, name, item);
 }
 
-static UiToolbarMenuArgs menuargs_copy(UiToolbarMenuArgs args) {
+static UiToolbarMenuArgs menuargs_copy(UiToolbarMenuArgs *args) {
     UiToolbarMenuArgs newargs;
-    newargs.label = nl_strdup(args.label);
-    newargs.stockid = nl_strdup(args.stockid);
-    newargs.icon = nl_strdup(args.icon);
+    newargs.label = nl_strdup(args->label);
+    newargs.stockid = nl_strdup(args->stockid);
+    newargs.icon = nl_strdup(args->icon);
     return newargs;
 }
 
-UIEXPORT void ui_toolbar_menu_create(const char* name, UiToolbarMenuArgs args) {
+UIEXPORT void ui_toolbar_menu_create(const char* name, UiToolbarMenuArgs *args) {
     UiToolbarMenuItem* item = malloc(sizeof(UiToolbarMenuItem));
     item->item.type = UI_TOOLBAR_MENU;
     memset(&item->menu, 0, sizeof(UiMenu));
--- a/ui/gtk/button.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/gtk/button.c	Thu May 29 12:03:32 2025 +0200
@@ -96,12 +96,12 @@
     return button;
 }
 
-UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs args) {
+UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) {
     UiObject* current = uic_current_obj(obj);
-    GtkWidget *button = ui_create_button(obj, args.label, args.icon, args.onclick, args.onclickdata, 0, FALSE);
-    ui_set_name_and_style(button, args.name, args.style_class);
-    ui_set_widget_groups(obj->ctx, button, args.groups);
-    UI_APPLY_LAYOUT1(current, args);
+    GtkWidget *button = ui_create_button(obj, args->label, args->icon, args->onclick, args->onclickdata, 0, FALSE);
+    ui_set_name_and_style(button, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, button, args->groups);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, button, FALSE);
     return button;
 }
@@ -274,29 +274,29 @@
     }
 }
 
-static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleArgs args) {
+static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     ui_setup_togglebutton(
             obj,
             widget,
-            args.label,
-            args.icon,
-            args.varname,
-            args.value,
-            args.onchange,
-            args.onchangedata,
-            args.enable_group);
-    ui_set_name_and_style(widget, args.name, args.style_class);
-    ui_set_widget_groups(obj->ctx, widget, args.groups);
+            args->label,
+            args->icon,
+            args->varname,
+            args->value,
+            args->onchange,
+            args->onchangedata,
+            args->enable_group);
+    ui_set_name_and_style(widget, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, widget, args->groups);
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, widget, FALSE);
     
     return widget;
 }
 
-UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) {
+UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) {
     return togglebutton_create(obj, gtk_toggle_button_new(), args);
 }
 
@@ -333,39 +333,39 @@
     }
 }
 
-UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) {
+UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
-    GtkWidget *widget = gtk_check_button_new_with_label(args.label); 
+    GtkWidget *widget = gtk_check_button_new_with_label(args->label); 
     ui_bind_togglebutton(
             obj,
             widget,
             ui_check_button_get,
             ui_check_button_set,
-            args.varname,
-            args.value,
+            args->varname,
+            args->value,
             (ui_toggled_func)ui_checkbox_callback,
-            args.onchange,
-            args.onchangedata,
+            args->onchange,
+            args->onchangedata,
             (ui_toggled_func)ui_checkbox_enable_state,
-            args.enable_group);
+            args->enable_group);
     
-    ui_set_name_and_style(widget, args.name, args.style_class);
-    ui_set_widget_groups(obj->ctx, widget, args.groups);
+    ui_set_name_and_style(widget, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, widget, args->groups);
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, widget, FALSE);
     
     return widget;
 }
 
 #else
-UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) {
+UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) {
     return togglebutton_create(obj, gtk_check_button_new(), args);
 }
 #endif
 
-UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) {
+UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) {
 #ifdef UI_GTK3
     return NULL; // TODO
 #else
@@ -415,13 +415,13 @@
     free(data);
 }
 
-UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs args) {
+UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     GSList *rg = NULL;
     UiInteger *rgroup;
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_INTEGER);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER);
     
     UiBool first = FALSE;
     if(var) {
@@ -432,9 +432,9 @@
         }
     }
     
-    GtkWidget *rbutton = RADIOBUTTON_NEW(rg, args.label); 
-    ui_set_name_and_style(rbutton, args.name, args.style_class);
-    ui_set_widget_groups(obj->ctx, rbutton, args.groups);
+    GtkWidget *rbutton = RADIOBUTTON_NEW(rg, args->label); 
+    ui_set_name_and_style(rbutton, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, rbutton, args->groups);
     if(rgroup) {
 #if GTK_MAJOR_VERSION >= 4
         if(rg) {
@@ -476,11 +476,11 @@
                 rbdata);
     }
     
-    if(args.onchange) {
+    if(args->onchange) {
         UiEventData *event = malloc(sizeof(UiEventData));
         event->obj = obj;
-        event->userdata = args.onchangedata;
-        event->callback = args.onchange;
+        event->userdata = args->onchangedata;
+        event->callback = args->onchange;
         event->value = 0;
         event->customdata = NULL;
         
@@ -496,7 +496,7 @@
                 event);
     }
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, rbutton, FALSE);
     
     return rbutton;
--- a/ui/gtk/container.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/gtk/container.c	Thu May 29 12:03:32 2025 +0200
@@ -420,14 +420,14 @@
     return ret;
 }
 
-UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs args, UiSubContainerType type) {
+UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs *args, UiSubContainerType type) {
     UiObject *current = uic_current_obj(obj);
     UiContainer *ct = current->container;
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     
-    GtkWidget *box = type == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args.spacing) : ui_gtk_hbox_new(args.spacing);
-    ui_set_name_and_style(box, args.name, args.style_class);
-    GtkWidget *widget = args.margin > 0 ? ui_box_set_margin(box, args.margin) : box;
+    GtkWidget *box = type == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing);
+    ui_set_name_and_style(box, args->name, args->style_class);
+    GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box;
     ct->add(ct, widget, TRUE);
     
     UiObject *newobj = uic_object_new(obj, box);
@@ -437,11 +437,11 @@
     return widget;
 }
 
-UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) {
+UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args) {
     return ui_box_create(obj, args, UI_CONTAINER_VBOX);
 }
 
-UIEXPORT UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) {
+UIEXPORT UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) {
     return ui_box_create(obj, args, UI_CONTAINER_HBOX);
 }
 
@@ -458,30 +458,30 @@
     return grid;
 }
 
-UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) {
+UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) {
     UiObject* current = uic_current_obj(obj);
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     GtkWidget *widget;
     
-    GtkWidget *grid = ui_create_grid_widget(args.columnspacing, args.rowspacing);
-    ui_set_name_and_style(grid, args.name, args.style_class);
-    widget = ui_box_set_margin(grid, args.margin);
+    GtkWidget *grid = ui_create_grid_widget(args->columnspacing, args->rowspacing);
+    ui_set_name_and_style(grid, args->name, args->style_class);
+    widget = ui_box_set_margin(grid, args->margin);
     current->container->add(current->container, widget, TRUE);
     
     UiObject *newobj = uic_object_new(obj, grid);
-    newobj->container = ui_grid_container(obj, grid, args.def_hexpand, args.def_vexpand, args.def_hfill, args.def_vfill);
+    newobj->container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill);
     uic_obj_add(obj, newobj);
     
     return widget;
 }
 
-UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs args) {
+UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args) {
     UiObject* current = uic_current_obj(obj);
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     
-    GtkWidget *frame = gtk_frame_new(args.label);
+    GtkWidget *frame = gtk_frame_new(args->label);
     UiObject *newobj = uic_object_new(obj, frame);
-    GtkWidget *sub = ui_subcontainer_create(args.subcontainer, newobj, args.spacing, args.columnspacing, args.rowspacing, args.margin);
+    GtkWidget *sub = ui_subcontainer_create(args->subcontainer, newobj, args->spacing, args->columnspacing, args->rowspacing, args->margin);
     if(sub) {
         FRAME_SET_CHILD(frame, sub);
     } else {
@@ -494,14 +494,14 @@
     return frame;
 }
 
-UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs args) {
+UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs *args) {
     UiObject* current = uic_current_obj(obj);
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     
-    GtkWidget *expander = gtk_expander_new(args.label);
-    gtk_expander_set_expanded(GTK_EXPANDER(expander), args.isexpanded);
+    GtkWidget *expander = gtk_expander_new(args->label);
+    gtk_expander_set_expanded(GTK_EXPANDER(expander), args->isexpanded);
     UiObject *newobj = uic_object_new(obj, expander);
-    GtkWidget *sub = ui_subcontainer_create(args.subcontainer, newobj, args.spacing, args.columnspacing, args.rowspacing, args.margin);
+    GtkWidget *sub = ui_subcontainer_create(args->subcontainer, newobj, args->spacing, args->columnspacing, args->rowspacing, args->margin);
     if(sub) {
         EXPANDER_SET_CHILD(expander, sub);
     } else {
@@ -515,17 +515,17 @@
 }
 
 
-UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs args) {
+UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs *args) {
     UiObject* current = uic_current_obj(obj);
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     
     GtkWidget *sw = SCROLLEDWINDOW_NEW();
-    ui_set_name_and_style(sw, args.name, args.style_class);
-    GtkWidget *widget = ui_box_set_margin(sw, args.margin);
+    ui_set_name_and_style(sw, args->name, args->style_class);
+    GtkWidget *widget = ui_box_set_margin(sw, args->margin);
     current->container->add(current->container, widget, TRUE);
     
     UiObject *newobj = uic_object_new(obj, sw);
-    GtkWidget *sub = ui_subcontainer_create(args.subcontainer, newobj, args.spacing, args.columnspacing, args.rowspacing, args.margin);
+    GtkWidget *sub = ui_subcontainer_create(args->subcontainer, newobj, args->spacing, args->columnspacing, args->rowspacing, args->margin);
     if(sub) {
         SCROLLEDWINDOW_SET_CHILD(sw, sub);
     } else {
@@ -692,19 +692,19 @@
 typedef int64_t(*ui_tabview_get_func)(UiInteger*);
 typedef void (*ui_tabview_set_func)(UiInteger*, int64_t);
 
-UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs args) {
+UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs *args) {
     UiGtkTabView *data = malloc(sizeof(UiGtkTabView));
-    data->margin = args.margin;
-    data->spacing = args.spacing;
-    data->columnspacing = args.columnspacing;
-    data->rowspacing = args.rowspacing;
+    data->margin = args->margin;
+    data->spacing = args->spacing;
+    data->columnspacing = args->columnspacing;
+    data->rowspacing = args->rowspacing;
     
     ui_tabview_get_func getfunc = NULL;
     ui_tabview_set_func setfunc = NULL;
     
     GtkWidget *widget = NULL;
     GtkWidget *data_widget = NULL;
-    switch(args.tabview) {
+    switch(args->tabview) {
         case UI_TABVIEW_DOC: {
             // TODO
             break;
@@ -740,7 +740,7 @@
             data->add_tab = ui_notebook_tab_add;
             getfunc = ui_notebook_get;
             setfunc = ui_notebook_set;
-            if(args.tabview == UI_TABVIEW_INVISIBLE) {
+            if(args->tabview == UI_TABVIEW_INVISIBLE) {
                 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(widget), FALSE);
                 gtk_notebook_set_show_border(GTK_NOTEBOOK(widget), FALSE);
             }
@@ -749,8 +749,8 @@
     }
     
     UiObject* current = uic_current_obj(obj);
-    if(args.value || args.varname) {
-        UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_INTEGER);
+    if(args->value || args->varname) {
+        UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER);
         UiInteger *i = var->value;
         i->get = getfunc;
         i->set = setfunc;
@@ -759,9 +759,9 @@
     
     g_object_set_data(G_OBJECT(widget), "ui_tabview", data);
     data->widget = data_widget;
-    data->subcontainer = args.subcontainer;
+    data->subcontainer = args->subcontainer;
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, widget, TRUE);
     
     UiObject *newobj = uic_object_new(obj, widget);
@@ -872,13 +872,13 @@
     hb_set_part(obj, 1);
 }
 
-UIWIDGET ui_headerbar_fallback_create(UiObject *obj, UiHeaderbarArgs args) {
+UIWIDGET ui_headerbar_fallback_create(UiObject *obj, UiHeaderbarArgs *args) {
     UiObject *current = uic_current_obj(obj);
     UiContainer *ct = current->container;
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     
-    GtkWidget *box = ui_gtk_hbox_new(args.alt_spacing);
-    ui_set_name_and_style(box, args.name, args.style_class);
+    GtkWidget *box = ui_gtk_hbox_new(args->alt_spacing);
+    ui_set_name_and_style(box, args->name, args->style_class);
     ct->add(ct, box, FALSE);
     
     UiObject *newobj = uic_object_new(obj, box);
@@ -917,7 +917,7 @@
 
 #if GTK_CHECK_VERSION(3, 10, 0)
 
-UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs args) {
+UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs *args) {
     GtkWidget *headerbar = g_object_get_data(G_OBJECT(obj->widget), "ui_headerbar");
     if(!headerbar) {
         return ui_headerbar_fallback_create(obj, args);
@@ -958,7 +958,7 @@
 
 #else
 
-UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs args) {
+UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs *args) {
     return ui_headerbar_fallback_create(obj, args);  
 }
 
@@ -967,15 +967,15 @@
 /* -------------------- Sidebar -------------------- */
 
 #ifdef UI_LIBADWAITA
-UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs args) {
+UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs *args) {
     GtkWidget *sidebar_toolbar_view = g_object_get_data(G_OBJECT(obj->widget), "ui_sidebar");
     if(!sidebar_toolbar_view) {
         fprintf(stderr, "Error: window is not configured for sidebar\n");
         return NULL;
     }
     
-    GtkWidget *box = ui_gtk_vbox_new(args.spacing);
-    ui_box_set_margin(box, args.margin);
+    GtkWidget *box = ui_gtk_vbox_new(args->spacing);
+    ui_box_set_margin(box, args->margin);
     adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(sidebar_toolbar_view), box);
     
     UiObject *newobj = uic_object_new(obj, box);
@@ -985,11 +985,11 @@
     return box;
 }
 #else
-UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs args) {
+UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs *args) {
     GtkWidget *sidebar_vbox = g_object_get_data(G_OBJECT(obj->widget), "ui_sidebar");
     
-    GtkWidget *box = ui_gtk_vbox_new(args.spacing);
-    ui_box_set_margin(box, args.margin);
+    GtkWidget *box = ui_gtk_vbox_new(args->spacing);
+    ui_box_set_margin(box, args->margin);
     BOX_ADD_EXPAND(sidebar_vbox, box);
     
     UiObject *newobj = uic_object_new(obj, box);
@@ -1019,18 +1019,18 @@
 
 
 
-static UIWIDGET splitpane_create(UiObject *obj, UiOrientation orientation, UiSplitPaneArgs args) {
+static UIWIDGET splitpane_create(UiObject *obj, UiOrientation orientation, UiSplitPaneArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     GtkWidget *pane0 = create_paned(orientation);
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, pane0, TRUE);
     
-    int max = args.max_panes == 0 ? 2 : args.max_panes;
+    int max = args->max_panes == 0 ? 2 : args->max_panes;
     
     UiObject *newobj = uic_object_new(obj, pane0);
-    newobj->container = ui_splitpane_container(obj, pane0, orientation, max, args.initial_position);
+    newobj->container = ui_splitpane_container(obj, pane0, orientation, max, args->initial_position);
     uic_obj_add(obj, newobj);
     
     g_object_set_data(G_OBJECT(pane0), "ui_splitpane", newobj->container);
@@ -1038,11 +1038,11 @@
     return pane0;
 }
 
-UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs args) {
+UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) {
     return splitpane_create(obj, UI_HORIZONTAL, args);
 }
 
-UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs args) {
+UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) {
     return splitpane_create(obj, UI_VERTICAL, args);
 }
 
@@ -1187,33 +1187,33 @@
     free(container);
 }
 
-UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs args) {
+UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs *args) {
     UiObject *current = uic_current_obj(obj);
     UiContainer *ct = current->container;
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     
-    GtkWidget *box = args.container == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args.spacing) : ui_gtk_hbox_new(args.spacing);
-    ui_set_name_and_style(box, args.name, args.style_class);
-    GtkWidget *widget = args.margin > 0 ? ui_box_set_margin(box, args.margin) : box;
+    GtkWidget *box = args->container == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing);
+    ui_set_name_and_style(box, args->name, args->style_class);
+    GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box;
     ct->add(ct, widget, TRUE);
     
     UiGtkItemListContainer *container = malloc(sizeof(UiGtkItemListContainer));
     container->parent = obj;
     container->widget = box;
-    container->container = ui_box_container(current, box, args.container);
-    container->create_ui = args.create_ui;
-    container->userdata = args.userdata;
-    container->subcontainer = args.subcontainer;
+    container->container = ui_box_container(current, box, args->container);
+    container->create_ui = args->create_ui;
+    container->userdata = args->userdata;
+    container->subcontainer = args->subcontainer;
     container->current_items = cxHashMapCreateSimple(CX_STORE_POINTERS);
     container->current_items->collection.advanced_destructor = remove_item;
     container->current_items->collection.destructor_data = container;
-    container->margin = args.sub_margin;
-    container->spacing = args.sub_spacing;
-    container->columnspacing = args.sub_columnspacing;
-    container->rowspacing = args.sub_rowspacing;
+    container->margin = args->sub_margin;
+    container->spacing = args->sub_spacing;
+    container->columnspacing = args->sub_columnspacing;
+    container->rowspacing = args->sub_rowspacing;
     container->remove_items = TRUE;
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_LIST);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_LIST);
     if(var) {
         UiList *list = var->value;
         list->obj = container;
--- a/ui/gtk/container.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/gtk/container.h	Thu May 29 12:03:32 2025 +0200
@@ -173,7 +173,7 @@
 void ui_frame_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
 
 GtkWidget* ui_box_set_margin(GtkWidget *box, int margin);
-UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs args, UiSubContainerType type);
+UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs *args, UiSubContainerType type);
 
 UiContainer* ui_box_container(UiObject *obj, GtkWidget *box, UiSubContainerType type);
 void ui_box_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
--- a/ui/gtk/display.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/gtk/display.c	Thu May 29 12:03:32 2025 +0200
@@ -46,19 +46,19 @@
 #endif
 }
 
-UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs args) {
+UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     const char *css_class = NULL;
     char *markup = NULL;
-    if(args.label) {
+    if(args->label) {
         #if GTK_MAJOR_VERSION < 3
-            switch(args.style) {
+            switch(args->style) {
                 case UI_LABEL_STYLE_DEFAULT: break;
                 case UI_LABEL_STYLE_TITLE: {
-                    cxmutstr m = cx_asprintf("<b>%s</b>", args.label);
+                    cxmutstr m = cx_asprintf("<b>%s</b>", args->label);
                     markup = m.ptr;
-                    args.label = NULL;
+                    args->label = NULL;
                 }
                 case UI_LABEL_STYLE_SUBTITLE: {
                     break;
@@ -68,7 +68,7 @@
                 }
             }
 #       else
-            switch(args.style) {
+            switch(args->style) {
                 case UI_LABEL_STYLE_DEFAULT: break;
                 case UI_LABEL_STYLE_TITLE: {
                     css_class = "ui_label_title";
@@ -87,7 +87,7 @@
     }
 
     
-    GtkWidget *widget = gtk_label_new(args.label);
+    GtkWidget *widget = gtk_label_new(args->label);
     if(markup) {
         gtk_label_set_markup(GTK_LABEL(widget), markup);
         free(markup);
@@ -97,7 +97,7 @@
         WIDGET_ADD_CSS_CLASS(widget, css_class);
     }
     
-    switch(args.align) {
+    switch(args->align) {
         case UI_ALIGN_DEFAULT: break;
         case UI_ALIGN_LEFT: set_alignment(widget, 0, .5); break;
         case UI_ALIGN_RIGHT: set_alignment(widget, 1, .5); break;
@@ -105,7 +105,7 @@
     }
     
 
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING);
     if(var) {
         UiString* value = (UiString*)var->value;
         value->obj = widget;
@@ -113,19 +113,19 @@
         value->set = ui_label_set;
     }
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, widget, FALSE);
     
     return widget;
 }
 
-UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs args) {
-    args.align = UI_ALIGN_LEFT;
+UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs *args) {
+    args->align = UI_ALIGN_LEFT;
     return ui_label_create(obj, args);
 }
 
-UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs args) {
-    args.align = UI_ALIGN_RIGHT;
+UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs *args) {
+    args->align = UI_ALIGN_RIGHT;
     return ui_label_create(obj, args);
 }
 
@@ -174,14 +174,14 @@
     double max;
 } UiProgressBarRange;
 
-UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args) {
+UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     GtkWidget *progressbar = gtk_progress_bar_new();
-    if(args.max > args.min) {
+    if(args->max > args->min) {
         UiProgressBarRange *range = malloc(sizeof(UiProgressBarRange));
-        range->min = args.min;
-        range->max = args.max;
+        range->min = args->min;
+        range->max = args->max;
         g_signal_connect(
                 progressbar,
                 "destroy",
@@ -191,7 +191,7 @@
     }
     
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_DOUBLE);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_DOUBLE);
     if(var && var->value) {
         UiDouble *value = var->value;
         value->get = ui_progressbar_get;
@@ -200,7 +200,7 @@
         ui_progressbar_set(value, value->value);
     }
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, progressbar, FALSE);
     
     return progressbar;
@@ -228,12 +228,12 @@
 
 /* ------------------------- progress spinner ------------------------- */
 
-UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs args) {
+UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     GtkWidget *spinner = gtk_spinner_new();
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_INTEGER);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER);
     if(var && var->value) {
         UiInteger *value = var->value;
         value->get = ui_spinner_get;
@@ -242,7 +242,7 @@
         ui_spinner_set(value, value->value);
     }
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, spinner, FALSE);
     
     return spinner;
--- a/ui/gtk/entry.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/gtk/entry.c	Thu May 29 12:03:32 2025 +0200
@@ -35,24 +35,24 @@
 #include "entry.h"
 
 
-UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs args) {
+UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs *args) {
     double min = 0;
     double max = 1000;
     
     UiObject* current = uic_current_obj(obj);
     
     UiVar *var = NULL;
-    if(args.varname) {
-        var = uic_get_var(obj->ctx, args.varname);
+    if(args->varname) {
+        var = uic_get_var(obj->ctx, args->varname);
     }
     
     if(!var) {
-        if(args.intvalue) {
-            var = uic_widget_var(obj->ctx, current->ctx, args.intvalue, NULL, UI_VAR_INTEGER);
-        } else if(args.doublevalue) {
-            var = uic_widget_var(obj->ctx, current->ctx, args.doublevalue, NULL, UI_VAR_DOUBLE);
-        } else if(args.rangevalue) {
-            var = uic_widget_var(obj->ctx, current->ctx, args.rangevalue, NULL, UI_VAR_RANGE);
+        if(args->intvalue) {
+            var = uic_widget_var(obj->ctx, current->ctx, args->intvalue, NULL, UI_VAR_INTEGER);
+        } else if(args->doublevalue) {
+            var = uic_widget_var(obj->ctx, current->ctx, args->doublevalue, NULL, UI_VAR_DOUBLE);
+        } else if(args->rangevalue) {
+            var = uic_widget_var(obj->ctx, current->ctx, args->rangevalue, NULL, UI_VAR_RANGE);
         }
     }
     
@@ -61,18 +61,18 @@
         min = r->min;
         max = r->max;
     }
-    if(args.step == 0) {
-        args.step = 1;
+    if(args->step == 0) {
+        args->step = 1;
     }
 #ifdef UI_GTK2LEGACY
     if(min == max) {
         max = min + 1;
     }
 #endif
-    GtkWidget *spin = gtk_spin_button_new_with_range(min, max, args.step);
-    ui_set_name_and_style(spin, args.name, args.style_class);
-    ui_set_widget_groups(obj->ctx, spin, args.groups);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), args.digits);
+    GtkWidget *spin = gtk_spin_button_new_with_range(min, max, args->step);
+    ui_set_name_and_style(spin, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, spin, args->groups);
+    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), args->digits);
     UiObserver **obs = NULL;
     if(var) {
         double value = 0;
@@ -115,8 +115,8 @@
     event->obj = obj;
     event->var = var;
     event->observers = obs;
-    event->callback = args.onchange;
-    event->userdata = args.onchangedata;
+    event->callback = args->onchange;
+    event->userdata = args->onchangedata;
 
     g_signal_connect(
             spin,
@@ -129,7 +129,7 @@
             G_CALLBACK(ui_destroy_vardata),
             event);
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, spin, FALSE);
     
     return spin;
--- a/ui/gtk/image.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/gtk/image.c	Thu May 29 12:03:32 2025 +0200
@@ -63,7 +63,7 @@
 
 #endif
 
-UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) {
+UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs *args) {
     UiObject *current = uic_current_obj(obj);
     
     GtkWidget *drawingarea = gtk_drawing_area_new();
@@ -78,10 +78,10 @@
     widget = eventbox;
 #endif
     
-    if(args.scrollarea) {
+    if(args->scrollarea) {
         toplevel = SCROLLEDWINDOW_NEW();
         SCROLLEDWINDOW_SET_CHILD(toplevel, widget);
-        args.adjustwidgetsize = TRUE;
+        args->adjustwidgetsize = TRUE;
     } else {
         toplevel = widget;
     }
@@ -89,29 +89,29 @@
     UiImageViewer *imgviewer = malloc(sizeof(UiImageViewer));
     memset(imgviewer, 0, sizeof(UiImageViewer));
     imgviewer->obj = obj;
-    imgviewer->onbuttonpress = args.onbuttonpress;
-    imgviewer->onbuttonpressdata = args.onbuttonpressdata;
-    imgviewer->onbuttonrelease = args.onbuttonrelease;
-    imgviewer->onbuttonreleasedata = args.onbuttonreleasedata;
-    if(args.image_padding > 0) {
-        imgviewer->padding_left = args.image_padding;
-        imgviewer->padding_right = args.image_padding;
-        imgviewer->padding_top = args.image_padding;
-        imgviewer->padding_bottom = args.image_padding;
+    imgviewer->onbuttonpress = args->onbuttonpress;
+    imgviewer->onbuttonpressdata = args->onbuttonpressdata;
+    imgviewer->onbuttonrelease = args->onbuttonrelease;
+    imgviewer->onbuttonreleasedata = args->onbuttonreleasedata;
+    if(args->image_padding > 0) {
+        imgviewer->padding_left = args->image_padding;
+        imgviewer->padding_right = args->image_padding;
+        imgviewer->padding_top = args->image_padding;
+        imgviewer->padding_bottom = args->image_padding;
     } else {
-        imgviewer->padding_left = args.image_padding_left;
-        imgviewer->padding_right = args.image_padding_right;
-        imgviewer->padding_top = args.image_padding_top;
-        imgviewer->padding_bottom = args.image_padding_bottom;
+        imgviewer->padding_left = args->image_padding_left;
+        imgviewer->padding_right = args->image_padding_right;
+        imgviewer->padding_top = args->image_padding_top;
+        imgviewer->padding_bottom = args->image_padding_bottom;
     }
-    imgviewer->adjustwidgetsize = args.adjustwidgetsize;
-    imgviewer->autoscale = args.autoscale;
-    imgviewer->useradjustable = args.useradjustable;
+    imgviewer->adjustwidgetsize = args->adjustwidgetsize;
+    imgviewer->autoscale = args->autoscale;
+    imgviewer->useradjustable = args->useradjustable;
     imgviewer->zoom_scale = 20;
     
     g_object_set_data_full(G_OBJECT(drawingarea), "uiimageviewer", imgviewer, (GDestroyNotify)imageviewer_destroy);
     
-    UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_GENERIC);
+    UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_GENERIC);
     imgviewer->var = var;
     imgviewer->widget = drawingarea;
     
@@ -136,7 +136,7 @@
             imgviewer,
             NULL);
     
-    if(args.useradjustable) {
+    if(args->useradjustable) {
         gtk_widget_set_focusable(drawingarea, TRUE);
     }
     
@@ -182,12 +182,12 @@
 
 #endif
     
-    if(args.contextmenu) {
-        UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, widget);
+    if(args->contextmenu) {
+        UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, widget);
         ui_widget_set_contextmenu(widget, menu);
     }
        
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, toplevel, TRUE);
     
     return toplevel;
--- a/ui/gtk/list.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/gtk/list.c	Thu May 29 12:03:32 2025 +0200
@@ -189,34 +189,34 @@
     return selection_model;
 }
 
-static UiListView* create_listview(UiObject *obj, UiListArgs args) {
+static UiListView* create_listview(UiObject *obj, UiListArgs *args) {
     UiListView *tableview = malloc(sizeof(UiListView));
     memset(tableview, 0, sizeof(UiListView));
     tableview->obj = obj;
-    tableview->model = args.model;
-    tableview->onactivate = args.onactivate;
-    tableview->onactivatedata = args.onactivatedata;
-    tableview->onselection = args.onselection;
-    tableview->onselectiondata = args.onselectiondata;
-    tableview->ondragstart = args.ondragstart;
-    tableview->ondragstartdata = args.ondragstartdata;
-    tableview->ondragcomplete = args.ondragcomplete;
-    tableview->ondragcompletedata = args.ondragcompletedata;
-    tableview->ondrop = args.ondrop;
-    tableview->ondropdata = args.ondropsdata;
+    tableview->model = args->model;
+    tableview->onactivate = args->onactivate;
+    tableview->onactivatedata = args->onactivatedata;
+    tableview->onselection = args->onselection;
+    tableview->onselectiondata = args->onselectiondata;
+    tableview->ondragstart = args->ondragstart;
+    tableview->ondragstartdata = args->ondragstartdata;
+    tableview->ondragcomplete = args->ondragcomplete;
+    tableview->ondragcompletedata = args->ondragcompletedata;
+    tableview->ondrop = args->ondrop;
+    tableview->ondropdata = args->ondropsdata;
     tableview->selection.count = 0;
     tableview->selection.rows = NULL;
     return tableview;
 }
 
-UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) {
+UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     // to simplify things and share code with ui_table_create, we also
     // use a UiModel for the listview
     UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1);
-    model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue;
-    args.model = model;
+    model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
+    args->model = model;
     
     GListStore *ls = g_list_store_new(G_TYPE_OBJECT);
     UiListView *listview = create_listview(obj, args);
@@ -230,10 +230,10 @@
     g_signal_connect(factory, "setup", G_CALLBACK(column_factory_setup), listview->columns);
     g_signal_connect(factory, "bind", G_CALLBACK(column_factory_bind), listview->columns);
     
-    GtkSelectionModel *selection_model = create_selection_model(listview, ls, args.multiselection);
+    GtkSelectionModel *selection_model = create_selection_model(listview, ls, args->multiselection);
     GtkWidget *view = gtk_list_view_new(GTK_SELECTION_MODEL(selection_model), factory);
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST);
     
     // init listview
     listview->widget = view;
@@ -256,21 +256,21 @@
         list->setselection = ui_listview_setselection2;
         
         ui_update_liststore(ls, list);
-    } else if (args.static_elements && args.static_nelm > 0) {
-        listview_copy_static_elements(listview, args.static_elements, args.static_nelm);
+    } else if (args->static_elements && args->static_nelm > 0) {
+        listview_copy_static_elements(listview, args->static_elements, args->static_nelm);
         listview->model->getvalue = ui_strmodel_getvalue; // force strmodel
         ui_update_liststore_static(ls, listview->elements, listview->nelm);
     }
     
     // event handling
-    if(args.onactivate) {
+    if(args->onactivate) {
         // columnview and listview can use the same callback function, because
         // the first parameter (which is technically a different pointer type)
         // is ignored
         g_signal_connect(view, "activate", G_CALLBACK(ui_columnview_activate), listview);
     }
-    if(args.contextmenu) {
-        UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, view);
+    if(args->contextmenu) {
+        UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, view);
         ui_widget_set_contextmenu(view, menu);
     }
     
@@ -282,7 +282,7 @@
             GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS  
     SCROLLEDWINDOW_SET_CHILD(scroll_area, view);
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, scroll_area, FALSE);
     
     // ct->current should point to view, not scroll_area, to make it possible
@@ -292,14 +292,14 @@
     return scroll_area;
 }
 
-UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs args) {
+UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     // to simplify things and share code with ui_tableview_create, we also
     // use a UiModel for the listview
     UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1);
-    model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue;
-    args.model = model;
+    model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
+    args->model = model;
     
     GListStore *ls = g_list_store_new(G_TYPE_OBJECT);
     UiListView *listview = create_listview(obj, args);
@@ -316,7 +316,7 @@
     GtkWidget *view = gtk_drop_down_new(G_LIST_MODEL(ls), NULL);
     gtk_drop_down_set_factory(GTK_DROP_DOWN(view), factory);
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST);
     
     // init listview
     listview->widget = view;
@@ -339,19 +339,19 @@
         list->setselection = ui_combobox_setselection;
         
         ui_update_liststore(ls, list);
-    } else if (args.static_elements && args.static_nelm > 0) {
-        listview_copy_static_elements(listview, args.static_elements, args.static_nelm);
+    } else if (args->static_elements && args->static_nelm > 0) {
+        listview_copy_static_elements(listview, args->static_elements, args->static_nelm);
         listview->model->getvalue = ui_strmodel_getvalue; // force strmodel
         ui_update_liststore_static(ls, listview->elements, listview->nelm);
     }
     
     // event handling
-    if(args.onactivate) {
+    if(args->onactivate) {
         g_signal_connect(view, "notify::selected", G_CALLBACK(ui_dropdown_notify), listview);
     }
     
     // add widget to parent 
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, view, FALSE);
     return view;
 }
@@ -365,7 +365,7 @@
     gtk_drop_down_set_selected(GTK_DROP_DOWN(dropdown), index);
 }
 
-UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) {
+UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     GListStore *ls = g_list_store_new(G_TYPE_OBJECT);
@@ -375,10 +375,10 @@
     // and list updates
     UiListView *tableview = create_listview(obj, args);
     
-    GtkSelectionModel *selection_model = create_selection_model(tableview, ls, args.multiselection);
+    GtkSelectionModel *selection_model = create_selection_model(tableview, ls, args->multiselection);
     GtkWidget *view = gtk_column_view_new(GTK_SELECTION_MODEL(selection_model));
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST);
     
     // init tableview
     tableview->widget = view;
@@ -393,7 +393,7 @@
     
     
     // create columns from UiModel
-    UiModel *model = args.model;
+    UiModel *model = args->model;
     int columns = model ? model->columns : 0;
     
     tableview->columns = calloc(columns, sizeof(UiColData));
@@ -439,11 +439,11 @@
     }
     
     // event handling
-    if(args.onactivate) {
+    if(args->onactivate) {
         g_signal_connect(view, "activate", G_CALLBACK(ui_columnview_activate), tableview);
     }
-    if(args.contextmenu) {
-        UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, view);
+    if(args->contextmenu) {
+        UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, view);
         ui_widget_set_contextmenu(view, menu);
     }
     
@@ -455,7 +455,7 @@
             GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS  
     SCROLLEDWINDOW_SET_CHILD(scroll_area, view);
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, scroll_area, FALSE);
     
     // ct->current should point to view, not scroll_area, to make it possible
@@ -780,13 +780,13 @@
 }
 
 
-UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) {
+UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     // create treeview
     GtkWidget *view = gtk_tree_view_new();
-    ui_set_name_and_style(view, args.name, args.style_class);
-    ui_set_widget_groups(obj->ctx, view, args.groups);
+    ui_set_name_and_style(view, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, view, args->groups);
     GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
     GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", 0, NULL);
     gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
@@ -803,9 +803,9 @@
 #endif
     
     UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1);
-    model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue;
+    model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST);
     
     UiList *list = var ? var->value : NULL;
     GtkListStore *listmodel = create_list_store(list, model);
@@ -835,24 +835,24 @@
     // add callback
     UiTreeEventData *event = malloc(sizeof(UiTreeEventData));
     event->obj = obj;
-    event->activate = args.onactivate;
-    event->activatedata = args.onactivatedata;
-    event->selection = args.onselection;
-    event->selectiondata = args.onselectiondata;
+    event->activate = args->onactivate;
+    event->activatedata = args->onactivatedata;
+    event->selection = args->onselection;
+    event->selectiondata = args->onselectiondata;
     g_signal_connect(
             view,
             "destroy",
             G_CALLBACK(ui_destroy_userdata),
             event);
     
-    if(args.onactivate) {
+    if(args->onactivate) {
         g_signal_connect(
                 view,
                 "row-activated",
                 G_CALLBACK(ui_listview_activate_event),
                 event);
     }
-    if(args.onselection) {
+    if(args->onselection) {
         GtkTreeSelection *selection = gtk_tree_view_get_selection(
                 GTK_TREE_VIEW(view));
         g_signal_connect(
@@ -861,8 +861,8 @@
                 G_CALLBACK(ui_listview_selection_event),
                 event);
     }
-    if(args.contextmenu) {
-        UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, view);
+    if(args->contextmenu) {
+        UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, view);
         ui_widget_set_contextmenu(view, menu);
     }
     
@@ -875,7 +875,7 @@
             GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS  
     SCROLLEDWINDOW_SET_CHILD(scroll_area, view);
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, scroll_area, FALSE);
     
     // ct->current should point to view, not scroll_area, to make it possible
@@ -896,13 +896,13 @@
     gtk_combo_box_set_active(GTK_COMBO_BOX(dropdown), index);
 }
 
-UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) {
+UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     // create treeview
     GtkWidget *view = gtk_tree_view_new();
     
-    UiModel *model = args.model;
+    UiModel *model = args->model;
     int columns = model ? model->columns : 0;
     
     int addi = 0;
@@ -959,7 +959,7 @@
     
 #endif
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST);
     
     UiList *list = var ? var->value : NULL;
     GtkListStore *listmodel = create_list_store(list, model);
@@ -977,12 +977,12 @@
     tableview->widget = view;
     tableview->var = var;
     tableview->model = model;
-    tableview->ondragstart = args.ondragstart;
-    tableview->ondragstartdata = args.ondragstartdata;
-    tableview->ondragcomplete = args.ondragcomplete;
-    tableview->ondragcompletedata = args.ondragcompletedata;
-    tableview->ondrop = args.ondrop;
-    tableview->ondropdata = args.ondropsdata;
+    tableview->ondragstart = args->ondragstart;
+    tableview->ondragstartdata = args->ondragstartdata;
+    tableview->ondragcomplete = args->ondragcomplete;
+    tableview->ondragcompletedata = args->ondragcompletedata;
+    tableview->ondrop = args->ondrop;
+    tableview->ondropdata = args->ondropsdata;
     tableview->selection.count = 0;
     tableview->selection.rows = NULL;
     g_signal_connect(
@@ -1000,18 +1000,18 @@
     // add callback
     UiTreeEventData *event = ui_malloc(obj->ctx, sizeof(UiTreeEventData));
     event->obj = obj;
-    event->activate = args.onactivate;
-    event->selection = args.onselection;
-    event->activatedata = args.onactivatedata;
-    event->selectiondata = args.onselectiondata;
-    if(args.onactivate) {
+    event->activate = args->onactivate;
+    event->selection = args->onselection;
+    event->activatedata = args->onactivatedata;
+    event->selectiondata = args->onselectiondata;
+    if(args->onactivate) {
         g_signal_connect(
                 view,
                 "row-activated",
                 G_CALLBACK(ui_listview_activate_event),
                 event);
     }
-    if(args.onselection) {
+    if(args->onselection) {
         GtkTreeSelection *selection = gtk_tree_view_get_selection(
                 GTK_TREE_VIEW(view));
         g_signal_connect(
@@ -1023,15 +1023,15 @@
     // TODO: destroy callback
     
     
-    if(args.ondragstart) {
+    if(args->ondragstart) {
         ui_listview_add_dnd(tableview, &args);
     }
-    if(args.ondrop) {
+    if(args->ondrop) {
         ui_listview_enable_drop(tableview, &args);
     }
       
     GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
-    if(args.multiselection) {
+    if(args->multiselection) {
         gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
     }
     
@@ -1043,8 +1043,8 @@
             GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS  
     SCROLLEDWINDOW_SET_CHILD(scroll_area, view);
     
-    if(args.contextmenu) {
-        UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, scroll_area);
+    if(args->contextmenu) {
+        UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, scroll_area);
 #if GTK_MAJOR_VERSION >= 4
         ui_widget_set_contextmenu(scroll_area, menu);
 #else
@@ -1052,7 +1052,7 @@
 #endif
     }
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, scroll_area, FALSE);
     
     // ct->current should point to view, not scroll_area, to make it possible
@@ -1102,18 +1102,18 @@
 
 /* --------------------------- ComboBox ---------------------------  */
 
-UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs args) {
+UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1);
-    model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue;
+    model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST);
     
-    GtkWidget *combobox = ui_create_combobox(obj, model, var, args.static_elements, args.static_nelm, args.onactivate, args.onactivatedata);
-    ui_set_name_and_style(combobox, args.name, args.style_class);
-    ui_set_widget_groups(obj->ctx, combobox, args.groups);
-    UI_APPLY_LAYOUT1(current, args);
+    GtkWidget *combobox = ui_create_combobox(obj, model, var, args->static_elements, args->static_nelm, args->onactivate, args->onactivatedata);
+    ui_set_name_and_style(combobox, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, combobox, args->groups);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, combobox, FALSE);
     current->container->current = combobox;
     return combobox;
@@ -1758,7 +1758,7 @@
     cxListAdd(sublists, &uisublist);
 }
 
-UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) {
+UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
 #ifdef UI_GTK3
@@ -1766,7 +1766,7 @@
 #else
     GtkWidget *listbox = gtk_list_box_new();
 #endif
-    if(!args.style_class) {
+    if(!args->style_class) {
 #if GTK_MAJOR_VERSION >= 4
         WIDGET_ADD_CSS_CLASS(listbox, "navigation-sidebar");
 #else
@@ -1777,31 +1777,31 @@
     GtkWidget *scroll_area = SCROLLEDWINDOW_NEW();
     SCROLLEDWINDOW_SET_CHILD(scroll_area, listbox);
     
-    ui_set_name_and_style(listbox, args.name, args.style_class);
-    ui_set_widget_groups(obj->ctx, listbox, args.groups);
-    UI_APPLY_LAYOUT1(current, args);
+    ui_set_name_and_style(listbox, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, listbox, args->groups);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, scroll_area, TRUE);
     
     UiListBox *uilistbox = malloc(sizeof(UiListBox));
     uilistbox->obj = obj;
     uilistbox->listbox = GTK_LIST_BOX(listbox);
-    uilistbox->getvalue = args.getvalue;
-    uilistbox->onactivate = args.onactivate;
-    uilistbox->onactivatedata = args.onactivatedata;
-    uilistbox->onbuttonclick = args.onbuttonclick;
-    uilistbox->onbuttonclickdata = args.onbuttonclickdata;
+    uilistbox->getvalue = args->getvalue;
+    uilistbox->onactivate = args->onactivate;
+    uilistbox->onactivatedata = args->onactivatedata;
+    uilistbox->onbuttonclick = args->onbuttonclick;
+    uilistbox->onbuttonclickdata = args->onbuttonclickdata;
     uilistbox->sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), 4);
     uilistbox->sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_destroy;
     uilistbox->sublists->collection.destructor_data = obj;
     uilistbox->first_row = NULL;
     
-    if(args.sublists) {
+    if(args->sublists) {
         // static sublist initalization
-        if(args.numsublists == 0 && args.sublists) {
-            args.numsublists = INT_MAX;
+        if(args->numsublists == 0 && args->sublists) {
+            args->numsublists = INT_MAX;
         }
-        for(int i=0;i<args.numsublists;i++) {
-            UiSubList sublist = args.sublists[i];
+        for(int i=0;i<args->numsublists;i++) {
+            UiSubList sublist = args->sublists[i];
             if(!sublist.varname && !sublist.value) {
                 break;
             }
@@ -1812,7 +1812,7 @@
         // fill items
         ui_listbox_update(uilistbox, 0, cxListSize(uilistbox->sublists));
     } else {
-        UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.dynamic_sublist, args.varname, UI_VAR_LIST);
+        UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->dynamic_sublist, args->varname, UI_VAR_LIST);
         if(var) {
             UiList *list = var->value;
             list->obj = uilistbox;
@@ -1834,7 +1834,7 @@
                 G_CALLBACK(ui_destroy_sourcelist),
                 uilistbox);
     
-    if(args.onactivate) {
+    if(args->onactivate) {
         g_signal_connect(
                 listbox,
                 "row-activated",
--- a/ui/gtk/text.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/gtk/text.c	Thu May 29 12:03:32 2025 +0200
@@ -107,13 +107,13 @@
     return buf;
 }
 
-UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) {
+UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) {
     UiObject* current = uic_current_obj(obj);
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_TEXT);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_TEXT);
     
     GtkWidget *text_area = gtk_text_view_new();
-    ui_set_name_and_style(text_area, args.name, args.style_class);
-    ui_set_widget_groups(obj->ctx, text_area, args.groups);
+    ui_set_name_and_style(text_area, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, text_area, args->groups);
     
     gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_area), GTK_WRAP_WORD_CHAR);
     g_signal_connect(
@@ -127,8 +127,8 @@
     uitext->ctx = obj->ctx;
     uitext->var = var;
     uitext->last_selection_state = 0;
-    uitext->onchange = args.onchange;
-    uitext->onchangedata = args.onchangedata;
+    uitext->onchange = args->onchange;
+    uitext->onchangedata = args->onchangedata;
     
     g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext);
     
@@ -155,7 +155,7 @@
     gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text_area), 2);
     
     // add
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, scroll_area, TRUE);
     
     // bind value
@@ -592,21 +592,21 @@
 
 
 
-static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool password, UiTextFieldArgs args) {
+static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool password, UiTextFieldArgs *args) {
     GtkWidget *textfield = gtk_entry_new();
-    ui_set_name_and_style(textfield, args.name, args.style_class);
-    ui_set_widget_groups(obj->ctx, textfield, args.groups);
+    ui_set_name_and_style(textfield, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, textfield, args->groups);
     
     UiObject* current = uic_current_obj(obj);
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING);
     
     UiTextField *uitext = malloc(sizeof(UiTextField));
     uitext->obj = obj;
     uitext->var = var;
-    uitext->onchange = args.onchange;
-    uitext->onchangedata = args.onchangedata;
-    uitext->onactivate = args.onactivate;
-    uitext->onactivatedata = args.onactivatedata;
+    uitext->onchange = args->onchange;
+    uitext->onchangedata = args->onchangedata;
+    uitext->onactivate = args->onactivate;
+    uitext->onactivatedata = args->onactivatedata;
     
     g_signal_connect(
                 textfield,
@@ -614,10 +614,10 @@
                 G_CALLBACK(ui_textfield_destroy),
                 uitext);
     
-    if(args.width > 0) {
+    if(args->width > 0) {
         // TODO: gtk4
 #if GTK_MAJOR_VERSION <= 3
-        gtk_entry_set_width_chars(GTK_ENTRY(textfield), args.width);
+        gtk_entry_set_width_chars(GTK_ENTRY(textfield), args->width);
 #endif
     }
     if(frameless) {
@@ -628,7 +628,7 @@
         gtk_entry_set_visibility(GTK_ENTRY(textfield), FALSE);
     }
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, textfield, FALSE);
     
     if(var) {
@@ -647,7 +647,7 @@
         value->obj = GTK_ENTRY(textfield);
     }
     
-    if(args.onchange || var) {
+    if(args->onchange || var) {
         g_signal_connect(
                 textfield,
                 "changed",
@@ -655,7 +655,7 @@
                 uitext);
     }
     
-    if(args.onactivate) {
+    if(args->onactivate) {
         g_signal_connect(
                 textfield,
                 "activate",
@@ -666,15 +666,15 @@
     return textfield;
 }
 
-UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args) {
+UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) {
     return create_textfield(obj, FALSE, FALSE, args);
 }
 
-UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args) {
+UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args) {
     return create_textfield(obj, TRUE, FALSE, args);
 }
 
-UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args) {
+UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) {
     return create_textfield(obj, FALSE, TRUE, args);
 }
 
@@ -915,22 +915,22 @@
     return FALSE;
 }
 
-UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) {
+UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     UiPathTextField *pathtf = malloc(sizeof(UiPathTextField));
     memset(pathtf, 0, sizeof(UiPathTextField));
     pathtf->obj = obj;
-    pathtf->getpathelm = args.getpathelm;
-    pathtf->getpathelmdata = args.getpathelmdata;
-    pathtf->onactivate = args.onactivate;
-    pathtf->onactivatedata = args.onactivatedata;
-    pathtf->ondragcomplete = args.ondragcomplete;
-    pathtf->ondragcompletedata = args.ondragcompletedata;
-    pathtf->ondragstart = args.ondragstart;
-    pathtf->ondragstartdata = args.ondragstartdata;
-    pathtf->ondrop = args.ondrop;
-    pathtf->ondropdata = args.ondropsdata;
+    pathtf->getpathelm = args->getpathelm;
+    pathtf->getpathelmdata = args->getpathelmdata;
+    pathtf->onactivate = args->onactivate;
+    pathtf->onactivatedata = args->onactivatedata;
+    pathtf->ondragcomplete = args->ondragcomplete;
+    pathtf->ondragcompletedata = args->ondragcompletedata;
+    pathtf->ondragstart = args->ondragstart;
+    pathtf->ondragstartdata = args->ondragstartdata;
+    pathtf->ondrop = args->ondrop;
+    pathtf->ondropdata = args->ondropsdata;
     
     if(!pathtf->getpathelm) {
         pathtf->getpathelm = default_pathelm_func;
@@ -940,7 +940,7 @@
     pathtf->stack = gtk_stack_new();
     gtk_widget_set_name(pathtf->stack, "path-textfield-box");
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, pathtf->stack, FALSE);
     
     pathtf->entry_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
@@ -973,7 +973,7 @@
     gtk_stack_set_visible_child(GTK_STACK(pathtf->stack), pathtf->entry_box);
     
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING);
     if (var) {
         UiString* value = (UiString*)var->value;
         value->obj = pathtf;
@@ -1076,22 +1076,22 @@
     return bb;
 }
 
-UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) {
+UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     UiPathTextField *pathtf = malloc(sizeof(UiPathTextField));
     memset(pathtf, 0, sizeof(UiPathTextField));
     pathtf->obj = obj;
-    pathtf->getpathelm = args.getpathelm;
-    pathtf->getpathelmdata = args.getpathelmdata;
-    pathtf->onactivate = args.onactivate;
-    pathtf->onactivatedata = args.onactivatedata;
-    pathtf->ondragcomplete = args.ondragcomplete;
-    pathtf->ondragcompletedata = args.ondragcompletedata;
-    pathtf->ondragstart = args.ondragstart;
-    pathtf->ondragstartdata = args.ondragstartdata;
-    pathtf->ondrop = args.ondrop;
-    pathtf->ondropdata = args.ondropsdata;
+    pathtf->getpathelm = args->getpathelm;
+    pathtf->getpathelmdata = args->getpathelmdata;
+    pathtf->onactivate = args->onactivate;
+    pathtf->onactivatedata = args->onactivatedata;
+    pathtf->ondragcomplete = args->ondragcomplete;
+    pathtf->ondragcompletedata = args->ondragcompletedata;
+    pathtf->ondragstart = args->ondragstart;
+    pathtf->ondragstartdata = args->ondragstartdata;
+    pathtf->ondrop = args->ondrop;
+    pathtf->ondropdata = args->ondropsdata;
     
     if(!pathtf->getpathelm) {
         pathtf->getpathelm = default_pathelm_func;
@@ -1112,7 +1112,7 @@
             G_CALLBACK(ui_path_textfield_destroy),
             pathtf);
     
-    UI_APPLY_LAYOUT1(current, args);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, eventbox, FALSE);
     
     // hbox as parent for the GtkEntry and GtkButtonBox
@@ -1137,7 +1137,7 @@
             G_CALLBACK(ui_path_textfield_key_press),
             pathtf);
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING);
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING);
     if (var) {
         UiString* value = (UiString*)var->value;
         value->obj = pathtf;
--- a/ui/gtk/webview.c	Thu May 15 12:55:54 2025 +0200
+++ b/ui/gtk/webview.c	Thu May 29 12:03:32 2025 +0200
@@ -33,14 +33,14 @@
 
 #ifdef UI_WEBVIEW
 
-UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs args) {
+UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs *args) {
     UiObject* current = uic_current_obj(obj);
     
     GtkWidget *webview = webkit_web_view_new();
     
-    ui_set_name_and_style(webview, args.name, args.style_class);
+    ui_set_name_and_style(webview, args->name, args->style_class);
     
-    UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_GENERIC);
+    UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_GENERIC);
     if(var) {
         WebViewData *data = malloc(sizeof(WebViewData));
         memset(data, 0, sizeof(WebViewData));
@@ -59,8 +59,8 @@
         }
     }
     
-    ui_set_widget_groups(obj->ctx, webview, args.groups);
-    UI_APPLY_LAYOUT1(current, args);
+    ui_set_widget_groups(obj->ctx, webview, args->groups);
+    UI_APPLY_LAYOUT2(current, args);
     current->container->add(current->container, webview, FALSE);
     
     return webview;
@@ -115,7 +115,14 @@
         const char *mimetype,
         const char *encoding)
 {
+    WebViewData *data0 = g->obj;
+    if(!data0) {
+        return;
+    }
+    
     WebViewData data;
+    memset(&data, 0, sizeof(WebViewData));
+    data.webview = data0->webview;
     data.uri = (char*)uri;
     data.content = (char*)content;
     data.contentlength = contentlength;
--- a/ui/ui/button.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/ui/button.h	Thu May 29 12:03:32 2025 +0200
@@ -82,17 +82,17 @@
     const int* groups;
 } UiToggleArgs;
  
-#define ui_button(obj, ...) ui_button_create(obj, (UiButtonArgs){ __VA_ARGS__ } )
-#define ui_togglebutton(obj, ...) ui_togglebutton_create(obj, (UiToggleArgs){ __VA_ARGS__ } )
-#define ui_checkbox(obj, ...) ui_checkbox_create(obj, (UiToggleArgs){ __VA_ARGS__ } )
-#define ui_switch(obj, ...) ui_switch_create(obj, (UiToggleArgs){ __VA_ARGS__ } )
-#define ui_radiobutton(obj, ...) ui_radiobutton_create(obj, (UiToggleArgs){ __VA_ARGS__ } )
+#define ui_button(obj, ...) ui_button_create(obj, &(UiButtonArgs){ __VA_ARGS__ } )
+#define ui_togglebutton(obj, ...) ui_togglebutton_create(obj, &(UiToggleArgs){ __VA_ARGS__ } )
+#define ui_checkbox(obj, ...) ui_checkbox_create(obj, &(UiToggleArgs){ __VA_ARGS__ } )
+#define ui_switch(obj, ...) ui_switch_create(obj, &(UiToggleArgs){ __VA_ARGS__ } )
+#define ui_radiobutton(obj, ...) ui_radiobutton_create(obj, &(UiToggleArgs){ __VA_ARGS__ } )
 
-UIEXPORT UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args);
-UIEXPORT UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args);
-UIEXPORT UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args);
-UIEXPORT UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args);
-UIEXPORT UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args);
+UIEXPORT UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args);
+UIEXPORT UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args);
+UIEXPORT UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args);
+UIEXPORT UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args);
+UIEXPORT UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args);
 
 
 
--- a/ui/ui/container.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/ui/container.h	Thu May 29 12:03:32 2025 +0200
@@ -235,39 +235,39 @@
 
 #define UI_CTN(obj, ctn) for(ctn;ui_container_finish(obj);ui_container_begin_close(obj))
 
-#define ui_vbox(obj, ...) for(ui_vbox_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_hbox(obj, ...) for(ui_hbox_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_grid(obj, ...) for(ui_grid_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_frame(obj, ...) for(ui_frame_create(obj, (UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_expander(obj, ...) for(ui_expander_create(obj, (UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_scrolledwindow(obj, ...) for(ui_scrolledwindow_create(obj, (UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_tabview(obj, ...) for(ui_tabview_create(obj, (UiTabViewArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_headerbar(obj, ...) for(ui_headerbar_create(obj, (UiHeaderbarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_sidebar(obj, ...) for(ui_sidebar_create(obj, (UiSidebarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_vbox(obj, ...) for(ui_vbox_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_hbox(obj, ...) for(ui_hbox_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_grid(obj, ...) for(ui_grid_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_frame(obj, ...) for(ui_frame_create(obj, &(UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_expander(obj, ...) for(ui_expander_create(obj, &(UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_scrolledwindow(obj, ...) for(ui_scrolledwindow_create(obj, &(UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_tabview(obj, ...) for(ui_tabview_create(obj, &(UiTabViewArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_headerbar(obj, ...) for(ui_headerbar_create(obj, &(UiHeaderbarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_sidebar(obj, ...) for(ui_sidebar_create(obj, &(UiSidebarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
 
-#define ui_vbox0(obj) for(ui_vbox_create(obj, (UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_hbox0(obj) for(ui_hbox_create(obj, (UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_grid0(obj) for(ui_grid_create(obj, (UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_frame0(obj) for(ui_frame_create(obj, (UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_expander0(obj) for(ui_expande_create(obj, (UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_scrolledwindow0(obj) for(ui_scrolledwindow_create(obj, (UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_tabview0(obj) for(ui_tabview_create(obj, (UiTabViewArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_headerbar0(obj) for(ui_headerbar_create(obj, (UiHeaderbarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_sidebar0(obj) for(ui_sidebar_create(obj, (UiSidebarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_vbox0(obj) for(ui_vbox_create(obj, &(UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_hbox0(obj) for(ui_hbox_create(obj, &(UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_grid0(obj) for(ui_grid_create(obj, &(UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_frame0(obj) for(ui_frame_create(obj, &(UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_expander0(obj) for(ui_expande_create(obj, &(UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_scrolledwindow0(obj) for(ui_scrolledwindow_create(obj, &(UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_tabview0(obj) for(ui_tabview_create(obj, &(UiTabViewArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_headerbar0(obj) for(ui_headerbar_create(obj, &(UiHeaderbarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_sidebar0(obj) for(ui_sidebar_create(obj, &(UiSidebarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
 
-#define ui_vbox_w(obj, w, ...) for(w = ui_vbox_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_hbox_w(obj, w, ...) for(w = ui_hbox_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_grid_w(obj, w, ...) for(w = ui_grid_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_tabview_w(obj, w, ...) for(w = ui_tabview_create(obj, (UiTabViewArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_scrolledwindow_w(obj, w, ...) for(w = ui_scrolledwindow_create(obj, (UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_vbox_w(obj, w, ...) for(w = ui_vbox_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_hbox_w(obj, w, ...) for(w = ui_hbox_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_grid_w(obj, w, ...) for(w = ui_grid_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_tabview_w(obj, w, ...) for(w = ui_tabview_create(obj, &(UiTabViewArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_scrolledwindow_w(obj, w, ...) for(w = ui_scrolledwindow_create(obj, &(UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
 
-#define ui_hsplitpane(obj, ...) for(ui_hsplitpane_create(obj, (UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_vsplitpane(obj, ...) for(ui_vsplitpane_create(obj, (UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_hsplitpane0(obj) for(ui_hsplitpane_create(obj, (UiSplitPaneArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_vsplitpane0(obj) for(ui_vsplitpane_create(obj, (UiSplitPaneArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_hsplitpane(obj, ...) for(ui_hsplitpane_create(obj, &(UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_vsplitpane(obj, ...) for(ui_vsplitpane_create(obj, &(UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_hsplitpane0(obj) for(ui_hsplitpane_create(obj, &(UiSplitPaneArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_vsplitpane0(obj) for(ui_vsplitpane_create(obj, &(UiSplitPaneArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
 
-#define ui_hsplitpane_w(obj, w, ...) for(w = ui_hsplitpane_create(obj, (UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
-#define ui_vsplitpane_w(obj, w, ...) for(w = ui_vsplitpane_create(obj, (UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_hsplitpane_w(obj, w, ...) for(w = ui_hsplitpane_create(obj, &(UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_vsplitpane_w(obj, w, ...) for(w = ui_vsplitpane_create(obj, &(UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
 
 #define ui_tab(obj, label) for(ui_tab_create(obj, label);ui_container_finish(obj);ui_container_begin_close(obj))
 
@@ -275,35 +275,35 @@
 #define ui_headerbar_center(obj) for(ui_headerbar_center_create(obj);ui_container_finish(obj);ui_container_begin_close(obj))
 #define ui_headerbar_end(obj) for(ui_headerbar_end_create(obj);ui_container_finish(obj);ui_container_begin_close(obj))
 
-#define ui_itemlist(obj, ...) ui_itemlist_create(obj, (UiItemListContainerArgs) { __VA_ARGS__} )
+#define ui_itemlist(obj, ...) ui_itemlist_create(obj, &(UiItemListContainerArgs) { __VA_ARGS__} )
 
 UIEXPORT void ui_end(UiObject *obj); // deprecated
 UIEXPORT void ui_end_new(UiObject *obj); // TODO: rename to ui_end
     
-UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args);
-UIEXPORT UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args);
-UIEXPORT UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args);
-UIEXPORT UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs args);
-UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs args);
-UIEXPORT UIWIDGET ui_scrolledwindow_create(UiObject *obj, UiFrameArgs args);
+UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args);
+UIEXPORT UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args);
+UIEXPORT UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args);
+UIEXPORT UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args);
+UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs *args);
+UIEXPORT UIWIDGET ui_scrolledwindow_create(UiObject *obj, UiFrameArgs *args);
 
-UIEXPORT UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs args);
+UIEXPORT UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs *args);
 UIEXPORT void ui_tab_create(UiObject *obj, const char* title);
 UIEXPORT void ui_tabview_select(UIWIDGET tabview, int tab);
 UIEXPORT void ui_tabview_remove(UIWIDGET tabview, int tab);
 UIEXPORT UiObject* ui_tabview_add(UIWIDGET tabview, const char *name, int tab_index);
 
-UIEXPORT UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs args);
+UIEXPORT UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs *args);
 UIEXPORT void ui_headerbar_start_create(UiObject *obj);
 UIEXPORT void ui_headerbar_center_create(UiObject *obj);
 UIEXPORT void ui_headerbar_end_create(UiObject *obj);
 
-UIEXPORT UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs args);
+UIEXPORT UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs *args);
 
-UIEXPORT UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs args);
+UIEXPORT UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs *args);
 
-UIEXPORT UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs args);
-UIEXPORT UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs args);
+UIEXPORT UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs *args);
+UIEXPORT UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs *args);
 
 UIEXPORT void ui_splitpane_set_visible(UIWIDGET splitpane, int child_index, UiBool visible);
 
@@ -342,6 +342,17 @@
     if(args.rowspan > 0) ui_layout_rowspan(obj, args.rowspan); \
     /*force caller to add ';'*/(void)0
 
+#define UI_APPLY_LAYOUT2(obj, args) \
+    if(args->fill != UI_DEFAULT) ui_layout_fill(obj, args->fill == UI_ON ? 1 : 0 ); \
+    if(args->hexpand) ui_layout_hexpand(obj, 1); \
+    if(args->vexpand) ui_layout_vexpand(obj, 1); \
+    if(args->hfill) ui_layout_hfill(obj, 1); \
+    if(args->vfill) ui_layout_vfill(obj, 1); \
+    if(args->override_defaults) ui_layout_override_defaults(obj, 1); \
+    if(args->colspan > 0) ui_layout_colspan(obj, args->colspan); \
+    if(args->rowspan > 0) ui_layout_rowspan(obj, args->rowspan); \
+    /*force caller to add ';'*/(void)0
+
 
 #ifdef __cplusplus
 }
--- a/ui/ui/display.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/ui/display.h	Thu May 29 12:03:32 2025 +0200
@@ -113,24 +113,24 @@
 
 /* label widgets */
 
-#define ui_label(obj, ...) ui_label_create(obj, (UiLabelArgs) { __VA_ARGS__ })
-#define ui_llabel(obj, ...) ui_llabel_create(obj, (UiLabelArgs) { __VA_ARGS__ })
-#define ui_rlabel(obj, ...) ui_rlabel_create(obj, (UiLabelArgs) { __VA_ARGS__ })
+#define ui_label(obj, ...) ui_label_create(obj, &(UiLabelArgs) { __VA_ARGS__ })
+#define ui_llabel(obj, ...) ui_llabel_create(obj, &(UiLabelArgs) { __VA_ARGS__ })
+#define ui_rlabel(obj, ...) ui_rlabel_create(obj, &(UiLabelArgs) { __VA_ARGS__ })
 
 
-UIEXPORT UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs args);
-UIEXPORT UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs args);
-UIEXPORT UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs args);
+UIEXPORT UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs *args);
+UIEXPORT UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs *args);
+UIEXPORT UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs *args);
 
 UIWIDGET ui_space_deprecated(UiObject *obj);
 
 /* progress bar/spinner */
 
-#define ui_progressbar(obj, ...) ui_progressbar_create(obj, (UiProgressbarArgs) { __VA_ARGS__ } )
-#define ui_progressspinner(obj, ...) ui_progressspinner_create(obj, (UiProgressbarSpinnerArgs) { __VA_ARGS__ } )
+#define ui_progressbar(obj, ...) ui_progressbar_create(obj, &(UiProgressbarArgs) { __VA_ARGS__ } )
+#define ui_progressspinner(obj, ...) ui_progressspinner_create(obj, &(UiProgressbarSpinnerArgs) { __VA_ARGS__ } )
 
-UIEXPORT UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args);
-UIEXPORT UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs args);
+UIEXPORT UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs *args);
+UIEXPORT UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs *args);
 
 
 #ifdef __cplusplus
--- a/ui/ui/entry.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/ui/entry.h	Thu May 29 12:03:32 2025 +0200
@@ -62,9 +62,9 @@
 
 
     
-UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs args);
+UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs *args);
 
-#define ui_spinner(obj, ...) ui_spinner_create(obj, (UiSpinnerArgs){ __VA_ARGS__ } )
+#define ui_spinner(obj, ...) ui_spinner_create(obj, &(UiSpinnerArgs){ __VA_ARGS__ } )
 
 void ui_spinner_setrange(UIWIDGET spinner, double min, double max);
 void ui_spinner_setdigits(UIWIDGET spinner, int digits);
--- a/ui/ui/image.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/ui/image.h	Thu May 29 12:03:32 2025 +0200
@@ -75,9 +75,9 @@
     void *onbuttonreleasedata;
 } UiImageViewerArgs;
     
-#define ui_imageviewer(obj, ...) ui_imageviewer_create(obj, (UiImageViewerArgs){ __VA_ARGS__ } )
+#define ui_imageviewer(obj, ...) ui_imageviewer_create(obj, &(UiImageViewerArgs){ __VA_ARGS__ } )
     
-UIEXPORT UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args);
+UIEXPORT UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs *args);
 
 UIEXPORT UIWIDGET ui_imageviewer_reset(UIWIDGET w);
 UIEXPORT UIWIDGET ui_imageviewer_set_autoscale(UIWIDGET w, UiBool set);
--- a/ui/ui/menu.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/ui/menu.h	Thu May 29 12:03:32 2025 +0200
@@ -69,23 +69,23 @@
 
 #define ui_menu(label) for(ui_menu_create(label);ui_menu_is_open();ui_menu_close())
 
-#define ui_menuitem(...) ui_menuitem_create((UiMenuItemArgs){ __VA_ARGS__ })
-#define ui_menu_toggleitem(...) ui_menu_toggleitem_create((UiMenuToggleItemArgs){ __VA_ARGS__ })
-#define ui_menu_radioitem(...) ui_menu_radioitem_create((UiMenuToggleItemArgs){ __VA_ARGS__ })
-#define ui_menu_itemlist(...) ui_menu_itemlist_create((UiMenuItemListArgs) { __VA_ARGS__ } )
-#define ui_menu_togglelist(...) ui_menu_itemlist_create((UiMenuItemListArgs) { __VA_ARGS} )
-#define ui_menu_radiolist(...) ui_menu_itemlist_create((UiMenuItemListArgs) { __VA_ARGS} )
+#define ui_menuitem(...) ui_menuitem_create(&(UiMenuItemArgs){ __VA_ARGS__ })
+#define ui_menu_toggleitem(...) ui_menu_toggleitem_create(&(UiMenuToggleItemArgs){ __VA_ARGS__ })
+#define ui_menu_radioitem(...) ui_menu_radioitem_create(&(UiMenuToggleItemArgs){ __VA_ARGS__ })
+#define ui_menu_itemlist(...) ui_menu_itemlist_create(&(UiMenuItemListArgs) { __VA_ARGS__ } )
+#define ui_menu_togglelist(...) ui_menu_itemlist_create(&(UiMenuItemListArgs) { __VA_ARGS} )
+#define ui_menu_radiolist(...) ui_menu_itemlist_create(&(UiMenuItemListArgs) { __VA_ARGS} )
 
 UIEXPORT void ui_menu_create(const char* label);
-UIEXPORT void ui_menuitem_create(UiMenuItemArgs args);
-UIEXPORT void ui_menu_toggleitem_create(UiMenuToggleItemArgs args);
-UIEXPORT void ui_menu_radioitem_create(UiMenuToggleItemArgs args);
+UIEXPORT void ui_menuitem_create(UiMenuItemArgs *args);
+UIEXPORT void ui_menu_toggleitem_create(UiMenuToggleItemArgs *args);
+UIEXPORT void ui_menu_radioitem_create(UiMenuToggleItemArgs *args);
 
 UIEXPORT void ui_menuseparator();
 
-UIEXPORT void ui_menu_itemlist_create(UiMenuItemListArgs args);
-UIEXPORT void ui_menu_toggleitemlist_create(UiMenuItemListArgs args);
-UIEXPORT void ui_menu_radioitemlist_create(UiMenuItemListArgs args);
+UIEXPORT void ui_menu_itemlist_create(UiMenuItemListArgs *args);
+UIEXPORT void ui_menu_toggleitemlist_create(UiMenuItemListArgs *args);
+UIEXPORT void ui_menu_radioitemlist_create(UiMenuItemListArgs *args);
 
 UIEXPORT void ui_menu_end(void); // TODO: private
 
--- a/ui/ui/text.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/ui/text.h	Thu May 29 12:03:32 2025 +0200
@@ -119,25 +119,25 @@
     void *ondropsdata;
 } UiPathTextFieldArgs;
 
-#define ui_textarea(obj, ...) ui_textarea_create(obj, (UiTextAreaArgs) { __VA_ARGS__ })
+#define ui_textarea(obj, ...) ui_textarea_create(obj, &(UiTextAreaArgs) { __VA_ARGS__ })
 
-UIEXPORT UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args);
+UIEXPORT UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args);
 
 UIEXPORT UIWIDGET ui_textarea_gettextwidget(UIWIDGET textarea);
 
 UIEXPORT void ui_text_undo(UiText *value);
 UIEXPORT void ui_text_redo(UiText *value);
 
-#define ui_textfield(obj, ...) ui_textfield_create(obj, (UiTextFieldArgs) { __VA_ARGS__ })
-#define ui_frameless_textfield(obj, ...) ui_frameless_field_create(obj, (UiTextFieldArgs) { __VA_ARGS__ })
-#define ui_passwordfield(obj, ...) ui_passwordfield_create(obj, (UiTextFieldArgs) { __VA_ARGS__ })
-#define ui_path_textfield(obj, ...) ui_path_textfield_create(obj, (UiPathTextFieldArgs) { __VA_ARGS__ } )
+#define ui_textfield(obj, ...) ui_textfield_create(obj, &(UiTextFieldArgs) { __VA_ARGS__ })
+#define ui_frameless_textfield(obj, ...) ui_frameless_field_create(obj, &(UiTextFieldArgs) { __VA_ARGS__ })
+#define ui_passwordfield(obj, ...) ui_passwordfield_create(obj, &(UiTextFieldArgs) { __VA_ARGS__ })
+#define ui_path_textfield(obj, ...) ui_path_textfield_create(obj, &(UiPathTextFieldArgs) { __VA_ARGS__ } )
 
-UIEXPORT UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args);
-UIEXPORT UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args);
-UIEXPORT UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args);
+UIEXPORT UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args);
+UIEXPORT UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args);
+UIEXPORT UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args);
 
-UIEXPORT UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args);
+UIEXPORT UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args);
         
 #ifdef	__cplusplus
 }
--- a/ui/ui/toolbar.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/ui/toolbar.h	Thu May 29 12:03:32 2025 +0200
@@ -71,16 +71,16 @@
 	UI_TOOLBAR_RIGHT
 };
 
-#define ui_toolbar_item(name, ...) ui_toolbar_item_create(name, (UiToolbarItemArgs){ __VA_ARGS__ } )
-#define ui_toolbar_toggleitem(name, ...) ui_toolbar_toggleitem_create(name, (UiToolbarToggleItemArgs){ __VA_ARGS__ } )
+#define ui_toolbar_item(name, ...) ui_toolbar_item_create(name, &(UiToolbarItemArgs){ __VA_ARGS__ } )
+#define ui_toolbar_toggleitem(name, ...) ui_toolbar_toggleitem_create(name, &(UiToolbarToggleItemArgs){ __VA_ARGS__ } )
 
-#define ui_toolbar_menu(name, ...) for(ui_toolbar_menu_create(name, (UiToolbarMenuArgs){ __VA_ARGS__ });ui_menu_is_open();ui_menu_close())
-#define ui_toolbar_appmenu() for(ui_toolbar_menu_create(NULL, (UiToolbarMenuArgs){ 0 });ui_menu_is_open();ui_menu_close())
+#define ui_toolbar_menu(name, ...) for(ui_toolbar_menu_create(name, &(UiToolbarMenuArgs){ __VA_ARGS__ });ui_menu_is_open();ui_menu_close())
+#define ui_toolbar_appmenu() for(ui_toolbar_menu_create(NULL, &(UiToolbarMenuArgs){ 0 });ui_menu_is_open();ui_menu_close())
 
 
-UIEXPORT void ui_toolbar_item_create(const char* name, UiToolbarItemArgs args);
-UIEXPORT void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs args);
-UIEXPORT void ui_toolbar_menu_create(const char* name, UiToolbarMenuArgs args);
+UIEXPORT void ui_toolbar_item_create(const char* name, UiToolbarItemArgs *args);
+UIEXPORT void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs *args);
+UIEXPORT void ui_toolbar_menu_create(const char* name, UiToolbarMenuArgs *args);
 
 UIEXPORT void ui_toolbar_add_default(const char *name, enum UiToolbarPos pos);
 
--- a/ui/ui/tree.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/ui/tree.h	Thu May 29 12:03:32 2025 +0200
@@ -240,21 +240,21 @@
 UIEXPORT UiModel* ui_model_copy(UiContext *ctx, UiModel* model);
 UIEXPORT void ui_model_free(UiContext *ctx, UiModel *mi);
 
-#define ui_listview(obj, ...) ui_listview_create(obj, (UiListArgs) { __VA_ARGS__ } )
-#define ui_table(obj, ...) ui_table_create(obj, (UiListArgs) { __VA_ARGS__ } )
-#define ui_combobox(obj, ...) ui_combobox_create(obj, (UiListArgs) { __VA_ARGS__ } )
-#define ui_breadcrumbbar(obj, ...) ui_breadcrumbbar_create(obj, (UiListArgs) { __VA_ARGS__ } )
-#define ui_sourcelist(obj, ...) ui_sourcelist_create(obj, (UiSourceListArgs) { __VA_ARGS__ } )
+#define ui_listview(obj, ...) ui_listview_create(obj, &(UiListArgs) { __VA_ARGS__ } )
+#define ui_table(obj, ...) ui_table_create(obj, &(UiListArgs) { __VA_ARGS__ } )
+#define ui_combobox(obj, ...) ui_combobox_create(obj, &(UiListArgs) { __VA_ARGS__ } )
+#define ui_breadcrumbbar(obj, ...) ui_breadcrumbbar_create(obj, &(UiListArgs) { __VA_ARGS__ } )
+#define ui_sourcelist(obj, ...) ui_sourcelist_create(obj, &(UiSourceListArgs) { __VA_ARGS__ } )
 
-UIEXPORT UIWIDGET ui_listview_create(UiObject* obj, UiListArgs args);
-UIEXPORT UIWIDGET ui_table_create(UiObject* obj, UiListArgs args);
-UIEXPORT UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs args);
-UIEXPORT UIWIDGET ui_breadcrumbbar_create(UiObject* obj, UiListArgs args);
+UIEXPORT UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args);
+UIEXPORT UIWIDGET ui_table_create(UiObject* obj, UiListArgs *args);
+UIEXPORT UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs *args);
+UIEXPORT UIWIDGET ui_breadcrumbbar_create(UiObject* obj, UiListArgs *args);
 
 UIEXPORT void ui_listview_select(UIWIDGET listview, int index);
 UIEXPORT void ui_combobox_select(UIWIDGET dropdown, int index);
 
-UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args);
+UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs *args);
 
 
 #ifdef	__cplusplus
--- a/ui/ui/webview.h	Thu May 15 12:55:54 2025 +0200
+++ b/ui/ui/webview.h	Thu May 29 12:03:32 2025 +0200
@@ -56,9 +56,9 @@
     const int* groups;
 } UiWebviewArgs;
 
-#define ui_webview(obj, ...) ui_webview_create(obj, (UiWebviewArgs){ __VA_ARGS__ } )
+#define ui_webview(obj, ...) ui_webview_create(obj, &(UiWebviewArgs){ __VA_ARGS__ } )
 
-UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs args);
+UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs *args);
 
 void ui_webview_load_url(UiGeneric *g, const char *url);
 

mercurial