[mutter/wip/carlosg/sync-pointer-in-mutter: 1/2] compositor: Sync pointer after begin/end modal on X11
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/sync-pointer-in-mutter: 1/2] compositor: Sync pointer after begin/end modal on X11
- Date: Tue, 29 Dec 2020 22:01:08 +0000 (UTC)
commit afc06cd8a161d2ede09cf9848ab7a8c5e6ef0011
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Dec 18 14:59:17 2020 +0100
compositor: Sync pointer after begin/end modal on X11
Ensure we issue a motion event for the current pointer position,
as there might be situations where compositor modals get X grabs
from other clients stacked on top, or missed events in between
otherwise.
Ensure the Clutter state is still up-to-date afterwards here. This
replaces some sync_pointer() calls done in GNOME Shell code, always
done after modality changes.
src/backends/meta-backend-private.h | 2 ++
src/backends/meta-backend.c | 23 +++++++++++++++++++++++
src/compositor/compositor.c | 8 ++++++++
3 files changed, 33 insertions(+)
---
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index 80df654bc6..970ed451dc 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -202,4 +202,6 @@ void meta_backend_remove_hw_cursor_inhibitor (MetaBackend *backend,
gboolean meta_backend_is_hw_cursors_inhibited (MetaBackend *backend);
+void meta_backend_sync_pointer (MetaBackend *backend);
+
#endif /* META_BACKEND_PRIVATE_H */
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index aca0d6fc99..1a1c589f4e 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -1612,3 +1612,26 @@ meta_backend_is_hw_cursors_inhibited (MetaBackend *backend)
return FALSE;
}
+
+void
+meta_backend_sync_pointer (MetaBackend *backend)
+{
+ MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
+ ClutterSeat *seat = clutter_backend_get_default_seat (priv->clutter_backend);
+ ClutterInputDevice *pointer = clutter_seat_get_pointer (seat);
+ ClutterModifierType modifiers;
+ ClutterEvent *event;
+ graphene_point_t pos;
+
+ event = clutter_event_new (CLUTTER_MOTION);
+ clutter_seat_query_state (seat, pointer, NULL, &pos, &modifiers);
+ clutter_event_set_flags (event, CLUTTER_EVENT_FLAG_SYNTHETIC);
+ clutter_event_set_coords (event, pos.x, pos.y);
+ clutter_event_set_device (event, pointer);
+ clutter_event_set_state (event, modifiers);
+ clutter_event_set_source_device (event, NULL);
+ clutter_event_set_stage (event, CLUTTER_STAGE (priv->stage));
+
+ clutter_event_put (event);
+ clutter_event_free (event);
+}
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 3be8d2e9ee..104c0ed14c 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -440,6 +440,10 @@ meta_begin_modal_for_plugin (MetaCompositor *compositor,
meta_dnd_wayland_handle_begin_modal (compositor);
#endif
}
+ else
+ {
+ meta_backend_sync_pointer (meta_get_backend ());
+ }
return TRUE;
}
@@ -473,7 +477,11 @@ meta_end_modal_for_plugin (MetaCompositor *compositor,
meta_dnd_wayland_handle_end_modal (compositor);
meta_display_sync_wayland_input_focus (display);
}
+ else
#endif
+ {
+ meta_backend_sync_pointer (meta_get_backend ());
+ }
g_signal_emit_by_name (display, "grab-op-end",
meta_plugin_get_display (plugin),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]