From 74be2e9f94214513e3f9abd3a49339efc6f28ea8 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 8 Sep 2015 14:32:50 +0200 Subject: [PATCH] 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. v2: Updated to v4 of the protocol spec by Peter Hutterer v3: Update to use Clutter API --- src/wayland/meta-wayland-pointer.c | 36 +++++++++++++++++++++++++++++ src/wayland/meta-wayland-versions.h | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c index 894a64dd5..9cb20592c 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -494,10 +494,27 @@ handle_scroll_event (MetaWaylandPointer *pointer, { struct wl_resource *resource; wl_fixed_t x_value = 0, y_value = 0; + enum wl_pointer_axis_source source = -1; if (clutter_event_is_pointer_emulated (event)) return; + switch (event->scroll.scroll_source) + { + case CLUTTER_SCROLL_SOURCE_WHEEL: + source = WL_POINTER_AXIS_SOURCE_WHEEL; + break; + case CLUTTER_SCROLL_SOURCE_FINGER: + source = WL_POINTER_AXIS_SOURCE_FINGER; + break; + case CLUTTER_SCROLL_SOURCE_CONTINUOUS: + source = WL_POINTER_AXIS_SOURCE_CONTINUOUS; + break; + default: + source = WL_POINTER_AXIS_SOURCE_WHEEL; + break; + } + switch (clutter_event_get_scroll_direction (event)) { case CLUTTER_SCROLL_UP: @@ -537,12 +554,31 @@ handle_scroll_event (MetaWaylandPointer *pointer, { wl_resource_for_each (resource, &pointer->focus_client->pointer_resources) { + if (wl_resource_get_version (resource) >= WL_POINTER_AXIS_SOURCE_SINCE_VERSION) + wl_pointer_send_axis_source (resource, source); + if (x_value) wl_pointer_send_axis (resource, clutter_event_get_time (event), WL_POINTER_AXIS_HORIZONTAL_SCROLL, x_value); + + if ((event->scroll.finish_flags & CLUTTER_SCROLL_FINISHED_HORIZONTAL) && + wl_resource_get_version (resource) >= WL_POINTER_AXIS_STOP_SINCE_VERSION) + wl_pointer_send_axis_stop (resource, + clutter_event_get_time (event), + WL_POINTER_AXIS_HORIZONTAL_SCROLL); + if (y_value) wl_pointer_send_axis (resource, clutter_event_get_time (event), WL_POINTER_AXIS_VERTICAL_SCROLL, y_value); + + if ((event->scroll.finish_flags & CLUTTER_SCROLL_FINISHED_VERTICAL) && + wl_resource_get_version (resource) >= WL_POINTER_AXIS_STOP_SINCE_VERSION) + wl_pointer_send_axis_stop (resource, + clutter_event_get_time (event), + WL_POINTER_AXIS_VERTICAL_SCROLL); + + if (wl_resource_get_version (resource) >= WL_POINTER_AXIS_SOURCE_SINCE_VERSION) + wl_pointer_send_axis_frame (resource); } } } diff --git a/src/wayland/meta-wayland-versions.h b/src/wayland/meta-wayland-versions.h index 9ca8def69..e0b6b92dc 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