gtk,scrolledwindow: Ensure the view snaps back when overshooting
Instead of just stopping the acceleration source ID, check whether it's overshooting, and let it snap back if needed after ::grab-notify and ::button-release-event
This commit is contained in:
@@ -2351,24 +2351,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
|
||||
@@ -2430,6 +2412,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;
|
||||
}
|
||||
|
||||
@@ -2476,6 +2461,7 @@ gtk_scrolled_window_captured_button_release (GtkWidget *widget,
|
||||
GtkScrolledWindowPrivate *priv = scrolled_window->priv;
|
||||
GtkWidget *child;
|
||||
GdkEventButton *event;
|
||||
gboolean overshoot;
|
||||
|
||||
event = (GdkEventButton *)_event;
|
||||
|
||||
@@ -2495,6 +2481,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
|
||||
@@ -2504,7 +2492,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;
|
||||
|
||||
@@ -2522,8 +2511,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;
|
||||
@@ -3310,7 +3298,10 @@ 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_x_root = -TOUCH_BYPASS_CAPTURED_THRESHOLD;
|
||||
priv->last_button_event_y_root = -TOUCH_BYPASS_CAPTURED_THRESHOLD;
|
||||
|
||||
Reference in New Issue
Block a user