scrolledwindow: Ensure the view snaps back when overshooting

Instead of just stopping the acceleration source ID, check whether
it is overshooting, and let it snap back if needed after ::grab-notify
and ::button-release-event.
This commit is contained in:
Carlos Garnacho
2012-01-04 23:58:13 +01:00
committed by Matthias Clasen
parent bc5eacb185
commit b4f35b4183

View File

@@ -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,6 +2508,7 @@ gtk_scrolled_window_captured_button_release (GtkWidget *widget,
*/
gtk_scrolled_window_release_captured_event (scrolled_window);
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;
}
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;
}
}