adjust_for_align (GtkAlign align,
int natural_size,
int *allocated_pos,
- int *allocated_size)
+ int *allocated_size,
+ int nat_baseline,
+ int *allocated_baseline)
{
switch (align)
{
case GTK_ALIGN_BASELINE:
+ if (*allocated_size > natural_size &&
+ nat_baseline > -1 &&
+ *allocated_baseline > -1)
+ {
+ *allocated_pos = *allocated_baseline - nat_baseline;
+ *allocated_size = MIN (*allocated_size, natural_size);
+ *allocated_baseline = nat_baseline;
+ }
+ break;
case GTK_ALIGN_FILL:
default:
/* change nothing */
static inline void
gtk_widget_adjust_size_allocation (GtkWidget *widget,
- GtkAllocation *allocation)
+ GtkAllocation *allocation,
+ int *baseline)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
int natural_width, natural_height;
int min_width, min_height;
+ int nat_baseline;
if (priv->halign == GTK_ALIGN_FILL && priv->valign == GTK_ALIGN_FILL)
return;
adjust_for_align (effective_align (priv->halign, _gtk_widget_get_direction (widget)),
natural_width - priv->margin.left - priv->margin.right,
&allocation->x,
- &allocation->width);
+ &allocation->width,
+ -1, NULL);
gtk_widget_measure (widget, GTK_ORIENTATION_VERTICAL,
allocation->width + priv->margin.left + priv->margin.right,
- &min_height, &natural_height, NULL, NULL);
+ NULL, &natural_height, NULL, &nat_baseline);
adjust_for_align (priv->valign,
natural_height - priv->margin.top - priv->margin.bottom,
&allocation->y,
- &allocation->height);
+ &allocation->height,
+ nat_baseline - priv->margin.top,
+ baseline);
}
else
{
&min_height, NULL, NULL, NULL);
gtk_widget_measure (widget, GTK_ORIENTATION_VERTICAL,
-1,
- NULL, &natural_height, NULL, NULL);
+ NULL, &natural_height, NULL, &nat_baseline);
natural_height = MAX (min_height, natural_height);
adjust_for_align (priv->valign,
- natural_height - priv->margin.top - priv->margin.bottom,
+ natural_height - priv->margin.top - priv->margin.bottom,
&allocation->y,
- &allocation->height);
+ &allocation->height,
+ nat_baseline - priv->margin.top,
+ baseline);
gtk_widget_measure (widget, GTK_ORIENTATION_HORIZONTAL,
allocation->height + priv->margin.top + priv->margin.bottom,
&min_width, &natural_width, NULL, NULL);
adjust_for_align (effective_align (priv->halign, _gtk_widget_get_direction (widget)),
natural_width - priv->margin.left - priv->margin.right,
&allocation->x,
- &allocation->width);
+ &allocation->width,
+ -1, NULL);
}
}
if (baseline >= 0)
baseline -= priv->margin.top;
- gtk_widget_adjust_size_allocation (widget, &adjusted);
+ gtk_widget_adjust_size_allocation (widget, &adjusted, &baseline);
if (adjusted.width < 0 || adjusted.height < 0)
{