diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index baa652c2b4..99a342de41 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -2367,24 +2367,6 @@ gtk_scrolled_window_cancel_deceleration (GtkScrolledWindow *scrolled_window) g_source_remove (priv->deceleration_id); priv->deceleration_id = 0; } - - /* Ensure the overshoot window is clamped to the adjustments' limits */ - if (_gtk_scrolled_window_get_overshoot (scrolled_window, NULL, NULL)) - { - GtkAdjustment *vadjustment, *hadjustment; - - vadjustment = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); - hadjustment = gtk_range_get_adjustment (GTK_RANGE (priv->hscrollbar)); - - _gtk_scrolled_window_set_adjustment_value (scrolled_window, - vadjustment, - gtk_adjustment_get_value (vadjustment), - FALSE, TRUE); - _gtk_scrolled_window_set_adjustment_value (scrolled_window, - hadjustment, - gtk_adjustment_get_value (hadjustment), - FALSE, TRUE); - } } static void @@ -2446,6 +2428,9 @@ gtk_scrolled_window_release_captured_event (GtkScrolledWindow *scrolled_window) priv->button_press_event = NULL; } + if (_gtk_scrolled_window_get_overshoot (scrolled_window, NULL, NULL)) + gtk_scrolled_window_start_deceleration (scrolled_window); + return FALSE; } @@ -2492,6 +2477,7 @@ gtk_scrolled_window_captured_button_release (GtkWidget *widget, GtkScrolledWindowPrivate *priv = scrolled_window->priv; GtkWidget *child; GdkEventButton *event; + gboolean overshoot; event = (GdkEventButton *)_event; @@ -2511,6 +2497,8 @@ gtk_scrolled_window_captured_button_release (GtkWidget *widget, priv->release_timeout_id = 0; } + overshoot = _gtk_scrolled_window_get_overshoot (scrolled_window, NULL, NULL); + if (priv->in_drag) gdk_device_ungrab (event->device, event->time); else @@ -2520,7 +2508,8 @@ gtk_scrolled_window_captured_button_release (GtkWidget *widget, */ gtk_scrolled_window_release_captured_event (scrolled_window); - return FALSE; + if (!overshoot) + return FALSE; } priv->in_drag = FALSE; @@ -2538,8 +2527,7 @@ gtk_scrolled_window_captured_button_release (GtkWidget *widget, if (!priv->vscrollbar_visible) priv->y_velocity = 0; - if (priv->x_velocity != 0 || priv->y_velocity != 0 || - _gtk_scrolled_window_get_overshoot (scrolled_window, NULL, NULL)) + if (priv->x_velocity != 0 || priv->y_velocity != 0 || overshoot) { gtk_scrolled_window_start_deceleration (scrolled_window); priv->x_velocity = priv->y_velocity = 0; @@ -3312,7 +3300,12 @@ gtk_scrolled_window_grab_notify (GtkWidget *widget, priv->release_timeout_id = 0; } - gtk_scrolled_window_cancel_deceleration (scrolled_window); + if (_gtk_scrolled_window_get_overshoot (scrolled_window, NULL, NULL)) + gtk_scrolled_window_start_deceleration (scrolled_window); + else + gtk_scrolled_window_cancel_deceleration (scrolled_window); + + priv->last_button_event_valid = FALSE; } }