input: Don't cache pointer grab interface between calls to focus and motion
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 4 Jul 2013 04:58:07 +0000 (00:58 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 4 Jul 2013 05:00:16 +0000 (01:00 -0400)
The focus callback for the current grab can change the grab, so we have
to make sure we call the motion callback for the currently active grab.

https://bugs.freedesktop.org/show_bug.cgi?id=65961

src/input.c

index 0f42ed6..644487a 100644 (file)
@@ -46,13 +46,12 @@ static void unbind_resource(struct wl_resource *resource)
 void
 weston_seat_repick(struct weston_seat *seat)
 {
-       const struct weston_pointer_grab_interface *interface;
+       const struct weston_pointer *pointer = seat->pointer;
 
-       if (seat->pointer == NULL)
+       if (pointer == NULL)
                return;
 
-       interface = seat->pointer->grab->interface;
-       interface->focus(seat->pointer->grab);
+       pointer->grab->interface->focus(seat->pointer->grab);
 }
 
 static void
@@ -531,22 +530,16 @@ WL_EXPORT void
 weston_pointer_start_grab(struct weston_pointer *pointer,
                          struct weston_pointer_grab *grab)
 {
-       const struct weston_pointer_grab_interface *interface;
-
        pointer->grab = grab;
-       interface = pointer->grab->interface;
        grab->pointer = pointer;
-       interface->focus(pointer->grab);
+       pointer->grab->interface->focus(pointer->grab);
 }
 
 WL_EXPORT void
 weston_pointer_end_grab(struct weston_pointer *pointer)
 {
-       const struct weston_pointer_grab_interface *interface;
-
        pointer->grab = &pointer->default_grab;
-       interface = pointer->grab->interface;
-       interface->focus(pointer->grab);
+       pointer->grab->interface->focus(pointer->grab);
 }
 
 WL_EXPORT void
@@ -637,7 +630,6 @@ WL_EXPORT void
 notify_motion(struct weston_seat *seat,
              uint32_t time, wl_fixed_t dx, wl_fixed_t dy)
 {
-       const struct weston_pointer_grab_interface *interface;
        struct weston_compositor *ec = seat->compositor;
        struct weston_pointer *pointer = seat->pointer;
 
@@ -645,16 +637,14 @@ notify_motion(struct weston_seat *seat,
 
        move_pointer(seat, pointer->x + dx, pointer->y + dy);
 
-       interface = pointer->grab->interface;
-       interface->focus(pointer->grab);
-       interface->motion(pointer->grab, time);
+       pointer->grab->interface->focus(pointer->grab);
+       pointer->grab->interface->motion(pointer->grab, time);
 }
 
 WL_EXPORT void
 notify_motion_absolute(struct weston_seat *seat,
                       uint32_t time, wl_fixed_t x, wl_fixed_t y)
 {
-       const struct weston_pointer_grab_interface *interface;
        struct weston_compositor *ec = seat->compositor;
        struct weston_pointer *pointer = seat->pointer;
 
@@ -662,9 +652,8 @@ notify_motion_absolute(struct weston_seat *seat,
 
        move_pointer(seat, x, y);
 
-       interface = pointer->grab->interface;
-       interface->focus(pointer->grab);
-       interface->motion(pointer->grab, time);
+       pointer->grab->interface->focus(pointer->grab);
+       pointer->grab->interface->motion(pointer->grab, time);
 }
 
 WL_EXPORT void