diff -r f0c4322741c8 -r ce992dbfbc39 ui/gtk/container.c --- a/ui/gtk/container.c Mon Oct 06 11:11:30 2025 +0200 +++ b/ui/gtk/container.c Mon Oct 06 11:36:39 2025 +0200 @@ -86,19 +86,19 @@ switch(type) { default: { sub = ui_gtk_vbox_new(spacing); - add = ui_box_set_margin(sub, margin); + add = ui_gtk_set_margin(sub, margin, 0, 0, 0, 0); container = ui_box_container(obj, sub, type); break; } case UI_CONTAINER_HBOX: { sub = ui_gtk_hbox_new(spacing); - add = ui_box_set_margin(sub, margin); + add = ui_gtk_set_margin(sub, margin, 0, 0, 0, 0); container = ui_box_container(obj, sub, type); break; } case UI_CONTAINER_GRID: { sub = ui_create_grid_widget(columnspacing, rowspacing); - add = ui_box_set_margin(sub, margin); + add = ui_gtk_set_margin(sub, margin, 0, 0, 0, 0); container = ui_grid_container(obj, sub, FALSE, FALSE, FALSE, FALSE); break; } @@ -127,6 +127,8 @@ void ui_box_container_add(UiContainerPrivate *ct, GtkWidget *widget, UiLayout *layout) { UiBoxContainer *bc = (UiBoxContainer*)ct; + widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom); + UiBool fill = layout->fill; if(bc->has_fill && fill) { fprintf(stderr, "UiError: container has 2 filled widgets"); @@ -184,6 +186,7 @@ #if GTK_MAJOR_VERSION >= 3 void ui_grid_container_add(UiContainerPrivate *ct, GtkWidget *widget, UiLayout *layout) { UiGridContainer *grid = (UiGridContainer*)ct; + widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom); if(ct->container.newline) { grid->x = 0; @@ -215,6 +218,7 @@ #ifdef UI_GTK2 void ui_grid_container_add(UiContainerPrivate *ct, GtkWidget *widget) { UiGridContainer *grid = (UiGridContainer*)ct; + widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom); if(ct->container.newline) { grid->x = 0; @@ -267,6 +271,7 @@ } void ui_frame_container_add(UiContainerPrivate *ct, GtkWidget *widget, UiLayout *layout) { + widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom); FRAME_SET_CHILD(ct->widget, widget); ct->current = widget; } @@ -282,11 +287,13 @@ } void ui_expander_container_add(UiContainerPrivate *ct, GtkWidget *widget, UiLayout *layout) { + widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom); EXPANDER_SET_CHILD(ct->widget, widget); ct->current = widget; } void ui_scrolledwindow_container_add(UiContainerPrivate *ct, GtkWidget *widget, UiLayout *layout) { + widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom); // TODO: check if the widget implements GtkScrollable SCROLLEDWINDOW_SET_CHILD(ct->widget, widget); ct->current = widget; @@ -318,29 +325,52 @@ fprintf(stderr, "UI Error: widget is not a tabview"); return; } + widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom); data->add_tab(ct->widget, -1, layout->label, widget); ct->current = widget; } +#ifdef UI_GTK2 +static void alignment_child_visibility_changed(GtkWidget *widget, gpointer user_data) { + gtk_widget_set_visible(gtk_widget_get_parent(widget), gtk_widget_get_visible(widget)); +} + +#endif -GtkWidget* ui_box_set_margin(GtkWidget *box, int margin) { - GtkWidget *ret = box; +GtkWidget* ui_gtk_set_margin(GtkWidget *widget, int margin, int margin_left, int margin_right, int margin_top, int margin_bottom) { + if(margin > 0) { + margin_left = margin; + margin_right = margin; + margin_top = margin; + margin_bottom = margin; + } + GtkWidget *ret = widget; #if GTK_MAJOR_VERSION >= 3 -#if GTK_MAJOR_VERSION * 1000 + GTK_MINOR_VERSION >= 3012 - gtk_widget_set_margin_start(box, margin); - gtk_widget_set_margin_end(box, margin); +#if GTK_CHECK_VERSION(3, 12, 0) + gtk_widget_set_margin_start(widget, margin_left); + gtk_widget_set_margin_end(widget, margin_right); #else - gtk_widget_set_margin_left(box, margin); - gtk_widget_set_margin_right(box, margin); + gtk_widget_set_margin_left(widget, margin_left); + gtk_widget_set_margin_right(widget, margin_right); #endif - gtk_widget_set_margin_top(box, margin); - gtk_widget_set_margin_bottom(box, margin); + gtk_widget_set_margin_top(widget, margin_top); + gtk_widget_set_margin_bottom(widget, margin_bottom); #elif defined(UI_GTK2) GtkWidget *a = gtk_alignment_new(0.5, 0.5, 1, 1); - gtk_alignment_set_padding(GTK_ALIGNMENT(a), margin, margin, margin, margin); - gtk_container_add(GTK_CONTAINER(a), box); + gtk_alignment_set_padding(GTK_ALIGNMENT(a), margin_top, margin_bottom, margin_left, margin_right); + gtk_container_add(GTK_CONTAINER(a), widget); + g_signal_connect( + widget, + "show", + G_CALLBACK(alignment_child_visibility_changed), + NULL); + g_signal_connect( + widget, + "hide", + G_CALLBACK(alignment_child_visibility_changed), + NULL); ret = a; #endif return ret; @@ -352,13 +382,12 @@ 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; // TODO: remove, margin will be handled by container add-functions - ct->add(ct, widget, &layout); + ct->add(ct, box, &layout); UiContainerX *container = ui_box_container(obj, box, type); uic_object_push_container(obj, container); - return widget; + return box; } UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args) { @@ -389,13 +418,12 @@ 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); - ct->add(ct, widget, &layout); + ct->add(ct, grid, &layout); UiContainerX *container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill); uic_object_push_container(obj, container); - return widget; + return grid; } static void frame_create_subcontainer(UiObject *obj, UiFrameArgs *args) { @@ -803,7 +831,7 @@ uic_object_push_container(obj, container); - GtkWidget *widget = ui_box_set_margin(sub, tabview->padding); + GtkWidget *widget = ui_gtk_set_margin(sub, tabview->padding, 0, 0, 0, 0); tabview->add_tab(tabview->widget, tab, title, widget); return sub; @@ -981,7 +1009,7 @@ } GtkWidget *box = ui_gtk_vbox_new(args->spacing); - ui_box_set_margin(box, args->margin); + ui_gtk_set_margin(box, args->margin, args->margin_left, args->margin_right, args->margin_top, args->margin_bottom); adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(sidebar_toolbar_view), box); UiContainerX *container = ui_box_container(obj, box, UI_CONTAINER_VBOX); @@ -994,7 +1022,7 @@ 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); + ui_gtk_set_margin(box, args->margin, args->margin-left, args->margin_right, args->margin_top, args->margin_bottom); BOX_ADD_EXPAND(sidebar_vbox, box); UiContainerX *container = ui_box_container(obj, box, UI_CONTAINER_VBOX); @@ -1014,7 +1042,7 @@ GtkWidget *box = ui_gtk_vbox_new(args->spacing); ui_set_name_and_style(box, args->name, args->style_class); - ui_box_set_margin(box, args->margin); + ui_gtk_set_margin(box, args->margin, args->margin_left, args->margin_right, args->margin_top, args->margin_bottom); BOX_ADD_EXPAND(pbox, box); UiContainerX *container = ui_box_container(obj, box, UI_CONTAINER_VBOX); @@ -1269,8 +1297,7 @@ 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, &layout); + ct->add(ct, box, &layout); UiGtkItemListContainer *container = malloc(sizeof(UiGtkItemListContainer)); container->parent = obj;