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




commit a49ad1d38144de6e687ba27bf1359033e1f2e96d
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 ef0923577b..1f671829fd 100644
--- a/src/wayland/meta-wayland-pointer.c
+++ b/src/wayland/meta-wayland-pointer.c
@@ -908,6 +908,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;
@@ -919,8 +920,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)
@@ -1042,11 +1042,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]