[gtk+] Fixed get_size() for GtkCellRendererText to clip to the input area



commit 9a80100e9ab2430ecc4375ba6bd2f66784ce34a9
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Thu Jan 6 02:29:18 2011 +0900

    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 a6760ee..b2ef07b 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 5f2c2c2..a54b274 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);
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]