From f205dabc5e6b2b1abb44d77e817158f39bf773c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 24 Oct 2019 21:19:36 +0200 Subject: [PATCH] display: Move finishing of touch sequence to the backend We need to manipulate an X11 grab when a touch sequence ends; move that logic to where it belongs - in the X11 backend. https://gitlab.gnome.org/GNOME/mutter/merge_requests/886 --- src/backends/meta-backend-private.h | 16 ++++++++++++ src/backends/meta-backend.c | 14 +++++++++++ src/backends/x11/meta-backend-x11.c | 23 +++++++++++++++++ src/core/display.c | 33 +++++++++++-------------- src/core/meta-gesture-tracker-private.h | 7 +----- src/core/meta-gesture-tracker.c | 1 + 6 files changed, 70 insertions(+), 24 deletions(-) diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h index a25275499..7f4a4ea0f 100644 --- a/src/backends/meta-backend-private.h +++ b/src/backends/meta-backend-private.h @@ -51,6 +51,14 @@ #define META_TYPE_BACKEND (meta_backend_get_type ()) G_DECLARE_DERIVABLE_TYPE (MetaBackend, meta_backend, META, BACKEND, GObject) +typedef enum _MetaSequenceState +{ + META_SEQUENCE_NONE, + META_SEQUENCE_ACCEPTED, + META_SEQUENCE_REJECTED, + META_SEQUENCE_PENDING_END +} MetaSequenceState; + struct _MetaBackendClass { GObjectClass parent_class; @@ -73,6 +81,10 @@ struct _MetaBackendClass int device_id, uint32_t timestamp); + void (* finish_touch_sequence) (MetaBackend *backend, + ClutterEventSequence *sequence, + MetaSequenceState state); + void (* warp_pointer) (MetaBackend *backend, int x, int y); @@ -134,6 +146,10 @@ gboolean meta_backend_ungrab_device (MetaBackend *backend, int device_id, uint32_t timestamp); +void meta_backend_finish_touch_sequence (MetaBackend *backend, + ClutterEventSequence *sequence, + MetaSequenceState state); + void meta_backend_warp_pointer (MetaBackend *backend, int x, int y); diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c index ce7e385b9..fb4f69fe6 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -846,6 +846,20 @@ meta_backend_ungrab_device (MetaBackend *backend, return META_BACKEND_GET_CLASS (backend)->ungrab_device (backend, device_id, timestamp); } +/** + * meta_backend_finish_touch_sequence: (skip) + */ +void +meta_backend_finish_touch_sequence (MetaBackend *backend, + ClutterEventSequence *sequence, + MetaSequenceState state) +{ + if (META_BACKEND_GET_CLASS (backend)->finish_touch_sequence) + META_BACKEND_GET_CLASS (backend)->finish_touch_sequence (backend, + sequence, + state); +} + /** * meta_backend_warp_pointer: (skip) */ diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c index ce8b58cff..0f5596e04 100644 --- a/src/backends/x11/meta-backend-x11.c +++ b/src/backends/x11/meta-backend-x11.c @@ -584,6 +584,28 @@ meta_backend_x11_ungrab_device (MetaBackend *backend, return (ret == Success); } +static void +meta_backend_x11_finish_touch_sequence (MetaBackend *backend, + ClutterEventSequence *sequence, + MetaSequenceState state) +{ + MetaBackendX11 *x11 = META_BACKEND_X11 (backend); + MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); + int event_mode; + + if (state == META_SEQUENCE_ACCEPTED) + event_mode = XIAcceptTouch; + else if (state == META_SEQUENCE_REJECTED) + event_mode = XIRejectTouch; + else + g_return_if_reached (); + + XIAllowTouchEvents (priv->xdisplay, + META_VIRTUAL_CORE_POINTER_ID, + clutter_x11_event_sequence_get_touch_detail (sequence), + DefaultRootWindow (priv->xdisplay), event_mode); +} + static void meta_backend_x11_warp_pointer (MetaBackend *backend, int x, @@ -769,6 +791,7 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass) backend_class->post_init = meta_backend_x11_post_init; backend_class->grab_device = meta_backend_x11_grab_device; backend_class->ungrab_device = meta_backend_x11_ungrab_device; + backend_class->finish_touch_sequence = meta_backend_x11_finish_touch_sequence; backend_class->warp_pointer = meta_backend_x11_warp_pointer; backend_class->get_current_logical_monitor = meta_backend_x11_get_current_logical_monitor; backend_class->get_keymap = meta_backend_x11_get_keymap; diff --git a/src/core/display.c b/src/core/display.c index d6da84b30..b862b732d 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -55,6 +55,7 @@ #include "backends/x11/meta-backend-x11.h" #include "backends/meta-stage-private.h" #include "backends/meta-input-settings-private.h" +#include "backends/meta-backend-private.h" #include #ifdef HAVE_RANDR @@ -533,27 +534,23 @@ gesture_tracker_state_changed (MetaGestureTracker *tracker, MetaSequenceState state, MetaDisplay *display) { - if (meta_is_wayland_compositor ()) + switch (state) { - if (state == META_SEQUENCE_ACCEPTED) - meta_display_cancel_touch (display); - } - else - { - MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ()); - int event_mode; + case META_SEQUENCE_NONE: + case META_SEQUENCE_PENDING_END: + return; + case META_SEQUENCE_ACCEPTED: + meta_display_cancel_touch (display); - if (state == META_SEQUENCE_ACCEPTED) - event_mode = XIAcceptTouch; - else if (state == META_SEQUENCE_REJECTED) - event_mode = XIRejectTouch; - else - return; + /* Intentional fall-through */ + case META_SEQUENCE_REJECTED: + { + MetaBackend *backend; - XIAllowTouchEvents (meta_backend_x11_get_xdisplay (backend), - META_VIRTUAL_CORE_POINTER_ID, - clutter_x11_event_sequence_get_touch_detail (sequence), - DefaultRootWindow (display->xdisplay), event_mode); + backend = meta_get_backend (); + meta_backend_finish_touch_sequence (backend, sequence, state); + break; + } } } diff --git a/src/core/meta-gesture-tracker-private.h b/src/core/meta-gesture-tracker-private.h index 0e39af27f..b4fb02a1e 100644 --- a/src/core/meta-gesture-tracker-private.h +++ b/src/core/meta-gesture-tracker-private.h @@ -38,12 +38,7 @@ typedef struct _MetaGestureTracker MetaGestureTracker; typedef struct _MetaGestureTrackerClass MetaGestureTrackerClass; -typedef enum { - META_SEQUENCE_NONE, - META_SEQUENCE_ACCEPTED, - META_SEQUENCE_REJECTED, - META_SEQUENCE_PENDING_END -} MetaSequenceState; +typedef enum _MetaSequenceState MetaSequenceState; struct _MetaGestureTracker { diff --git a/src/core/meta-gesture-tracker.c b/src/core/meta-gesture-tracker.c index e3b702f56..1313aad6d 100644 --- a/src/core/meta-gesture-tracker.c +++ b/src/core/meta-gesture-tracker.c @@ -31,6 +31,7 @@ #include "config.h" #include "meta-gesture-tracker-private.h" #include "meta-surface-actor.h" +#include "meta-backend-private.h" #define DISTANCE_THRESHOLD 30