diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2019-10-24 21:19:36 +0200 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2020-04-24 21:30:11 +0200 |
commit | 002299fbef2fd99fb36e5b881ed7b4095ff481f6 (patch) | |
tree | 29d185941e7303e0e28504cb3c421d6fa786e1a5 | |
parent | f0b7cf4d91a783b1b66b6b1e7641d1231eac6e3e (diff) | |
download | mutter-002299fbef2fd99fb36e5b881ed7b4095ff481f6.tar.gz |
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
-rw-r--r-- | src/backends/meta-backend-private.h | 16 | ||||
-rw-r--r-- | src/backends/meta-backend.c | 14 | ||||
-rw-r--r-- | src/backends/x11/meta-backend-x11.c | 23 | ||||
-rw-r--r-- | src/core/display.c | 33 | ||||
-rw-r--r-- | 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 7eba1806b..81ec81e5f 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 23ab2faec..72cfbdaf3 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -1008,6 +1008,20 @@ meta_backend_ungrab_device (MetaBackend *backend, } /** + * 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) */ void diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c index c10365f9d..cdefa50a9 100644 --- a/src/backends/x11/meta-backend-x11.c +++ b/src/backends/x11/meta-backend-x11.c @@ -592,6 +592,28 @@ meta_backend_x11_ungrab_device (MetaBackend *backend, } 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, int y) @@ -776,6 +798,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 4f350f0bd..6dc6296d9 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -42,6 +42,7 @@ #include <X11/extensions/Xdamage.h> #include <X11/extensions/Xfixes.h> +#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" @@ -598,27 +599,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->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 <glib-object.h> +#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; |