scrolledwindow: Be smarter at invalidating overshoot areas

The previous way to invalidate was meant to work on the overshoot window
so it wouldn't be as taxing. Since the overshoot window is gone, this
would invalidate way more than intended. So constrain invalidated areas
to the sides where overshoot is happenning at that moment.

https://bugzilla.gnome.org/show_bug.cgi?id=735223
This commit is contained in:
Carlos Garnacho 2014-07-27 13:39:51 +02:00
parent 3df8b95e0e
commit 42c41d7bbd

View File

@ -600,6 +600,53 @@ scrolled_window_drag_begin_cb (GtkScrolledWindow *scrolled_window,
gtk_gesture_set_sequence_state (gesture, sequence, state);
}
static void
gtk_scrolled_window_invalidate_overshoot (GtkScrolledWindow *scrolled_window)
{
GtkAllocation child_allocation, allocation;
gint overshoot_x, overshoot_y;
GdkRectangle rect;
if (!_gtk_scrolled_window_get_overshoot (scrolled_window, &overshoot_x, &overshoot_y))
return;
gtk_widget_get_allocation (GTK_WIDGET (scrolled_window), &allocation);
gtk_scrolled_window_relative_allocation (GTK_WIDGET (scrolled_window),
&child_allocation);
child_allocation.x += allocation.x;
child_allocation.y += allocation.y;
if (overshoot_x != 0)
{
if (overshoot_x < 0)
rect.x = child_allocation.x;
else
rect.x = child_allocation.x + child_allocation.width - MAX_OVERSHOOT_DISTANCE;
rect.y = child_allocation.y;
rect.width = MAX_OVERSHOOT_DISTANCE;
rect.height = child_allocation.height;
gdk_window_invalidate_rect (gtk_widget_get_window (GTK_WIDGET (scrolled_window)),
&rect, TRUE);
}
if (overshoot_y != 0)
{
if (overshoot_y < 0)
rect.y = child_allocation.y;
else
rect.y = child_allocation.y + child_allocation.height - MAX_OVERSHOOT_DISTANCE;
rect.x = child_allocation.x;
rect.width = child_allocation.width;
rect.height = MAX_OVERSHOOT_DISTANCE;
gdk_window_invalidate_rect (gtk_widget_get_window (GTK_WIDGET (scrolled_window)),
&rect, TRUE);
}
}
static void
scrolled_window_drag_update_cb (GtkScrolledWindow *scrolled_window,
gdouble offset_x,
@ -611,6 +658,8 @@ scrolled_window_drag_update_cb (GtkScrolledWindow *scrolled_window,
GtkAdjustment *vadjustment;
gdouble dx, dy;
gtk_scrolled_window_invalidate_overshoot (scrolled_window);
if (!priv->capture_button_press)
{
GdkEventSequence *sequence;
@ -636,8 +685,7 @@ scrolled_window_drag_update_cb (GtkScrolledWindow *scrolled_window,
dy, TRUE, FALSE);
}
gdk_window_invalidate_rect (gtk_widget_get_window (GTK_WIDGET (scrolled_window)),
NULL, FALSE);
gtk_scrolled_window_invalidate_overshoot (scrolled_window);
}
static void
@ -2501,6 +2549,8 @@ scrolled_window_deceleration_cb (GtkWidget *widget,
hadjustment = gtk_range_get_adjustment (GTK_RANGE (priv->hscrollbar));
vadjustment = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar));
gtk_scrolled_window_invalidate_overshoot (scrolled_window);
if (data->hscrolling &&
gtk_kinetic_scrolling_tick (data->hscrolling, elapsed, &position))
{
@ -2525,7 +2575,7 @@ scrolled_window_deceleration_cb (GtkWidget *widget,
return G_SOURCE_REMOVE;
}
gdk_window_invalidate_rect (gtk_widget_get_window (widget), NULL, FALSE);
gtk_scrolled_window_invalidate_overshoot (scrolled_window);
return G_SOURCE_CONTINUE;
}