This is accompanied by separate handlers for the different stages
of swipe/pinch gestures, so those can be set in demos.

v5: Update to zwp namespace
v4: Indenting fix.
v3: added null checks around pointer gesture interface destruction,
    nullify afterwards.
v2: depend on standalone protocol xml.

Signed-off-by: Carlos Garnacho <carl...@gnome.org>
Reviewed-by: Jonas Ã…dahl <jad...@gmail.com>
Reviewed-by: Bryce Harrington <br...@osg.samsung.com>
---
 Makefile.am      |   6 +-
 clients/window.c | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 clients/window.h |  54 +++++++++++++
 3 files changed, 288 insertions(+), 2 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index d41acd6..6fd5552 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -652,6 +652,8 @@ libtoytoolkit_la_SOURCES =                          \
        shared/helpers.h
 
 nodist_libtoytoolkit_la_SOURCES =                      \
+       protocol/pointer-gestures-protocol.c            \
+       protocol/pointer-gestures-client-protocol.h     \
        protocol/text-cursor-position-protocol.c        \
        protocol/text-cursor-position-client-protocol.h \
        protocol/viewporter-protocol.c                  \
@@ -663,7 +665,9 @@ nodist_libtoytoolkit_la_SOURCES =                   \
        protocol/pointer-constraints-unstable-v1-protocol.c             \
        protocol/pointer-constraints-unstable-v1-client-protocol.h      \
        protocol/relative-pointer-unstable-v1-protocol.c                \
-       protocol/relative-pointer-unstable-v1-client-protocol.h
+       protocol/relative-pointer-unstable-v1-client-protocol.h         \
+       protocol/pointer-gestures-unstable-v1-protocol.c                \
+       protocol/pointer-gestures-unstable-v1-client-protocol.h
 
 BUILT_SOURCES += $(nodist_libtoytoolkit_la_SOURCES)
 
diff --git a/clients/window.c b/clients/window.c
index 59fc07e..248605f 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -78,6 +78,7 @@ typedef void *EGLContext;
 #include "text-cursor-position-client-protocol.h"
 #include "pointer-constraints-unstable-v1-client-protocol.h"
 #include "relative-pointer-unstable-v1-client-protocol.h"
+#include "pointer-gestures-unstable-v1-client-protocol.h"
 #include "shared/os-compatibility.h"
 
 #include "window.h"
