Fixed internal native layout algorythm wrt size-request singals/implementations.

Because "size-request" signal can be handled by signal connections as well
as by third party derived classes it is necessary to always fire the
"size-request" signal for every recalculation of the widget requisition,
now gtksizegroup.c:do_size_request() fires the signal first and allows it
to overflow the minimum/natural sizes returned by extended layout
implementations.

GtkWidget->get_natural_size() is now left assigning default -1 values to
ensure they both get overridden by the size-request handling.
This commit is contained in:
Tristan Van Berkom
2010-04-03 20:43:39 -04:00
parent a33053db74
commit 5d83f5eba5
2 changed files with 45 additions and 10 deletions

View File

@@ -659,16 +659,47 @@ do_size_request (GtkWidget *widget)
if (GTK_WIDGET_REQUEST_NEEDED (widget))
{
GtkWidgetAuxInfo *aux_info = _gtk_widget_get_aux_info (widget, TRUE);
GtkRequisition extended_minimum;
gtk_widget_ensure_style (widget);
GTK_PRIVATE_UNSET_FLAG (widget, GTK_REQUEST_NEEDED);
/* First, allow client code to; extended classes or signal connections; to
* modify the initial size request.
*
* Note here that there is no convention of filling the argument or widget->requisition,
* so we have no choice but to fire size request with this pointer.
*/
g_signal_emit_by_name (widget,
"size-request",
&widget->requisition);
/* Now get the extended layout minimum and natural size
*/
gtk_extended_layout_get_desired_size (GTK_EXTENDED_LAYOUT (widget),
&widget->requisition,
&extended_minimum,
&aux_info->natural_size);
/* Base the base widget requisition on both the size-requst and the extended layout size
*/
widget->requisition.width = MAX (widget->requisition.width, extended_minimum.width);
widget->requisition.height = MAX (widget->requisition.height, extended_minimum.height);
/* Additionally allow a "size-request" to overflow the natural size.
*/
aux_info->natural_size.width = MAX (aux_info->natural_size.width, widget->requisition.width);
aux_info->natural_size.height = MAX (aux_info->natural_size.height, widget->requisition.height);
/* Assert that pure extended layout cases return initial minimum sizes smaller or equal
* to their possible natural size.
*
* Note that this only determines the return of gtk_widget_get_desired_size() and caches
* the initial hints. Height for width cases will further be addressed in containers
* using gtk_extended_layout_get_height_for_width().
*/
g_assert (widget->requisition.width <= aux_info->natural_size.width);
g_assert (widget->requisition.height <= aux_info->natural_size.height);
}
}
@@ -682,7 +713,7 @@ compute_base_dimensions (GtkWidget *widget,
get_base_dimensions (widget, mode, minimum_size, natural_size);
}
static gint
static void
compute_dimension (GtkWidget *widget,
GtkSizeGroupMode mode,
gint *minimum_size,
@@ -691,7 +722,6 @@ compute_dimension (GtkWidget *widget,
GSList *widgets = NULL;
GSList *groups = NULL;
GSList *tmp_list;
gint result = 0;
add_widget_to_closure (widget, mode, &groups, &widgets);

View File

@@ -10720,15 +10720,20 @@ gtk_widget_real_get_desired_size (GtkExtendedLayout *layout,
GtkRequisition *minimum_size,
GtkRequisition *natural_size)
{
GtkWidget *widget = GTK_WIDGET (layout);
GtkRequisition requisition = widget->requisition;
g_signal_emit (widget, widget_signals[SIZE_REQUEST], 0, &requisition);
/* Set the initial values so that unimplemented classes will fall back
* on the "size-request" collected values (see gtksizegroup.c:do_size_request()).
*/
if (minimum_size)
*minimum_size = requisition;
{
minimum_size->width = -1;
minimum_size->height = -1;
}
if (natural_size)
*natural_size = requisition;
{
natural_size->width = -1;
natural_size->height = -1;
}
}
static void