diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2022-03-19 12:02:56 +0000 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2022-03-19 12:02:56 +0000 |
commit | 4a0ddac30751d58ba85de7ebb3f1e7de03b1dd40 (patch) | |
tree | 96d285946cb5862b0852f08c881fd32495adb651 | |
parent | adc4009354915367c4b71bd655b654a4b4750f39 (diff) | |
parent | f7d9ede82dca41241902d86e5ee7d1997c02f4a2 (diff) | |
download | gtk+-4a0ddac30751d58ba85de7ebb3f1e7de03b1dd40.tar.gz |
Merge branch 'wip/carlosg/fix-accumulated-velocity' into 'main'
kinetic scroll fixes
See merge request GNOME/gtk!4572
-rw-r--r-- | gtk/gtkkineticscrolling.c | 6 | ||||
-rw-r--r-- | gtk/gtkscrolledwindow.c | 81 |
2 files changed, 46 insertions, 41 deletions
diff --git a/gtk/gtkkineticscrolling.c b/gtk/gtkkineticscrolling.c index 4eab5dcc84..1f02fe7993 100644 --- a/gtk/gtkkineticscrolling.c +++ b/gtk/gtkkineticscrolling.c @@ -181,8 +181,6 @@ gtk_kinetic_scrolling_tick (GtkKineticScrolling *data, { case GTK_KINETIC_SCROLLING_PHASE_DECELERATING: { - double last_position = data->position; - double last_time = data->t; double exp_part; data->t += time_delta; @@ -199,8 +197,7 @@ gtk_kinetic_scrolling_tick (GtkKineticScrolling *data, { gtk_kinetic_scrolling_init_overshoot(data, data->upper, data->position, data->velocity); } - else if (fabs(data->velocity) < 1 || - (last_time != 0.0 && fabs(data->position - last_position) < 1)) + else if (fabs(data->velocity) < 0.1) { gtk_kinetic_scrolling_stop (data); } @@ -254,6 +251,5 @@ gtk_kinetic_scrolling_stop (GtkKineticScrolling *data) { data->phase = GTK_KINETIC_SCROLLING_PHASE_FINISHED; data->position = round (data->position); - data->velocity = 0; } } diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index 416c8288eb..db76dae551 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -1056,6 +1056,11 @@ gtk_scrolled_window_decelerate (GtkScrolledWindow *scrolled_window, gtk_scrolled_window_start_deceleration (scrolled_window); priv->x_velocity = priv->y_velocity = 0; } + else + { + g_clear_pointer (&priv->hscrolling, gtk_kinetic_scrolling_free); + g_clear_pointer (&priv->vscrolling, gtk_kinetic_scrolling_free); + } } static void @@ -3268,6 +3273,7 @@ scrolled_window_deceleration_cb (GtkWidget *widget, GtkAdjustment *hadjustment, *vadjustment; gint64 current_time; double position, elapsed; + gboolean retval = G_SOURCE_REMOVE; current_time = gdk_frame_clock_get_frame_time (frame_clock); elapsed = (current_time - priv->last_deceleration_time) / (double)G_TIME_SPAN_SECOND; @@ -3283,28 +3289,23 @@ scrolled_window_deceleration_cb (GtkWidget *widget, { priv->unclamped_hadj_value = position; gtk_adjustment_set_value (hadjustment, position); + retval = G_SOURCE_CONTINUE; } - else if (priv->hscrolling) - g_clear_pointer (&priv->hscrolling, gtk_kinetic_scrolling_free); if (priv->vscrolling && gtk_kinetic_scrolling_tick (priv->vscrolling, elapsed, &position, NULL)) { priv->unclamped_vadj_value = position; gtk_adjustment_set_value (vadjustment, position); - } - else if (priv->vscrolling) - g_clear_pointer (&priv->vscrolling, gtk_kinetic_scrolling_free); - - if (!priv->hscrolling && !priv->vscrolling) - { - gtk_scrolled_window_cancel_deceleration (scrolled_window); - return G_SOURCE_REMOVE; + retval = G_SOURCE_CONTINUE; } - gtk_scrolled_window_invalidate_overshoot (scrolled_window); + if (retval == G_SOURCE_REMOVE) + gtk_scrolled_window_cancel_deceleration (scrolled_window); + else + gtk_scrolled_window_invalidate_overshoot (scrolled_window); - return G_SOURCE_CONTINUE; + return retval; } static void @@ -3368,19 +3369,23 @@ gtk_scrolled_window_start_deceleration (GtkScrolledWindow *scrolled_window) GtkAdjustment *hadjustment; gtk_scrolled_window_accumulate_velocity (&priv->hscrolling, elapsed, &priv->x_velocity); + g_clear_pointer (&priv->hscrolling, gtk_kinetic_scrolling_free); - hadjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->hscrollbar)); - lower = gtk_adjustment_get_lower (hadjustment); - upper = gtk_adjustment_get_upper (hadjustment); - upper -= gtk_adjustment_get_page_size (hadjustment); - priv->hscrolling = - gtk_kinetic_scrolling_new (lower, - upper, - MAX_OVERSHOOT_DISTANCE, - DECELERATION_FRICTION, - OVERSHOOT_FRICTION, - priv->unclamped_hadj_value, - priv->x_velocity); + if (priv->x_velocity != 0) + { + hadjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->hscrollbar)); + lower = gtk_adjustment_get_lower (hadjustment); + upper = gtk_adjustment_get_upper (hadjustment); + upper -= gtk_adjustment_get_page_size (hadjustment); + priv->hscrolling = + gtk_kinetic_scrolling_new (lower, + upper, + MAX_OVERSHOOT_DISTANCE, + DECELERATION_FRICTION, + OVERSHOOT_FRICTION, + priv->unclamped_hadj_value, + priv->x_velocity); + } } else g_clear_pointer (&priv->hscrolling, gtk_kinetic_scrolling_free); @@ -3391,19 +3396,23 @@ gtk_scrolled_window_start_deceleration (GtkScrolledWindow *scrolled_window) GtkAdjustment *vadjustment; gtk_scrolled_window_accumulate_velocity (&priv->vscrolling, elapsed, &priv->y_velocity); + g_clear_pointer (&priv->vscrolling, gtk_kinetic_scrolling_free); - vadjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->vscrollbar)); - lower = gtk_adjustment_get_lower(vadjustment); - upper = gtk_adjustment_get_upper(vadjustment); - upper -= gtk_adjustment_get_page_size(vadjustment); - priv->vscrolling = - gtk_kinetic_scrolling_new (lower, - upper, - MAX_OVERSHOOT_DISTANCE, - DECELERATION_FRICTION, - OVERSHOOT_FRICTION, - priv->unclamped_vadj_value, - priv->y_velocity); + if (priv->y_velocity != 0) + { + vadjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->vscrollbar)); + lower = gtk_adjustment_get_lower(vadjustment); + upper = gtk_adjustment_get_upper(vadjustment); + upper -= gtk_adjustment_get_page_size(vadjustment); + priv->vscrolling = + gtk_kinetic_scrolling_new (lower, + upper, + MAX_OVERSHOOT_DISTANCE, + DECELERATION_FRICTION, + OVERSHOOT_FRICTION, + priv->unclamped_vadj_value, + priv->y_velocity); + } } else g_clear_pointer (&priv->vscrolling, gtk_kinetic_scrolling_free); |