From 23fa59b77cb2ea29998d0e0cd27f464c78eed70a 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 | 9 +------ 5 files changed, 69 insertions(+), 26 deletions(-) diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h index 397c5f382..213cad5c1 100644 --- a/src/backends/meta-backend-private.h +++ b/src/backends/meta-backend-private.h @@ -49,6 +49,14 @@ #define DEFAULT_XKB_RULES_FILE "evdev" #define DEFAULT_XKB_MODEL "pc105+inet" +typedef enum +{ + META_SEQUENCE_NONE, + META_SEQUENCE_ACCEPTED, + META_SEQUENCE_REJECTED, + META_SEQUENCE_PENDING_END +} MetaSequenceState; + struct _MetaBackendClass { GObjectClass parent_class; @@ -71,6 +79,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); @@ -135,6 +147,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 b019b4d7d..26947e589 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -1059,6 +1059,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 a0fd2f5e0..fd58a388b 100644 --- a/src/backends/x11/meta-backend-x11.c +++ b/src/backends/x11/meta-backend-x11.c @@ -590,6 +590,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, + meta_x11_event_sequence_get_touch_detail (sequence), + DefaultRootWindow (priv->xdisplay), event_mode); +} + static void meta_backend_x11_warp_pointer (MetaBackend *backend, int x, @@ -781,6 +803,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 b4b4668aa..4ee61a8a1 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -40,6 +40,7 @@ #include #include +#include "backends/meta-backend-private.h" #include "backends/meta-cursor-sprite-xcursor.h" #include "backends/meta-cursor-tracker-private.h" #include "backends/meta-idle-monitor-dbus.h" @@ -622,27 +623,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, - meta_x11_event_sequence_get_touch_detail (sequence), - DefaultRootWindow (display->x11_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 a9db35ebc..e7bfc5472 100644 --- a/src/core/meta-gesture-tracker-private.h +++ b/src/core/meta-gesture-tracker-private.h @@ -26,6 +26,7 @@ #include +#include "backends/meta-backend-private.h" #include "clutter/clutter.h" #include "meta/window.h" @@ -39,14 +40,6 @@ typedef struct _MetaGestureTracker MetaGestureTracker; typedef struct _MetaGestureTrackerClass MetaGestureTrackerClass; -typedef enum -{ - META_SEQUENCE_NONE, - META_SEQUENCE_ACCEPTED, - META_SEQUENCE_REJECTED, - META_SEQUENCE_PENDING_END -} MetaSequenceState; - struct _MetaGestureTracker { GObject parent_instance;