summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-03-19 12:02:56 +0000
committerCarlos Garnacho <carlosg@gnome.org>2022-03-19 12:02:56 +0000
commit4a0ddac30751d58ba85de7ebb3f1e7de03b1dd40 (patch)
tree96d285946cb5862b0852f08c881fd32495adb651
parentadc4009354915367c4b71bd655b654a4b4750f39 (diff)
parentf7d9ede82dca41241902d86e5ee7d1997c02f4a2 (diff)
downloadgtk+-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.c6
-rw-r--r--gtk/gtkscrolledwindow.c81
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);