[gtk+] wayland: Improve checks when flushing scroll events



commit f7108d4d43d233868f4d3dbf7c3b73e19ab1ba05
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Apr 18 14:10:49 2016 +0100

    wayland: Improve checks when flushing scroll events
    
    If we get gdk_wayland_seat_flush_frame_event() with no previous event to be
    flushed, we fallback into the scroll event checks. However, there's no check
    performed there as to whether it really scrolled, so it'd always send a smooth
    scroll event with 0/0 deltas in this case.
    
    This should be mostly harmless, but still, we should only end up emitting scroll
    events if those really happened.

 gdk/wayland/gdkdevice-wayland.c |   41 +++++++++++++++++++++-----------------
 1 files changed, 23 insertions(+), 18 deletions(-)
---
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index 4dc498a..96e5fb6 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -1142,26 +1142,31 @@ flush_scroll_event (GdkWaylandSeat             *seat,
         direction = GDK_SCROLL_DOWN;
 
       flush_discrete_scroll_event (seat, direction);
+      pointer_frame->discrete_x = 0;
+      pointer_frame->discrete_y = 0;
     }
 
-  /* Axes can stop independently, if we stop on one axis but have a
-   * delta on the other, we don't count it as a stop event.
-   */
-  if (pointer_frame->is_scroll_stop &&
-      pointer_frame->delta_x == 0 &&
-      pointer_frame->delta_y == 0)
-    is_stop = TRUE;
-
-  flush_smooth_scroll_event (seat,
-                             pointer_frame->delta_x,
-                             pointer_frame->delta_y,
-                             is_stop);
-
-  pointer_frame->delta_x = 0;
-  pointer_frame->delta_y = 0;
-  pointer_frame->discrete_x = 0;
-  pointer_frame->discrete_y = 0;
-  pointer_frame->is_scroll_stop = FALSE;
+  if (pointer_frame->is_scroll_stop ||
+      pointer_frame->delta_x != 0 ||
+      pointer_frame->delta_y != 0)
+    {
+      /* Axes can stop independently, if we stop on one axis but have a
+       * delta on the other, we don't count it as a stop event.
+       */
+      if (pointer_frame->is_scroll_stop &&
+          pointer_frame->delta_x == 0 &&
+          pointer_frame->delta_y == 0)
+        is_stop = TRUE;
+
+      flush_smooth_scroll_event (seat,
+                                 pointer_frame->delta_x,
+                                 pointer_frame->delta_y,
+                                 is_stop);
+
+      pointer_frame->delta_x = 0;
+      pointer_frame->delta_y = 0;
+      pointer_frame->is_scroll_stop = FALSE;
+    }
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]