From 9a80100e9ab2430ecc4375ba6bd2f66784ce34a9 Mon Sep 17 00:00:00 2001 From: Tristan Van Berkom Date: Thu, 6 Jan 2011 02:29:18 +0900 Subject: [PATCH] Fixed get_size() for GtkCellRendererText to clip to the input area For ellipsize cells it's important to clip the result of get_size() so that the returned required rectangle is indeed less than or equal to the input rectangle... this is done so that GtkCellArea can accurately paint focus on cells by calling gtk_cell_renderer_get_aligned_area(). Patch also adds assertions to gtk_cell_renderer_get_aligned_area() to ensure this keeps working correctly. --- gtk/gtkcellrenderer.c | 5 +++++ gtk/gtkcellrenderertext.c | 15 +++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/gtk/gtkcellrenderer.c b/gtk/gtkcellrenderer.c index a6760ee1ac..b2ef07b4a5 100644 --- a/gtk/gtkcellrenderer.c +++ b/gtk/gtkcellrenderer.c @@ -1657,4 +1657,9 @@ gtk_cell_renderer_get_aligned_area (GtkCellRenderer *cell, klass = GTK_CELL_RENDERER_GET_CLASS (cell); klass->get_aligned_area (cell, widget, flags, cell_area, aligned_area); + + g_assert (aligned_area->x >= cell_area->x && aligned_area->x < cell_area->x + cell_area->width); + g_assert (aligned_area->y >= cell_area->y && aligned_area->y < cell_area->y + cell_area->height); + g_assert ((aligned_area->x - cell_area->x) + aligned_area->width <= cell_area->width); + g_assert ((aligned_area->y - cell_area->y) + aligned_area->height <= cell_area->height); } diff --git a/gtk/gtkcellrenderertext.c b/gtk/gtkcellrenderertext.c index 5f2c2c2f96..a54b274559 100644 --- a/gtk/gtkcellrenderertext.c +++ b/gtk/gtkcellrenderertext.c @@ -1736,18 +1736,15 @@ get_size (GtkCellRenderer *cell, pango_layout_get_pixel_extents (layout, NULL, &rect); - if (height) - *height = ypad * 2 + rect.height; - - if (width) - *width = xpad * 2 + rect.x + rect.width; - if (cell_area) { gfloat xalign, yalign; gtk_cell_renderer_get_alignment (cell, &xalign, &yalign); + rect.height = MIN (rect.height, cell_area->height - 2 * ypad); + rect.width = MIN (rect.width, cell_area->width - (2 * xpad) - rect.x); + if (x_offset) { if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) @@ -1770,6 +1767,12 @@ get_size (GtkCellRenderer *cell, if (y_offset) *y_offset = 0; } + if (height) + *height = ypad * 2 + rect.height; + + if (width) + *width = xpad * 2 + rect.x + rect.width; + g_object_unref (layout); }