diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c index 66e96952..ceb912a1 100644 --- a/src/compositor-wayland.c +++ b/src/compositor-wayland.c @@ -361,8 +361,10 @@ input_handle_motion(void *data, struct wl_pointer *pointer, check_focus(input, x, y); if (input->focus) notify_motion(&input->base, time, - x - wl_fixed_from_int(c->border.left), - y - wl_fixed_from_int(c->border.top)); + x - wl_fixed_from_int(c->border.left) - + input->base.seat.pointer->x, + y - wl_fixed_from_int(c->border.top) - + input->base.seat.pointer->y); } static void diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 11199344..8e052dde 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -89,7 +89,9 @@ struct x11_compositor { /* We could map multi-pointer X to multiple wayland seats, but * for now we only support core X input. */ - struct weston_seat core_seat; + struct weston_seat core_seat; + int prev_x; + int prev_y; struct { xcb_atom_t wm_protocols; @@ -1008,8 +1010,10 @@ x11_compositor_deliver_motion_event(struct x11_compositor *c, if (!c->has_xkb) update_xkb_state_from_core(c, motion_notify->state); output = x11_compositor_find_output(c, motion_notify->event); - x = wl_fixed_from_int(motion_notify->event_x); - y = wl_fixed_from_int(motion_notify->event_y); + x = wl_fixed_from_int(motion_notify->event_x - c->prev_x); + y = wl_fixed_from_int(motion_notify->event_y - c->prev_y); + c->prev_x = motion_notify->event_x; + c->prev_y = motion_notify->event_y; x11_output_transform_coordinate(output, &x, &y); notify_motion(&c->core_seat, weston_compositor_get_time(), x, y); @@ -1029,6 +1033,8 @@ x11_compositor_deliver_enter_event(struct x11_compositor *c, if (!c->has_xkb) update_xkb_state_from_core(c, enter_notify->state); output = x11_compositor_find_output(c, enter_notify->event); + c->prev_x = enter_notify->event_x; + c->prev_y = enter_notify->event_y; x = wl_fixed_from_int(enter_notify->event_x); y = wl_fixed_from_int(enter_notify->event_y); x11_output_transform_coordinate(output, &x, &y); diff --git a/src/compositor.c b/src/compositor.c index 1ef0b54e..80371956 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1713,13 +1713,16 @@ 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 x, wl_fixed_t y) +move_pointer(struct weston_seat *seat, wl_fixed_t dx, wl_fixed_t dy) { 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); @@ -1748,7 +1751,7 @@ move_pointer(struct weston_seat *seat, wl_fixed_t x, wl_fixed_t y) WL_EXPORT void notify_motion(struct weston_seat *seat, - uint32_t time, wl_fixed_t x, wl_fixed_t y) + uint32_t time, wl_fixed_t dx, wl_fixed_t dy) { const struct wl_pointer_grab_interface *interface; struct weston_compositor *ec = seat->compositor; @@ -1756,7 +1759,7 @@ notify_motion(struct weston_seat *seat, weston_compositor_wake(ec); - move_pointer(seat, x, y); + move_pointer(seat, dx, dy); interface = pointer->grab->interface; interface->motion(pointer->grab, time, diff --git a/src/evdev.c b/src/evdev.c index a1fa01f0..d2954b57 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -254,9 +254,7 @@ evdev_flush_motion(struct evdev_device *device, uint32_t time) device->pending_events &= ~EVDEV_SYN; if (device->pending_events & EVDEV_RELATIVE_MOTION) { - notify_motion(master, time, - master->seat.pointer->x + device->rel.dx, - master->seat.pointer->y + device->rel.dy); + notify_motion(master, time, device->rel.dx, device->rel.dy); device->pending_events &= ~EVDEV_RELATIVE_MOTION; device->rel.dx = 0; device->rel.dy = 0; diff --git a/tests/weston-test.c b/tests/weston-test.c index 08833e0a..b29b64fd 100644 --- a/tests/weston-test.c +++ b/tests/weston-test.c @@ -122,10 +122,13 @@ move_pointer(struct wl_client *client, struct wl_resource *resource, { struct weston_test *test = resource->data; struct weston_seat *seat = get_seat(test); + struct wl_pointer *pointer = seat->seat.pointer; test->compositor->focus = 1; - notify_motion(seat, 100, wl_fixed_from_int(x), wl_fixed_from_int(y)); + notify_motion(seat, 100, + wl_fixed_from_int(x) - pointer->x, + wl_fixed_from_int(y) - pointer->y); notify_pointer_position(test, resource); }