From ead79f834c7eada35228d27b694d8050302981d6 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Wed, 8 Oct 2014 13:43:57 -0700 Subject: [PATCH] Revert "wayland-pointer: Just use the pointer actor instead of doing a full repick" This reverts commit 33acb5fea07c83236f254456d11d34e2c7671719. The issue here is that the pointer actor does not actually get reset when the actor's reactivity changes, so we end up with stale picks after actors are destroyed. I have a local patch to Clutter for this, but I don't have time to submit it upstream, so let's just use the ugly code for now. --- src/wayland/meta-wayland-pointer.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c index 448d223dc..9f6c264d9 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -281,12 +281,25 @@ static void repick_for_event (MetaWaylandPointer *pointer, const ClutterEvent *for_event) { - ClutterActor *actor; + ClutterActor *actor = NULL; if (for_event) - actor = clutter_event_get_source (for_event); + { + actor = clutter_event_get_source (for_event); + } else - actor = clutter_input_device_get_pointer_actor (pointer->device); + { + ClutterStage *stage = clutter_input_device_get_pointer_stage (pointer->device); + + if (stage) + { + ClutterPoint pos; + + clutter_input_device_get_coords (pointer->device, NULL, &pos); + actor = clutter_stage_get_actor_at_pos (stage, CLUTTER_PICK_REACTIVE, + pos.x, pos.y); + } + } if (META_IS_SURFACE_ACTOR_WAYLAND (actor)) pointer->current = meta_surface_actor_wayland_get_surface (META_SURFACE_ACTOR_WAYLAND (actor));