From 7304e4227f62dbaf55deafb9fc53854376165b2a Mon Sep 17 00:00:00 2001 From: Tristan Van Berkom Date: Thu, 8 Apr 2010 21:45:07 -0400 Subject: [PATCH] Fixed gtk_box_size_allocate() for homogeneous boxes gtk_box_size_allocate() was forgetting to fetch the minimum size for children when allocating in homogeneous mode and then accessing the uninitialized allocated values in that case, fixed. --- gtk/gtkbox.c | 89 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 38 deletions(-) diff --git a/gtk/gtkbox.c b/gtk/gtkbox.c index bb8739983..9daf89aad 100644 --- a/gtk/gtkbox.c +++ b/gtk/gtkbox.c @@ -463,42 +463,56 @@ gtk_box_size_allocate (GtkWidget *widget, else size = allocation->height - border_width * 2 - (nvis_children - 1) * box->spacing; + /* Retrieve desired size for visible children */ + i = 0; + children = box->children; + while (children) + { + child = children->data; + children = children->next; + + if (gtk_widget_get_visible (child->widget)) + { + if (private->orientation == GTK_ORIENTATION_HORIZONTAL) + gtk_extended_layout_get_width_for_height (GTK_EXTENDED_LAYOUT (child->widget), + allocation->height, + &sizes[i].minimum_size, + &sizes[i].natural_size); + else + gtk_extended_layout_get_height_for_width (GTK_EXTENDED_LAYOUT (child->widget), + allocation->width, + &sizes[i].minimum_size, + &sizes[i].natural_size); + + + /* Assert the api is working properly */ + g_assert (sizes[i].minimum_size >= 0); + g_assert (sizes[i].natural_size >= sizes[i].minimum_size); + + size -= sizes[i].minimum_size; + size -= child->padding * 2; + + spreading[i].index = i; + spreading[i].child = child; + + i += 1; + } + } + if (box->homogeneous) { + /* If were homogenous we still need to run the above loop to get the minimum sizes + * for children that are not going to fill + */ + if (private->orientation == GTK_ORIENTATION_HORIZONTAL) + size = allocation->width - border_width * 2 - (nvis_children - 1) * box->spacing; + else + size = allocation->height - border_width * 2 - (nvis_children - 1) * box->spacing; + extra = size / nvis_children; } else { - /* Retrieve desired size for visible children */ - i = 0; - children = box->children; - while (children) - { - child = children->data; - children = children->next; - - if (gtk_widget_get_visible (child->widget)) - { - if (private->orientation == GTK_ORIENTATION_HORIZONTAL) - gtk_extended_layout_get_width_for_height (GTK_EXTENDED_LAYOUT (child->widget), - allocation->height, - &sizes[i].minimum_size, - &sizes[i].natural_size); - else - gtk_extended_layout_get_height_for_width (GTK_EXTENDED_LAYOUT (child->widget), - allocation->width, - &sizes[i].minimum_size, - &sizes[i].natural_size); - - size -= sizes[i].minimum_size; - size -= child->padding * 2; - - spreading[i].index = i; - spreading[i].child = child; - - i += 1; - } - } /* Distribute the container's extra space c_gap. We want to assign * this space such that the sum of extra space assigned to children @@ -574,7 +588,7 @@ gtk_box_size_allocate (GtkWidget *widget, y = allocation->y + allocation->height - border_width; } - i = 0; + i = 0; children = box->children; while (children) { @@ -586,7 +600,6 @@ gtk_box_size_allocate (GtkWidget *widget, if (child->pack == packing) { /* Assign the child's size. */ - if (box->homogeneous) { if (nvis_children == 1) @@ -614,7 +627,6 @@ gtk_box_size_allocate (GtkWidget *widget, } /* Assign the child's position. */ - if (private->orientation == GTK_ORIENTATION_HORIZONTAL) { if (child->fill) @@ -624,7 +636,7 @@ gtk_box_size_allocate (GtkWidget *widget, } else { - child_allocation.width = sizes[i].minimum_size; + child_allocation.width = sizes[i].minimum_size; child_allocation.x = x + (child_size - child_allocation.width) / 2; } @@ -642,7 +654,7 @@ gtk_box_size_allocate (GtkWidget *widget, child_allocation.x -= child_allocation.width; } } - else + else /* (private->orientation == GTK_ORIENTATION_VERTICAL) */ { if (child->fill) { @@ -651,7 +663,7 @@ gtk_box_size_allocate (GtkWidget *widget, } else { - child_allocation.height = sizes[i].minimum_size; + child_allocation.height = sizes[i].minimum_size; child_allocation.y = y + (child_size - child_allocation.height) / 2; } @@ -666,10 +678,11 @@ gtk_box_size_allocate (GtkWidget *widget, child_allocation.y -= child_allocation.height; } } - gtk_widget_size_allocate (child->widget, &child_allocation); + } - i += 1; + + i += 1; } } } -- 2.43.2