[gtk+] label: Handle crazy corner cases
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] label: Handle crazy corner cases
- Date: Mon, 5 Nov 2012 18:35:37 +0000 (UTC)
commit debe81b1ea4e7fcc46045629875991311159acdc
Author: Benjamin Otte <otte redhat com>
Date: Mon Nov 5 18:55:27 2012 +0100
label: Handle crazy corner cases
With ellipsizing, the ellipsized text can have a smaller height than the
non-ellipsized text. So the wider text is also higher. Example:
.<big>TEXT</big>
will ellipsize to the small text.
Reported-By: Rico Tzschichholz <ricotz t-online de>
gtk/gtklabel.c | 39 +++++++++++++++++++--------------------
1 files changed, 19 insertions(+), 20 deletions(-)
---
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index e5b4849..a3c9283 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -3495,8 +3495,8 @@ get_char_pixels (GtkWidget *label,
static void
gtk_label_get_preferred_layout_size (GtkLabel *label,
- PangoRectangle *widest,
- PangoRectangle *highest)
+ PangoRectangle *smallest,
+ PangoRectangle *widest)
{
GtkLabelPrivate *priv = label->priv;
PangoLayout *layout;
@@ -3538,27 +3538,26 @@ gtk_label_get_preferred_layout_size (GtkLabel *label,
priv->width_chars > -1 ? char_pixels * priv->width_chars
: 0);
- pango_layout_get_extents (layout, NULL, highest);
- highest->width = MAX (highest->width, char_pixels * priv->width_chars);
- highest->x = highest->y = 0;
+ pango_layout_get_extents (layout, NULL, smallest);
+ smallest->width = MAX (smallest->width, char_pixels * priv->width_chars);
+ smallest->x = smallest->y = 0;
if (priv->max_width_chars > -1 && widest->width > char_pixels * priv->max_width_chars)
{
layout = gtk_label_get_measuring_layout (label,
layout,
- MAX (highest->width, char_pixels * priv->max_width_chars));
+ MAX (smallest->width, char_pixels * priv->max_width_chars));
pango_layout_get_extents (layout, NULL, widest);
widest->width = MAX (widest->width, char_pixels * priv->width_chars);
widest->x = widest->y = 0;
}
- g_assert (widest->width >= highest->width);
}
else
{
- *highest = *widest;
+ *smallest = *widest;
}
- g_assert (widest->height <= highest->height);
+ g_assert (widest->width >= smallest->width);
g_object_unref (layout);
}
@@ -3572,10 +3571,10 @@ gtk_label_get_preferred_size (GtkWidget *widget,
GtkLabel *label = GTK_LABEL (widget);
GtkLabelPrivate *priv = label->priv;
PangoRectangle widest_rect;
- PangoRectangle highest_rect;
+ PangoRectangle smallest_rect;
GtkBorder border;
- gtk_label_get_preferred_layout_size (label, &widest_rect, &highest_rect);
+ gtk_label_get_preferred_layout_size (label, &smallest_rect, &widest_rect);
/* Now that we have minimum and natural sizes in pango extents, apply a possible transform */
if (priv->have_transform)
@@ -3587,7 +3586,7 @@ gtk_label_get_preferred_size (GtkWidget *widget,
matrix = pango_context_get_matrix (context);
pango_matrix_transform_rectangle (matrix, &widest_rect);
- pango_matrix_transform_rectangle (matrix, &highest_rect);
+ pango_matrix_transform_rectangle (matrix, &smallest_rect);
/* Bump the size in case of ellipsize to ensure pango has
* enough space in the angles (note, we could alternatively set the
@@ -3602,16 +3601,16 @@ gtk_label_get_preferred_size (GtkWidget *widget,
*/
widest_rect.height += ROTATION_ELLIPSIZE_PADDING * 2 * PANGO_SCALE;
widest_rect.width += ROTATION_ELLIPSIZE_PADDING * 2 * PANGO_SCALE;
- highest_rect.height += ROTATION_ELLIPSIZE_PADDING * 2 * PANGO_SCALE;
- highest_rect.width += ROTATION_ELLIPSIZE_PADDING * 2 * PANGO_SCALE;
+ smallest_rect.height += ROTATION_ELLIPSIZE_PADDING * 2 * PANGO_SCALE;
+ smallest_rect.width += ROTATION_ELLIPSIZE_PADDING * 2 * PANGO_SCALE;
}
}
widest_rect.width = PANGO_PIXELS_CEIL (widest_rect.width);
widest_rect.height = PANGO_PIXELS_CEIL (widest_rect.height);
- highest_rect.width = PANGO_PIXELS_CEIL (highest_rect.width);
- highest_rect.height = PANGO_PIXELS_CEIL (highest_rect.height);
+ smallest_rect.width = PANGO_PIXELS_CEIL (smallest_rect.width);
+ smallest_rect.height = PANGO_PIXELS_CEIL (smallest_rect.height);
_gtk_misc_get_padding_and_border (GTK_MISC (label), &border);
@@ -3628,14 +3627,14 @@ gtk_label_get_preferred_size (GtkWidget *widget,
*/
get_size_for_allocation (label,
GTK_ORIENTATION_VERTICAL,
- highest_rect.height,
+ smallest_rect.height,
minimum_size, natural_size);
}
else
{
/* Normal desired width */
- *minimum_size = highest_rect.width;
+ *minimum_size = smallest_rect.width;
*natural_size = widest_rect.width;
}
@@ -3663,8 +3662,8 @@ gtk_label_get_preferred_size (GtkWidget *widget,
/* A vertically rotated label does w4h, so return the base
* desired height (text length)
*/
- *minimum_size = widest_rect.height;
- *natural_size = highest_rect.height;
+ *minimum_size = MIN (smallest_rect.height, widest_rect.height);
+ *natural_size = MAX (smallest_rect.height, widest_rect.height);
}
*minimum_size += border.top + border.bottom;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]