[gtk+] Fix a problem with 'resize grip avoidance' in scrollbars
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Fix a problem with 'resize grip avoidance' in scrollbars
- Date: Sat, 9 Oct 2010 02:06:54 +0000 (UTC)
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]