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
This commit is contained in:
Jonas Ådahl 2019-10-24 21:19:36 +02:00
parent 74e3126b77
commit f205dabc5e
6 changed files with 70 additions and 24 deletions

View File

@ -51,6 +51,14 @@
#define META_TYPE_BACKEND (meta_backend_get_type ()) #define META_TYPE_BACKEND (meta_backend_get_type ())
G_DECLARE_DERIVABLE_TYPE (MetaBackend, meta_backend, META, BACKEND, GObject) 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 struct _MetaBackendClass
{ {
GObjectClass parent_class; GObjectClass parent_class;
@ -73,6 +81,10 @@ struct _MetaBackendClass
int device_id, int device_id,
uint32_t timestamp); uint32_t timestamp);
void (* finish_touch_sequence) (MetaBackend *backend,
ClutterEventSequence *sequence,
MetaSequenceState state);
void (* warp_pointer) (MetaBackend *backend, void (* warp_pointer) (MetaBackend *backend,
int x, int x,
int y); int y);
@ -134,6 +146,10 @@ gboolean meta_backend_ungrab_device (MetaBackend *backend,
int device_id, int device_id,
uint32_t timestamp); uint32_t timestamp);
void meta_backend_finish_touch_sequence (MetaBackend *backend,
ClutterEventSequence *sequence,
MetaSequenceState state);
void meta_backend_warp_pointer (MetaBackend *backend, void meta_backend_warp_pointer (MetaBackend *backend,
int x, int x,
int y); int y);

View File

@ -846,6 +846,20 @@ meta_backend_ungrab_device (MetaBackend *backend,
return META_BACKEND_GET_CLASS (backend)->ungrab_device (backend, device_id, timestamp); 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) * meta_backend_warp_pointer: (skip)
*/ */

View File

@ -584,6 +584,28 @@ meta_backend_x11_ungrab_device (MetaBackend *backend,
return (ret == Success); 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 static void
meta_backend_x11_warp_pointer (MetaBackend *backend, meta_backend_x11_warp_pointer (MetaBackend *backend,
int x, int x,
@ -769,6 +791,7 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
backend_class->post_init = meta_backend_x11_post_init; backend_class->post_init = meta_backend_x11_post_init;
backend_class->grab_device = meta_backend_x11_grab_device; backend_class->grab_device = meta_backend_x11_grab_device;
backend_class->ungrab_device = meta_backend_x11_ungrab_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->warp_pointer = meta_backend_x11_warp_pointer;
backend_class->get_current_logical_monitor = meta_backend_x11_get_current_logical_monitor; backend_class->get_current_logical_monitor = meta_backend_x11_get_current_logical_monitor;
backend_class->get_keymap = meta_backend_x11_get_keymap; backend_class->get_keymap = meta_backend_x11_get_keymap;

View File

@ -55,6 +55,7 @@
#include "backends/x11/meta-backend-x11.h" #include "backends/x11/meta-backend-x11.h"
#include "backends/meta-stage-private.h" #include "backends/meta-stage-private.h"
#include "backends/meta-input-settings-private.h" #include "backends/meta-input-settings-private.h"
#include "backends/meta-backend-private.h"
#include <clutter/x11/clutter-x11.h> #include <clutter/x11/clutter-x11.h>
#ifdef HAVE_RANDR #ifdef HAVE_RANDR
@ -533,27 +534,23 @@ gesture_tracker_state_changed (MetaGestureTracker *tracker,
MetaSequenceState state, MetaSequenceState state,
MetaDisplay *display) MetaDisplay *display)
{ {
if (meta_is_wayland_compositor ()) switch (state)
{ {
if (state == META_SEQUENCE_ACCEPTED) case META_SEQUENCE_NONE:
meta_display_cancel_touch (display); case META_SEQUENCE_PENDING_END:
} return;
else case META_SEQUENCE_ACCEPTED:
{ meta_display_cancel_touch (display);
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
int event_mode;
if (state == META_SEQUENCE_ACCEPTED) /* Intentional fall-through */
event_mode = XIAcceptTouch; case META_SEQUENCE_REJECTED:
else if (state == META_SEQUENCE_REJECTED) {
event_mode = XIRejectTouch; MetaBackend *backend;
else
return;
XIAllowTouchEvents (meta_backend_x11_get_xdisplay (backend), backend = meta_get_backend ();
META_VIRTUAL_CORE_POINTER_ID, meta_backend_finish_touch_sequence (backend, sequence, state);
clutter_x11_event_sequence_get_touch_detail (sequence), break;
DefaultRootWindow (display->xdisplay), event_mode); }
} }
} }

View File

@ -38,12 +38,7 @@
typedef struct _MetaGestureTracker MetaGestureTracker; typedef struct _MetaGestureTracker MetaGestureTracker;
typedef struct _MetaGestureTrackerClass MetaGestureTrackerClass; typedef struct _MetaGestureTrackerClass MetaGestureTrackerClass;
typedef enum { typedef enum _MetaSequenceState MetaSequenceState;
META_SEQUENCE_NONE,
META_SEQUENCE_ACCEPTED,
META_SEQUENCE_REJECTED,
META_SEQUENCE_PENDING_END
} MetaSequenceState;
struct _MetaGestureTracker struct _MetaGestureTracker
{ {

View File

@ -31,6 +31,7 @@
#include "config.h" #include "config.h"
#include "meta-gesture-tracker-private.h" #include "meta-gesture-tracker-private.h"
#include "meta-surface-actor.h" #include "meta-surface-actor.h"
#include "meta-backend-private.h"
#define DISTANCE_THRESHOLD 30 #define DISTANCE_THRESHOLD 30