[mutter/wip/garnacho/wayland-extra-scroll-events] wayland: Implement wl_pointer.axis_source/axis_stop/axis_frame emission



commit 637e3d7f5a44764aab23a4cc673fb7446acbca09
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Sep 8 14:32:50 2015 +0200

    wayland: Implement wl_pointer.axis_source/axis_stop/axis_frame emission
    
    As per the spec. wl_pointer.axis_source determines the current source of
    scroll events, wl_pointer.axis_stop determines when there's no further
    scroll events on any axis (Which Clutter sends as dx/dy=0 events).
    wl_pointer.axis_frame marks the end of a series of axis_* events.

 src/wayland/meta-wayland-pointer.c  |   45 +++++++++++++++++++++++++++++++++++
 src/wayland/meta-wayland-versions.h |    2 +-
 2 files changed, 46 insertions(+), 1 deletions(-)
---
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
index 894a64d..b834c57 100644
--- a/src/wayland/meta-wayland-pointer.c
+++ b/src/wayland/meta-wayland-pointer.c
@@ -494,10 +494,23 @@ handle_scroll_event (MetaWaylandPointer *pointer,
 {
   struct wl_resource *resource;
   wl_fixed_t x_value = 0, y_value = 0;
+  ClutterInputDevice *dev;
+  enum wl_pointer_axis_source source = -1;
 
   if (clutter_event_is_pointer_emulated (event))
     return;
 
+  dev = clutter_event_get_source_device (event);
+  switch (clutter_input_device_get_device_type (dev))
+    {
+    case CLUTTER_TOUCHPAD_DEVICE:
+      source = WL_POINTER_AXIS_SOURCE_FINGER;
+      break;
+    default:
+      source = WL_POINTER_AXIS_SOURCE_WHEEL;
+      break;
+    }
+
   switch (clutter_event_get_scroll_direction (event))
     {
     case CLUTTER_SCROLL_UP:
@@ -543,6 +556,38 @@ handle_scroll_event (MetaWaylandPointer *pointer,
           if (y_value)
             wl_pointer_send_axis (resource, clutter_event_get_time (event),
                                   WL_POINTER_AXIS_VERTICAL_SCROLL, y_value);
+
+          if (wl_resource_get_version (resource) >= WL_POINTER_AXIS_SOURCE_SINCE_VERSION)
+            {
+              if (clutter_event_get_scroll_direction (event) == CLUTTER_SCROLL_SMOOTH)
+                {
+                  struct wl_array stopped_axes;
+                  uint32_t *axis;
+
+                  wl_array_init (&stopped_axes);
+
+                  if (!x_value)
+                    {
+                      axis = wl_array_add (&stopped_axes, sizeof (*axis));
+                      *axis = WL_POINTER_AXIS_HORIZONTAL_SCROLL;
+                    }
+
+                  if (!y_value)
+                    {
+                      axis = wl_array_add (&stopped_axes, sizeof (*axis));
+                      *axis = WL_POINTER_AXIS_VERTICAL_SCROLL;
+                    }
+
+                  if (stopped_axes.size > 0)
+                    wl_pointer_send_axis_stop (resource,
+                                               clutter_event_get_time (event),
+                                               &stopped_axes);
+                  wl_array_release (&stopped_axes);
+                }
+
+              wl_pointer_send_axis_source (resource, source);
+              wl_pointer_send_axis_frame (resource);
+            }
         }
     }
 }
diff --git a/src/wayland/meta-wayland-versions.h b/src/wayland/meta-wayland-versions.h
index 9ca8def..e0b6b92 100644
--- a/src/wayland/meta-wayland-versions.h
+++ b/src/wayland/meta-wayland-versions.h
@@ -39,7 +39,7 @@
 #define META_WL_DATA_DEVICE_MANAGER_VERSION 2
 #define META_XDG_SHELL_VERSION              1
 #define META_WL_SHELL_VERSION               1
-#define META_WL_SEAT_VERSION                4
+#define META_WL_SEAT_VERSION                5
 #define META_WL_OUTPUT_VERSION              2
 #define META_XSERVER_VERSION                1
 #define META_GTK_SHELL_VERSION              2


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