[gtk+] Fix a problem with 'resize grip avoidance' in scrollbars



commit 9d750ad13eec68baf5734907126aa8676516d7c9
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Oct 8 22:04:33 2010 -0400

    Fix a problem with 'resize grip avoidance' in scrollbars
    
    We need to be a little more careful when determining the overlap
    between the new allocation and the grip area. This was causing
    vertical scrollbars in evince to overlap with the grip.

 gtk/gtkrange.c |   60 +++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 38 insertions(+), 22 deletions(-)
---
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index ab36341..1d0f296 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -1581,7 +1581,7 @@ modify_allocation_for_window_grip (GtkWidget     *widget,
 {
   GtkRange *range = GTK_RANGE (widget);
   GtkRangePrivate *priv = range->priv;
-  GtkWidget *window;
+  GtkWidget *window, *parent;
   GdkRectangle grip_rect;
   GdkRectangle translated_rect;
   gint x;
@@ -1600,35 +1600,51 @@ modify_allocation_for_window_grip (GtkWidget     *widget,
   x = 0;
   y = 0;
 
-  /* Translate the stepper's area into window coords */
-  if (gtk_widget_translate_coordinates (gtk_widget_get_parent (widget),
-                                        window,
-                                        allocation->x,
-                                        allocation->y,
-                                        &x,
-                                        &y))
+  /* Translate the stepper's area into window coords.
+   * This is slightly tricky. We can't just use
+   * gtk_widget_translate_coordinates (widget, window, 0, 0, &x, &y)
+   * since that translates wrt to the _current_ allocation
+   * and will lead to alternating between overlap and nonoverlap
+   * for successive allocations.
+   * Therefore, we find the window-widget to whose window allocation
+   * is relative, and translate from there upwards.
+   */
+  parent = widget;
+  while (gtk_widget_get_window (parent) == gtk_widget_get_window (widget) &&
+         parent != window)
+    {
+      parent = gtk_widget_get_parent (parent);
+    }
+
+  if (parent == window)
+    translated_rect = *allocation;
+  else
     {
+      gtk_widget_translate_coordinates (gtk_widget_get_parent (widget),
+                                        window,
+                                        allocation->x, allocation->y,
+                                        &x, &y);
       translated_rect.x = x;
       translated_rect.y = y;
       translated_rect.width = allocation->width;
       translated_rect.height = allocation->height;
+    }
 
-      /* If the stepper button intersects the window resize grip.. */
-      if (gdk_rectangle_intersect (&grip_rect, &translated_rect, NULL))
+  /* If the stepper button intersects the window resize grip.. */
+  if (gdk_rectangle_intersect (&grip_rect, &translated_rect, NULL))
+    {
+      if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
         {
-          if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
-            {
-              allocation->width -= grip_rect.width;
-              if (gtk_widget_get_direction (window) == GTK_TEXT_DIR_RTL)
-                allocation->x += grip_rect.width;
-            }
-          else
-            {
-              allocation->height -= grip_rect.height;
-            }
-
-          return TRUE;
+          allocation->width -= grip_rect.width;
+          if (gtk_widget_get_direction (window) == GTK_TEXT_DIR_RTL)
+            allocation->x += grip_rect.width;
         }
+      else
+        {
+          allocation->height -= grip_rect.height;
+        }
+
+      return TRUE;
     }
 
   return FALSE;



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