1 From 06fe34a85d02df941da86e34cd1d88ef9da52a18 Mon Sep 17 00:00:00 2001
2 From: Kristian Rietveld <kris@lanedo.com>
3 Date: Sun, 17 Feb 2013 13:08:14 +0100
4 Subject: [PATCH 34/68] Do not start overshooting for legacy mouse scroll
7 Doing overshooting properly relies on the detection of gestures.
8 For legacy devices that do emit precise deltas but no (gesture) phase,
9 simply disallow overshooting so that the state machine does not get
12 gtk/gtkscrolledwindow.c | 23 ++++++++++++++++-------
13 1 file changed, 16 insertions(+), 7 deletions(-)
15 diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
16 index 77bb5af..4159af8 100644
17 --- a/gtk/gtkscrolledwindow.c
18 +++ b/gtk/gtkscrolledwindow.c
19 @@ -2141,7 +2141,12 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget,
20 gint old_overshoot_x, old_overshoot_y;
21 gboolean start_snap_back = FALSE;
22 gboolean is_overshot = FALSE;
23 - gboolean is_momentum_event = event->phase == GDK_EVENT_SCROLL_PHASE_NONE;
24 + gboolean is_momentum_event = event->momentum_phase != GDK_EVENT_SCROLL_PHASE_NONE;
25 + gboolean legacy_mouse = FALSE;
27 + if (event->phase == GDK_EVENT_SCROLL_PHASE_NONE &&
28 + event->momentum_phase == GDK_EVENT_SCROLL_PHASE_NONE)
29 + legacy_mouse = TRUE;
31 _gtk_scrolled_window_get_overshoot (scrolled_window,
32 &old_overshoot_x, &old_overshoot_y);
33 @@ -2150,10 +2155,12 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget,
34 if (old_overshoot_x != 0 || old_overshoot_y != 0)
37 - /* If a new gesture has started, reset snap back state.
38 + /* If a new gesture has started or we detect the end of a momentum
39 + * phase, reset snap back state.
40 * FIXME: check if overshoot has really ended.
42 - if (event->phase == GDK_EVENT_SCROLL_PHASE_START)
43 + if (event->momentum_phase == GDK_EVENT_SCROLL_PHASE_END ||
44 + event->phase == GDK_EVENT_SCROLL_PHASE_START)
46 priv->is_snapping_back = FALSE;
47 priv->gesture_in_progress = TRUE;
48 @@ -2193,8 +2200,9 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget,
50 adj = gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar));
51 gdouble max_adj = gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj);
52 - if (gtk_adjustment_get_value (adj) < 1.0 ||
53 - gtk_adjustment_get_value (adj) > max_adj - 1.0)
54 + if (!legacy_mouse &&
55 + (gtk_adjustment_get_value (adj) < 1.0 ||
56 + gtk_adjustment_get_value (adj) > max_adj - 1.0))
59 if (scrolled_window->hscrollbar_visible && (is_overshot || may_overshoot))
60 @@ -2240,8 +2248,9 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget,
62 adj = gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar));
63 gdouble max_adj = gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj);
64 - if (gtk_adjustment_get_value (adj) < 1.0 ||
65 - gtk_adjustment_get_value (adj) > max_adj - 1.0)
66 + if (!legacy_mouse &&
67 + (gtk_adjustment_get_value (adj) < 1.0 ||
68 + gtk_adjustment_get_value (adj) > max_adj - 1.0))
71 if (scrolled_window->vscrollbar_visible && (is_overshot || may_overshoot))
73 1.7.10.2 (Apple Git-33)