From: "U. Artie Eoff" <ullysses.a.e...@intel.com> Fixes https://bugs.freedesktop.org/show_bug.cgi?id=61997
Signed-off-by: U. Artie Eoff <ullysses.a.e...@intel.com> --- src/compositor.c | 29 +++++++++++++++++++++++++---- src/compositor.h | 7 ++++++- src/evdev.c | 2 +- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/compositor.c b/src/compositor.c index b734f67..ce5c788 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1783,16 +1783,13 @@ clip_pointer_motion(struct weston_seat *seat, wl_fixed_t *fx, wl_fixed_t *fy) } static void -move_pointer(struct weston_seat *seat, wl_fixed_t dx, wl_fixed_t dy) +move_pointer_absolute(struct weston_seat *seat, wl_fixed_t x, wl_fixed_t y) { struct weston_compositor *ec = seat->compositor; struct wl_pointer *pointer = seat->seat.pointer; struct weston_output *output; - wl_fixed_t x, y; int32_t ix, iy; - x = pointer->x + dx; - y = pointer->y + dy; clip_pointer_motion(seat, &x, &y); weston_seat_update_drag_surface(seat, x - pointer->x, y - pointer->y); @@ -1819,6 +1816,13 @@ move_pointer(struct weston_seat *seat, wl_fixed_t dx, wl_fixed_t dy) } } +static void +move_pointer(struct weston_seat *seat, wl_fixed_t dx, wl_fixed_t dy) +{ + struct wl_pointer *pointer = seat->seat.pointer; + move_pointer_absolute(seat, pointer->x + dx, pointer->y + dy); +} + WL_EXPORT void notify_motion(struct weston_seat *seat, uint32_t time, wl_fixed_t dx, wl_fixed_t dy) @@ -1837,6 +1841,23 @@ notify_motion(struct weston_seat *seat, } WL_EXPORT void +notify_motion_absolute(struct weston_seat *seat, + uint32_t time, wl_fixed_t x, wl_fixed_t y) +{ + const struct wl_pointer_grab_interface *interface; + struct weston_compositor *ec = seat->compositor; + struct wl_pointer *pointer = seat->seat.pointer; + + weston_compositor_wake(ec); + + move_pointer_absolute(seat, x, y); + + interface = pointer->grab->interface; + interface->motion(pointer->grab, time, + pointer->grab->x, pointer->grab->y); +} + +WL_EXPORT void weston_surface_activate(struct weston_surface *surface, struct weston_seat *seat) { diff --git a/src/compositor.h b/src/compositor.h index 58ab58d..c1efe0f 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -555,7 +555,12 @@ weston_surface_activate(struct weston_surface *surface, struct weston_seat *seat); void notify_motion(struct weston_seat *seat, uint32_t time, - wl_fixed_t x, wl_fixed_t y); + wl_fixed_t dx, wl_fixed_t dy); + +void +notify_motion_absolute(struct weston_seat *seat, + uint32_t time, wl_fixed_t x, wl_fixed_t y); + void notify_button(struct weston_seat *seat, uint32_t time, int32_t button, enum wl_pointer_button_state state); diff --git a/src/evdev.c b/src/evdev.c index d2954b5..2c81d2b 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -284,7 +284,7 @@ evdev_flush_motion(struct evdev_device *device, uint32_t time) } if (device->pending_events & EVDEV_ABSOLUTE_MOTION) { transform_absolute(device); - notify_motion(master, time, + notify_motion_absolute(master, time, wl_fixed_from_int(device->abs.x), wl_fixed_from_int(device->abs.y)); device->pending_events &= ~EVDEV_ABSOLUTE_MOTION; -- 1.7.11.7 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel