summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2014-10-08 13:43:57 -0700
committerJasper St. Pierre <jstpierre@mecheye.net>2014-10-08 13:43:57 -0700
commitead79f834c7eada35228d27b694d8050302981d6 (patch)
treecbbd376f98bb02cde62d9032eebc0b0055ea33b5
parent7e431bd6bc5ffe4c9afacb842429b9af1185b678 (diff)
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.
-rw-r--r--src/wayland/meta-wayland-pointer.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
index 448d223d..9f6c264d 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));