mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-19 01:40:10 +00:00
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.
This commit is contained in:
parent
2f8f0d8eab
commit
9d750ad13e
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user