diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2021-04-01 12:14:10 +0000 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2021-04-01 12:14:10 +0000 |
commit | 0ec077bcdce0c36137bfd8496e7cd8ab75e881b7 (patch) | |
tree | deb4ab5eb030507e1d311cbf8b567def42363643 | |
parent | 4ac8889d64f71597cc28919cbb18a6e46dfbb1de (diff) | |
parent | 27d38eca9a14fe32893ce5e97d2f0b542458f342 (diff) | |
download | gtk+-0ec077bcdce0c36137bfd8496e7cd8ab75e881b7.tar.gz |
Merge branch 'wip/exalm/overshoot-changes-gtk3' into 'gtk-3-24'
scrolledwindow: Cancel overshoot on dimension changes
See merge request GNOME/gtk!3333
-rw-r--r-- | gtk/gtkkineticscrolling.c | 29 | ||||
-rw-r--r-- | gtk/gtkkineticscrolling.h | 11 | ||||
-rw-r--r-- | gtk/gtkscrolledwindow.c | 39 |
3 files changed, 79 insertions, 0 deletions
diff --git a/gtk/gtkkineticscrolling.c b/gtk/gtkkineticscrolling.c index 9036e158dc..497627000b 100644 --- a/gtk/gtkkineticscrolling.c +++ b/gtk/gtkkineticscrolling.c @@ -124,6 +124,35 @@ gtk_kinetic_scrolling_new (gdouble lower, return data; } +GtkKineticScrollingChange +gtk_kinetic_scrolling_update_size (GtkKineticScrolling *data, + gdouble lower, + gdouble upper) +{ + GtkKineticScrollingChange change = GTK_KINETIC_SCROLLING_CHANGE_NONE; + + if (lower != data->lower) + { + if (data->position <= lower) + change |= GTK_KINETIC_SCROLLING_CHANGE_LOWER; + + data->lower = lower; + } + + if (upper != data->upper) + { + if (data->position >= data->upper) + change |= GTK_KINETIC_SCROLLING_CHANGE_UPPER; + + data->upper = upper; + } + + if (data->phase == GTK_KINETIC_SCROLLING_PHASE_OVERSHOOTING) + change |= GTK_KINETIC_SCROLLING_CHANGE_IN_OVERSHOOT; + + return change; +} + void gtk_kinetic_scrolling_free (GtkKineticScrolling *kinetic) { diff --git a/gtk/gtkkineticscrolling.h b/gtk/gtkkineticscrolling.h index d00f1d05f6..8155d57687 100644 --- a/gtk/gtkkineticscrolling.h +++ b/gtk/gtkkineticscrolling.h @@ -23,6 +23,13 @@ G_BEGIN_DECLS +typedef enum { + GTK_KINETIC_SCROLLING_CHANGE_NONE = 0, + GTK_KINETIC_SCROLLING_CHANGE_LOWER = 1 << 0, + GTK_KINETIC_SCROLLING_CHANGE_UPPER = 1 << 1, + GTK_KINETIC_SCROLLING_CHANGE_IN_OVERSHOOT = 1 << 2, +} GtkKineticScrollingChange; + typedef struct _GtkKineticScrolling GtkKineticScrolling; GtkKineticScrolling * gtk_kinetic_scrolling_new (gdouble lower, @@ -34,6 +41,10 @@ GtkKineticScrolling * gtk_kinetic_scrolling_new (gdouble lower gdouble initial_velocity); void gtk_kinetic_scrolling_free (GtkKineticScrolling *kinetic); +GtkKineticScrollingChange gtk_kinetic_scrolling_update_size (GtkKineticScrolling *data, + gdouble lower, + gdouble upper); + gboolean gtk_kinetic_scrolling_tick (GtkKineticScrolling *data, gdouble time_delta, gdouble *position, diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index bea7339f39..1909077220 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -3900,6 +3900,24 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment, if (priv->hscrollbar_visible != visible) gtk_widget_queue_resize (GTK_WIDGET (scrolled_window)); + + if (priv->hscrolling) + { + GtkKineticScrollingChange change; + gdouble lower = gtk_adjustment_get_lower (adjustment); + gdouble upper = gtk_adjustment_get_upper (adjustment); + upper -= gtk_adjustment_get_page_size (adjustment); + + change = gtk_kinetic_scrolling_update_size (priv->hscrolling, lower, upper); + + if ((change & GTK_KINETIC_SCROLLING_CHANGE_IN_OVERSHOOT) && + (change & (GTK_KINETIC_SCROLLING_CHANGE_UPPER | GTK_KINETIC_SCROLLING_CHANGE_LOWER))) + { + g_clear_pointer (&priv->hscrolling, gtk_kinetic_scrolling_free); + priv->unclamped_hadj_value = gtk_adjustment_get_value (adjustment); + gtk_scrolled_window_invalidate_overshoot (scrolled_window); + } + } } } else if (adjustment == gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar))) @@ -3914,8 +3932,29 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment, if (priv->vscrollbar_visible != visible) gtk_widget_queue_resize (GTK_WIDGET (scrolled_window)); + + if (priv->vscrolling) + { + GtkKineticScrollingChange change; + gdouble lower = gtk_adjustment_get_lower (adjustment); + gdouble upper = gtk_adjustment_get_upper (adjustment); + upper -= gtk_adjustment_get_page_size (adjustment); + + change = gtk_kinetic_scrolling_update_size (priv->vscrolling, lower, upper); + + if ((change & GTK_KINETIC_SCROLLING_CHANGE_IN_OVERSHOOT) && + (change & (GTK_KINETIC_SCROLLING_CHANGE_UPPER | GTK_KINETIC_SCROLLING_CHANGE_LOWER))) + { + g_clear_pointer (&priv->vscrolling, gtk_kinetic_scrolling_free); + priv->unclamped_vadj_value = gtk_adjustment_get_value (adjustment); + gtk_scrolled_window_invalidate_overshoot (scrolled_window); + } + } } } + + if (!priv->hscrolling && !priv->vscrolling) + gtk_scrolled_window_cancel_deceleration (scrolled_window); } static void |