@@ -110,6 +111,7 @@ struct display {
        struct ivi_application *ivi_application; /* ivi style shell */
        struct zwp_relative_pointer_manager_v1 *relative_pointer_manager;
        struct zwp_pointer_constraints_v1 *pointer_constraints;
+       struct zwp_pointer_gestures_v1 *pointer_gestures;
        EGLDisplay dpy;
        EGLConfig argb_config;
        EGLContext argb_ctx;
@@ -247,7 +249,6 @@ struct window {
 
        int fullscreen;
        int maximized;
-
        enum preferred_format preferred_format;
 
        window_key_handler_t key_handler;
@@ -316,6 +317,12 @@ struct widget {
        widget_axis_source_handler_t axis_source_handler;
        widget_axis_stop_handler_t axis_stop_handler;
        widget_axis_discrete_handler_t axis_discrete_handler;
+       widget_pointer_gesture_swipe_begin_handler_t swipe_begin_handler;
+       widget_pointer_gesture_swipe_update_handler_t swipe_update_handler;
+       widget_pointer_gesture_swipe_end_handler_t swipe_end_handler;
+       widget_pointer_gesture_pinch_begin_handler_t pinch_begin_handler;
+       widget_pointer_gesture_pinch_update_handler_t pinch_update_handler;
+       widget_pointer_gesture_pinch_end_handler_t pinch_end_handler;
        void *user_data;
        int opaque;
        int tooltip_count;
@@ -340,6 +347,8 @@ struct input {
        struct wl_pointer *pointer;
        struct wl_keyboard *keyboard;
        struct wl_touch *touch;
+       struct zwp_pointer_gesture_pinch_v1 *pinch;
+       struct zwp_pointer_gesture_swipe_v1 *swipe;
        struct wl_list touch_point_list;
        struct window *pointer_focus;
        struct window *keyboard_focus;
@@ -2006,6 +2015,48 @@ widget_set_axis_handlers(struct widget *widget,
        widget->axis_discrete_handler = axis_discrete_handler;
 }
 
+void
+widget_set_pointer_gesture_swipe_begin_handler(struct widget *widget,
+                                              
widget_pointer_gesture_swipe_begin_handler_t handler)
+{
+       widget->swipe_begin_handler = handler;
+}
+
+void
+widget_set_pointer_gesture_swipe_update_handler(struct widget *widget,
+                                               
widget_pointer_gesture_swipe_update_handler_t handler)
+{
+       widget->swipe_update_handler = handler;
+}
+
+void
+widget_set_pointer_gesture_swipe_end_handler(struct widget *widget,
+                                            
widget_pointer_gesture_swipe_end_handler_t handler)
+{
+       widget->swipe_end_handler = handler;
+}
+
+void
+widget_set_pointer_gesture_pinch_begin_handler(struct widget *widget,
+                                              
widget_pointer_gesture_pinch_begin_handler_t handler)
+{
+       widget->pinch_begin_handler = handler;
+}
+
+void
+widget_set_pointer_gesture_pinch_update_handler(struct widget *widget,
+                                               
widget_pointer_gesture_pinch_update_handler_t handler)
+{
+       widget->pinch_update_handler = handler;
+}
+
+void
+widget_set_pointer_gesture_pinch_end_handler(struct widget *widget,
+                                            
widget_pointer_gesture_pinch_end_handler_t handler)
+{
+       widget->pinch_end_handler = handler;
+}
+
 static void
 window_schedule_redraw_task(struct window *window);
 
@@ -3434,6 +3485,177 @@ static const struct wl_touch_listener touch_listener = {
 };
 
 static void
+gesture_swipe_handle_begin(void *data,
+                          struct zwp_pointer_gesture_swipe_v1 *swipe,
+                          uint32_t serial, uint32_t time,
+                          struct wl_surface *surface, uint32_t n_fingers)
+{
+       struct input *input = data;
+       struct widget *widget;
+
+       if (input->grab)
+               widget = input->grab;
+       else
+               widget = input->focus_widget;
+
+       if (widget && widget->swipe_begin_handler) {
+               widget->swipe_begin_handler(input->focus_widget, input,
+                                           time, n_fingers, widget->user_data);
+       }
+}
+
+static void
+gesture_swipe_handle_update(void *data,
+                           struct zwp_pointer_gesture_swipe_v1 *swipe,
+                           uint32_t time, wl_fixed_t dx, wl_fixed_t dy)
+{
+       struct input *input = data;
+       struct widget *widget;
+
+       if (input->grab)
+               widget = input->grab;
+       else
+               widget = input->focus_widget;
+
+       if (widget && widget->swipe_update_handler) {
+               widget->swipe_update_handler(input->focus_widget, input, time,
+                                            wl_fixed_to_double(dx),
+                                            wl_fixed_to_double(dy),
+                                            widget->user_data);
+       }
+}
+
+static void
+gesture_swipe_handle_end(void *data, struct zwp_pointer_gesture_swipe_v1 
*swipe,
+                        uint32_t serial, uint32_t time, int32_t cancelled)
+{
+       struct input *input = data;
+       struct widget *widget;
+
+       if (input->grab)
+               widget = input->grab;
+       else
+               widget = input->focus_widget;
+
+       if (widget && widget->swipe_end_handler) {
+               widget->swipe_end_handler(input->focus_widget, input, time,
+                                         cancelled, widget->user_data);
+       }
+}
+
+static const struct zwp_pointer_gesture_swipe_v1_listener 
pointer_swipe_listener = {
+       gesture_swipe_handle_begin,
+       gesture_swipe_handle_update,
+       gesture_swipe_handle_end
+};
+
+static void
+gesture_pinch_handle_begin(void *data,
+                          struct zwp_pointer_gesture_pinch_v1 *pinch,
+                          uint32_t serial, uint32_t time,
+                          struct wl_surface *surface, uint32_t n_fingers)
+{
+       struct input *input = data;
+       struct widget *widget;
+
+       if (input->grab)
+               widget = input->grab;
+       else
+               widget = input->focus_widget;
+
+       if (widget && widget->pinch_begin_handler) {
+               widget->pinch_begin_handler(input->focus_widget, input,
+                                           time, n_fingers, widget->user_data);
+       }
+}
+
+static void
+gesture_pinch_handle_update(void *data,
+                           struct zwp_pointer_gesture_pinch_v1 *pinch,
+                           uint32_t time, wl_fixed_t dx, wl_fixed_t dy,
+                           wl_fixed_t scale, wl_fixed_t rotation_delta)
+{
+       struct input *input = data;
+       struct widget *widget;
+
+       if (input->grab)
+               widget = input->grab;
+       else
+               widget = input->focus_widget;
+
+       if (widget && widget->pinch_update_handler) {
+               widget->pinch_update_handler(input->focus_widget, input, time,
+                                            wl_fixed_to_double(dx),
+                                            wl_fixed_to_double(dy),
+                                            wl_fixed_to_double(scale),
+                                            wl_fixed_to_double(rotation_delta),
+                                            widget->user_data);
+       }
+}
+
+static void
+gesture_pinch_handle_end(void *data, struct zwp_pointer_gesture_pinch_v1 
*pinch,
+                        uint32_t serial, uint32_t time, int32_t cancelled)
+{
+       struct input *input = data;
+       struct widget *widget;
+
+       if (input->grab)
+               widget = input->grab;
+       else
+               widget = input->focus_widget;
+
+       if (widget && widget->pinch_end_handler) {
+               widget->pinch_end_handler(input->focus_widget, input, time,
+                                         cancelled, widget->user_data);
+       }
+}
+
+static const struct zwp_pointer_gesture_pinch_v1_listener 
pointer_pinch_listener = {
+       gesture_pinch_handle_begin,
+       gesture_pinch_handle_update,
+       gesture_pinch_handle_end
+};
+
+static void
+init_pointer_gestures(struct input *input)
+{
+       struct display *display = input->display;
+
+       if (!display->pointer_gestures)
+               return;
+
+       input->pinch =
+               
zwp_pointer_gestures_v1_get_pinch_gesture(display->pointer_gestures,
+                                                         input->pointer);
+       zwp_pointer_gesture_pinch_v1_add_listener(input->pinch,
+                                                 &pointer_pinch_listener,
+                                                 input);
+       zwp_pointer_gesture_pinch_v1_set_user_data(input->pinch, input);
+
+       input->swipe =
+               
zwp_pointer_gestures_v1_get_swipe_gesture(display->pointer_gestures,
+                                                         input->pointer);
+       zwp_pointer_gesture_swipe_v1_add_listener(input->swipe,
+                                                 &pointer_swipe_listener,
+                                                 input);
+       zwp_pointer_gesture_swipe_v1_set_user_data(input->swipe, input);
+}
+
+static void
+dispose_pointer_gestures(struct input *input)
+{
+       if (input->pinch) {
+               zwp_pointer_gesture_pinch_v1_destroy(input->pinch);
+               input->pinch = NULL;
+       }
+       if (input->swipe) {
+               zwp_pointer_gesture_swipe_v1_destroy(input->swipe);
+               input->swipe = NULL;
+       }
+}
+
+static void
 seat_handle_capabilities(void *data, struct wl_seat *seat,
                         enum wl_seat_capability caps)
 {
@@ -3444,7 +3666,9 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
                wl_pointer_set_user_data(input->pointer, input);
                wl_pointer_add_listener(input->pointer, &pointer_listener,
                                        input);
+               init_pointer_gestures(input);
        } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) {
+               dispose_pointer_gestures(input);
                if (input->seat_version >= WL_POINTER_RELEASE_SINCE_VERSION)
                        wl_pointer_release(input->pointer);
                else
@@ -6012,6 +6236,10 @@ registry_handle_global(void *data, struct wl_registry 
*registry, uint32_t id,
                d->subcompositor =
                        wl_registry_bind(registry, id,
                                         &wl_subcompositor_interface, 1);
+       } else if (strcmp(interface, "zwp_pointer_gestures_v1") == 0) {
+               d->pointer_gestures =
+                       wl_registry_bind(registry, id,
+                                        &zwp_pointer_gestures_v1_interface, 1);
        }
        else if (strcmp(interface, "ivi_application") == 0) {
                d->ivi_application =
diff --git a/clients/window.h b/clients/window.h
index 1ec9eac..c11fdc3 100644
--- a/clients/window.h
+++ b/clients/window.h
@@ -307,6 +307,41 @@ typedef void (*widget_axis_discrete_handler_t)(struct 
widget *widget,
                                               int32_t discrete,
                                               void *data);
 
+typedef void (*widget_pointer_gesture_swipe_begin_handler_t)(struct widget 
*widget,
+                                                            struct input 
*input,
+                                                            uint32_t time,
+                                                            uint32_t n_fingers,
+                                                            void *data);
+typedef void (*widget_pointer_gesture_swipe_update_handler_t)(struct widget 
*widget,
+                                                             struct input 
*input,
+                                                             uint32_t time,
+                                                             float dx,
+                                                             float dy,
+                                                             void *data);
+typedef void (*widget_pointer_gesture_swipe_end_handler_t)(struct widget 
*widget,
+                                                          struct input *input,
+                                                          uint32_t time,
+                                                          int32_t cancelled,
+                                                          void *data);
+typedef void (*widget_pointer_gesture_pinch_begin_handler_t)(struct widget 
*widget,
+                                                            struct input 
*input,
+                                                            uint32_t time,
+                                                            uint32_t n_fingers,
+                                                            void *data);
+typedef void (*widget_pointer_gesture_pinch_update_handler_t)(struct widget 
*widget,
+                                                             struct input 
*input,
+                                                             uint32_t time,
+                                                             float dx,
+                                                             float dy,
+                                                             float scale,
+                                                             float 
rotation_delta,
+                                                             void *data);
+typedef void (*widget_pointer_gesture_pinch_end_handler_t)(struct widget 
*widget,
+                                                          struct input *input,
+                                                          uint32_t time,
+                                                          int32_t cancelled,
+                                                          void *data);
+
 struct window *
 window_create(struct display *display);
 struct window *
@@ -604,6 +639,25 @@ widget_set_axis_handlers(struct widget *widget,
                        widget_axis_discrete_handler_t axis_discrete_handler);
 
 void
+widget_set_pointer_gesture_swipe_begin_handler(struct widget *widget,
+                                              
widget_pointer_gesture_swipe_begin_handler_t handler);
+void
+widget_set_pointer_gesture_swipe_update_handler(struct widget *widget,
+                                               
widget_pointer_gesture_swipe_update_handler_t handler);
+void
+widget_set_pointer_gesture_swipe_end_handler(struct widget *widget,
+                                            
widget_pointer_gesture_swipe_end_handler_t handler);
+void
+widget_set_pointer_gesture_pinch_begin_handler(struct widget *widget,
+                                              
widget_pointer_gesture_pinch_begin_handler_t handler);
+void
+widget_set_pointer_gesture_pinch_update_handler(struct widget *widget,
+                                               
widget_pointer_gesture_pinch_update_handler_t handler);
+void
+widget_set_pointer_gesture_pinch_end_handler(struct widget *widget,
+                                            
widget_pointer_gesture_pinch_end_handler_t handler);
+
+void
 widget_schedule_redraw(struct widget *widget);
 void
 widget_set_use_cairo(struct widget *widget, int use_cairo);
-- 
2.9.3

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to