From 1f17a7ffef196e198dd443f7b811b553fc58d143 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 22 Dec 2020 17:33:03 +0100 Subject: [PATCH] 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. Part-of: --- 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 ef0923577..1f671829f 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);