[mutter/wip/carlosg/crossings: 4/9] wayland: Do not query seat for pointer coordinates




commit 79c18605c213fb699aabfafe524ae44f7a5cd74f
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Dec 22 17:33:03 2020 +0100

    wayland: Do not query seat for pointer coordinates
    
    In the wayland code we are in synchronization with the events that
    the ClutterStage is managing at the moment. Asking the ClutterSeat for
    the pointer position gets ahead of the current events, and may result
    in imprecise coordinates sent in wl_pointer.enter.
    
    To be in consistence with the motion events that might be already
    queued, we should ask the stage for the last known coordinates.

 src/wayland/meta-wayland-pointer.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
---
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
index 545b04d323..9828090be7 100644
--- a/src/wayland/meta-wayland-pointer.c
+++ b/src/wayland/meta-wayland-pointer.c
@@ -906,6 +906,7 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
 
   if (surface != NULL)
     {
+      ClutterStage *stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
       struct wl_client *client = wl_resource_get_client (surface->resource);
       graphene_point_t pos;
       MetaWindow *focus_window;
@@ -917,8 +918,7 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
                                 G_CALLBACK (focus_surface_destroyed),
                                 pointer);
 
-      clutter_seat_query_state (clutter_input_device_get_seat (pointer->device),
-                                pointer->device, NULL, &pos, NULL);
+      clutter_stage_get_device_coords (stage, pointer->device, NULL, &pos);
 
       focus_window = meta_wayland_surface_get_window (pointer->focus_surface);
       if (focus_window)
@@ -1040,11 +1040,12 @@ meta_wayland_pointer_get_relative_coordinates (MetaWaylandPointer *pointer,
                                               wl_fixed_t         *sx,
                                               wl_fixed_t         *sy)
 {
+  MetaBackend *backend = meta_get_backend ();
+  ClutterStage *stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
   float xf = 0.0f, yf = 0.0f;
   graphene_point_t pos;
 
-  clutter_seat_query_state (clutter_input_device_get_seat (pointer->device),
-                            pointer->device, NULL, &pos, NULL);
+  clutter_stage_get_device_coords (stage, pointer->device, NULL, &pos);
   meta_wayland_surface_get_relative_coordinates (surface, pos.x, pos.y, &xf, &yf);
 
   *sx = wl_fixed_from_double (xf);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]