diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index f41b54b390..3570b58567 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -3907,6 +3907,80 @@ gtk_widget_size_allocate (GtkWidget *widget, transform); } +/* translate initial/final into start/end */ +static GtkAlign +effective_align (GtkAlign align, + GtkTextDirection direction) +{ + switch (align) + { + case GTK_ALIGN_START: + return direction == GTK_TEXT_DIR_RTL ? GTK_ALIGN_END : GTK_ALIGN_START; + case GTK_ALIGN_END: + return direction == GTK_TEXT_DIR_RTL ? GTK_ALIGN_START : GTK_ALIGN_END; + case GTK_ALIGN_FILL: + case GTK_ALIGN_CENTER: + case GTK_ALIGN_BASELINE: + default: + return align; + } +} + +static void +adjust_for_align (GtkAlign align, + gint natural_size, + gint *allocated_pos, + gint *allocated_size) +{ + switch (align) + { + case GTK_ALIGN_BASELINE: + case GTK_ALIGN_FILL: + default: + /* change nothing */ + break; + case GTK_ALIGN_START: + /* keep *allocated_pos where it is */ + *allocated_size = MIN (*allocated_size, natural_size); + break; + case GTK_ALIGN_END: + if (*allocated_size > natural_size) + { + *allocated_pos += (*allocated_size - natural_size); + *allocated_size = natural_size; + } + break; + case GTK_ALIGN_CENTER: + if (*allocated_size > natural_size) + { + *allocated_pos += (*allocated_size - natural_size) / 2; + *allocated_size = MIN (*allocated_size, natural_size); + } + break; + } +} + +static void +gtk_widget_adjust_size_allocation (GtkWidget *widget, + GtkOrientation orientation, + gint natural_size, + gint *allocated_pos, + gint *allocated_size) +{ + GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); + + if (orientation == GTK_ORIENTATION_HORIZONTAL) + { + adjust_for_align (effective_align (priv->halign, _gtk_widget_get_direction (widget)), + natural_size, allocated_pos, allocated_size); + } + else + { + adjust_for_align (effective_align (priv->valign, GTK_TEXT_DIR_NONE), + natural_size, allocated_pos, allocated_size); + } +} + /** * gtk_widget_allocate: * @widget: A #GtkWidget @@ -3937,7 +4011,7 @@ gtk_widget_allocate (GtkWidget *widget, gboolean size_changed; gboolean baseline_changed; gboolean transform_changed; - gint natural_width, natural_height, dummy = 0; + gint natural_width, natural_height; gint min_width, min_height; GtkCssStyle *style; GtkBorder margin, border, padding; @@ -3982,7 +4056,13 @@ gtk_widget_allocate (GtkWidget *widget, priv->allocated_height = height; priv->allocated_size_baseline = baseline; - adjusted = (GdkRectangle) { 0, 0, width, height }; + adjusted.x = priv->margin.left; + adjusted.y = priv->margin.top; + adjusted.width = width - priv->margin.left - priv->margin.right; + adjusted.height = height - priv->margin.top - priv->margin.bottom; + if (baseline >= 0) + baseline -= priv->margin.top; + if (gtk_widget_get_request_mode (widget) == GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH) { /* Go ahead and request the height for allocated width, note that the internals @@ -4020,21 +4100,16 @@ gtk_widget_allocate (GtkWidget *widget, * allocated sizes and possibly limit them to the natural sizes */ gtk_widget_adjust_size_allocation (widget, GTK_ORIENTATION_HORIZONTAL, - &dummy, - &natural_width, + natural_width - priv->margin.left - priv->margin.right, &adjusted.x, &adjusted.width); gtk_widget_adjust_size_allocation (widget, GTK_ORIENTATION_VERTICAL, - &dummy, - &natural_height, + natural_height - priv->margin.top - priv->margin.bottom, &adjusted.y, &adjusted.height); size_changed = (priv->width != adjusted.width) || (priv->height != adjusted.height); - if (baseline >= 0) - baseline -= priv->margin.top; - if (adjusted.width < 0 || adjusted.height < 0) { g_warning ("gtk_widget_size_allocate(): attempt to allocate %s %s %p with width %d and height %d", @@ -4290,103 +4365,6 @@ gtk_widget_real_size_allocate (GtkWidget *widget, { } -/* translate initial/final into start/end */ -static GtkAlign -effective_align (GtkAlign align, - GtkTextDirection direction) -{ - switch (align) - { - case GTK_ALIGN_START: - return direction == GTK_TEXT_DIR_RTL ? GTK_ALIGN_END : GTK_ALIGN_START; - case GTK_ALIGN_END: - return direction == GTK_TEXT_DIR_RTL ? GTK_ALIGN_START : GTK_ALIGN_END; - case GTK_ALIGN_FILL: - case GTK_ALIGN_CENTER: - case GTK_ALIGN_BASELINE: - default: - return align; - } -} - -static void -adjust_for_align (GtkAlign align, - gint *natural_size, - gint *allocated_pos, - gint *allocated_size) -{ - switch (align) - { - case GTK_ALIGN_BASELINE: - case GTK_ALIGN_FILL: - default: - /* change nothing */ - break; - case GTK_ALIGN_START: - /* keep *allocated_pos where it is */ - *allocated_size = MIN (*allocated_size, *natural_size); - break; - case GTK_ALIGN_END: - if (*allocated_size > *natural_size) - { - *allocated_pos += (*allocated_size - *natural_size); - *allocated_size = *natural_size; - } - break; - case GTK_ALIGN_CENTER: - if (*allocated_size > *natural_size) - { - *allocated_pos += (*allocated_size - *natural_size) / 2; - *allocated_size = MIN (*allocated_size, *natural_size); - } - break; - } -} - -static void -adjust_for_margin(gint start_margin, - gint end_margin, - gint *minimum_size, - gint *natural_size, - gint *allocated_pos, - gint *allocated_size) -{ - *minimum_size -= (start_margin + end_margin); - *natural_size -= (start_margin + end_margin); - *allocated_pos += start_margin; - *allocated_size -= (start_margin + end_margin); -} - -void -gtk_widget_adjust_size_allocation (GtkWidget *widget, - GtkOrientation orientation, - gint *minimum_size, - gint *natural_size, - gint *allocated_pos, - gint *allocated_size) -{ - GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); - - if (orientation == GTK_ORIENTATION_HORIZONTAL) - { - adjust_for_margin (priv->margin.left, - priv->margin.right, - minimum_size, natural_size, - allocated_pos, allocated_size); - adjust_for_align (effective_align (priv->halign, _gtk_widget_get_direction (widget)), - natural_size, allocated_pos, allocated_size); - } - else - { - adjust_for_margin (priv->margin.top, - priv->margin.bottom, - minimum_size, natural_size, - allocated_pos, allocated_size); - adjust_for_align (effective_align (priv->valign, GTK_TEXT_DIR_NONE), - natural_size, allocated_pos, allocated_size); - } -} - static gboolean gtk_widget_real_can_activate_accel (GtkWidget *widget, guint signal_id) diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h index 21a933606e..93ded92b50 100644 --- a/gtk/gtkwidgetprivate.h +++ b/gtk/gtkwidgetprivate.h @@ -310,12 +310,6 @@ void gtk_widget_adjust_size_request (GtkWidget *widg GtkOrientation orientation, gint *minimum_size, gint *natural_size); -void gtk_widget_adjust_size_allocation (GtkWidget *widget, - GtkOrientation orientation, - gint *minimum_size, - gint *natural_size, - gint *allocated_pos, - gint *allocated_size); void gtk_widget_adjust_baseline_request (GtkWidget *widget, gint *minimum_baseline, gint *natural_baseline);