face229bb14c30c6e4cff56bc0c1f771f1bd7a59
[mono.git] / bockbuild / mac-sdk / patches / gtk / 0034-Do-not-start-overshooting-for-legacy-mouse-scroll-ev.patch
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
5  events
6
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
10 stuck.
11 ---
12  gtk/gtkscrolledwindow.c |   23 ++++++++++++++++-------
13  1 file changed, 16 insertions(+), 7 deletions(-)
14
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;
26 +
27 +      if (event->phase == GDK_EVENT_SCROLL_PHASE_NONE &&
28 +          event->momentum_phase == GDK_EVENT_SCROLL_PHASE_NONE)
29 +        legacy_mouse = TRUE;
30
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)
35          is_overshot = TRUE;
36
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.
41         */
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)
45          {
46            priv->is_snapping_back = FALSE;
47            priv->gesture_in_progress = TRUE;
48 @@ -2193,8 +2200,9 @@ gtk_scrolled_window_scroll_event (GtkWidget      *widget,
49                 */
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))
57                  may_overshoot = TRUE;
58
59                if (scrolled_window->hscrollbar_visible && (is_overshot || may_overshoot))
60 @@ -2240,8 +2248,9 @@ gtk_scrolled_window_scroll_event (GtkWidget      *widget,
61                 */
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))
69                  may_overshoot = TRUE;
70
71                if (scrolled_window->vscrollbar_visible && (is_overshot || may_overshoot))
72 --
73 1.7.10.2 (Apple Git-33)