summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hergert <chergert@redhat.com>2016-04-24 02:41:26 -0700
committerMatthias Clasen <mclasen@redhat.com>2016-05-05 15:03:58 -0400
commit6be0f108b43523c3394cb684cdc938a98b4f9f4a (patch)
tree18ed2319571d6c7f6775fd99ac161a76b5c0bf83
parent136409b8cdd86bf74c9db08d6d9e1ffb4aa34d35 (diff)
downloadgtk+-6be0f108b43523c3394cb684cdc938a98b4f9f4a.tar.gz
kineticscrolling: avoid stutter at tail of kinetic deceleration
When decelerating the kinetic scroll, we can get into a position where it looks like we are stuttering. This happens because the amount we move is so little that it takes multiple frames to make forward progress by one pixel. This prevents that by detecting when we have reached the slow stutter of the deceleration and simply stops the deceleration phase immediately. https://bugzilla.gnome.org/show_bug.cgi?id=765493
-rw-r--r--gtk/gtkkineticscrolling.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/gtk/gtkkineticscrolling.c b/gtk/gtkkineticscrolling.c
index c33faee9c3..29bf085674 100644
--- a/gtk/gtkkineticscrolling.c
+++ b/gtk/gtkkineticscrolling.c
@@ -152,6 +152,8 @@ gtk_kinetic_scrolling_tick (GtkKineticScrolling *data,
{
case GTK_KINETIC_SCROLLING_PHASE_DECELERATING:
{
+ gdouble last_position = data->position;
+ gdouble last_time = data->t;
gdouble exp_part;
data->t += time_delta;
@@ -168,7 +170,8 @@ gtk_kinetic_scrolling_tick (GtkKineticScrolling *data,
{
gtk_kinetic_scrolling_init_overshoot(data, data->upper, data->position, data->velocity);
}
- else if (fabs(data->velocity) < 1)
+ else if (fabs(data->velocity) < 1 ||
+ (last_time != 0.0 && fabs(data->position - last_position) < 1))
{
data->phase = GTK_KINETIC_SCROLLING_PHASE_FINISHED;
data->position = round(data->position);