On 17/11/15 04:10 AM, Jonas Ådahl wrote: > Instead of only passing absolute pointer coordinates, effectively > loosing motion event data, pass a struct that can potentially contain > different types of motion events, currently being absolute and relative. > > A helper function to get resulting absolute coordinates was added for > when previous callbacks simply used the (x, y) coordinates. > > Signed-off-by: Jonas Ådahl <jad...@gmail.com>
Reviewed-by: Derek Foreman <der...@osg.samsung.com> > --- > desktop-shell/exposay.c | 4 +-- > desktop-shell/shell.c | 22 +++++++++-------- > ivi-shell/hmi-controller.c | 8 +++--- > src/compositor-x11.c | 9 ++++++- > src/compositor.h | 24 +++++++++++++++--- > src/data-device.c | 4 +-- > src/input.c | 61 > +++++++++++++++++++++++++++++++++++++--------- > src/libinput-device.c | 13 ++++++---- > tests/weston-test.c | 11 ++++++--- > 9 files changed, 116 insertions(+), 40 deletions(-) > > diff --git a/desktop-shell/exposay.c b/desktop-shell/exposay.c > index eb4070e..8bd55fb 100644 > --- a/desktop-shell/exposay.c > +++ b/desktop-shell/exposay.c > @@ -348,12 +348,12 @@ exposay_focus(struct weston_pointer_grab *grab) > > static void > exposay_motion(struct weston_pointer_grab *grab, uint32_t time, > - wl_fixed_t x, wl_fixed_t y) > + struct weston_pointer_motion_event *event) > { > struct desktop_shell *shell = > container_of(grab, struct desktop_shell, exposay.grab_ptr); > > - weston_pointer_move(grab->pointer, x, y); > + weston_pointer_move(grab->pointer, event); > > exposay_pick(shell, > wl_fixed_to_int(grab->pointer->x), > diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c > index 00c3260..d58a830 100644 > --- a/desktop-shell/shell.c > +++ b/desktop-shell/shell.c > @@ -1632,14 +1632,14 @@ constrain_position(struct weston_move_grab *move, int > *cx, int *cy) > > static void > move_grab_motion(struct weston_pointer_grab *grab, uint32_t time, > - wl_fixed_t x, wl_fixed_t y) > + struct weston_pointer_motion_event *event) > { > struct weston_move_grab *move = (struct weston_move_grab *) grab; > struct weston_pointer *pointer = grab->pointer; > struct shell_surface *shsurf = move->base.shsurf; > int cx, cy; > > - weston_pointer_move(pointer, x, y); > + weston_pointer_move(pointer, event); > if (!shsurf) > return; > > @@ -1758,7 +1758,7 @@ struct weston_resize_grab { > > static void > resize_grab_motion(struct weston_pointer_grab *grab, uint32_t time, > - wl_fixed_t x, wl_fixed_t y) > + struct weston_pointer_motion_event *event) > { > struct weston_resize_grab *resize = (struct weston_resize_grab *) grab; > struct weston_pointer *pointer = grab->pointer; > @@ -1767,7 +1767,7 @@ resize_grab_motion(struct weston_pointer_grab *grab, > uint32_t time, > wl_fixed_t from_x, from_y; > wl_fixed_t to_x, to_y; > > - weston_pointer_move(pointer, x, y); > + weston_pointer_move(pointer, event); > > if (!shsurf) > return; > @@ -1973,9 +1973,9 @@ busy_cursor_grab_focus(struct weston_pointer_grab *base) > > static void > busy_cursor_grab_motion(struct weston_pointer_grab *grab, uint32_t time, > - wl_fixed_t x, wl_fixed_t y) > + struct weston_pointer_motion_event *event) > { > - weston_pointer_move(grab->pointer, x, y); > + weston_pointer_move(grab->pointer, event); > } > > static void > @@ -3141,18 +3141,20 @@ popup_grab_focus(struct weston_pointer_grab *grab) > > static void > popup_grab_motion(struct weston_pointer_grab *grab, uint32_t time, > - wl_fixed_t x, wl_fixed_t y) > + struct weston_pointer_motion_event *event) > { > struct weston_pointer *pointer = grab->pointer; > struct wl_resource *resource; > + wl_fixed_t x, y; > wl_fixed_t sx, sy; > > if (pointer->focus) { > + weston_pointer_motion_to_abs(pointer, event, &x, &y); > weston_view_from_global_fixed(pointer->focus, x, y, > &pointer->sx, &pointer->sy); > } > > - weston_pointer_move(pointer, x, y); > + weston_pointer_move(pointer, event); > > wl_resource_for_each(resource, &pointer->focus_resource_list) { > weston_view_from_global_fixed(pointer->focus, > @@ -4812,7 +4814,7 @@ terminate_binding(struct weston_keyboard *keyboard, > uint32_t time, > > static void > rotate_grab_motion(struct weston_pointer_grab *grab, uint32_t time, > - wl_fixed_t x, wl_fixed_t y) > + struct weston_pointer_motion_event *event) > { > struct rotate_grab *rotate = > container_of(grab, struct rotate_grab, base.grab); > @@ -4820,7 +4822,7 @@ rotate_grab_motion(struct weston_pointer_grab *grab, > uint32_t time, > struct shell_surface *shsurf = rotate->base.shsurf; > float cx, cy, dx, dy, cposx, cposy, dposx, dposy, r; > > - weston_pointer_move(pointer, x, y); > + weston_pointer_move(pointer, event); > > if (!shsurf) > return; > diff --git a/ivi-shell/hmi-controller.c b/ivi-shell/hmi-controller.c > index 633ea19..e10f4ff 100644 > --- a/ivi-shell/hmi-controller.c > +++ b/ivi-shell/hmi-controller.c > @@ -1380,16 +1380,18 @@ layer_set_pos(struct ivi_layout_layer *layer, > wl_fixed_t pos_x, > > static void > pointer_move_grab_motion(struct weston_pointer_grab *grab, uint32_t time, > - wl_fixed_t x, wl_fixed_t y) > + struct weston_pointer_motion_event *event) > { > struct pointer_move_grab *pnt_move_grab = > (struct pointer_move_grab *)grab; > - wl_fixed_t pointer_pos[2] = {x, y}; > + wl_fixed_t pointer_pos[2]; > > + weston_pointer_motion_to_abs(grab->pointer, event, > + &pointer_pos[0], &pointer_pos[1]); > move_grab_update(&pnt_move_grab->move, pointer_pos); > layer_set_pos(pnt_move_grab->base.layer, > pnt_move_grab->move.pos[0], pnt_move_grab->move.pos[1]); > - weston_pointer_move(pnt_move_grab->base.grab.pointer, x, y); > + weston_pointer_move(pnt_move_grab->base.grab.pointer, event); > } > > static void > diff --git a/src/compositor-x11.c b/src/compositor-x11.c > index ccb7867..26e387e 100644 > --- a/src/compositor-x11.c > +++ b/src/compositor-x11.c > @@ -1126,6 +1126,7 @@ x11_backend_deliver_motion_event(struct x11_backend *b, > { > struct x11_output *output; > wl_fixed_t x, y; > + struct weston_pointer_motion_event motion_event = { 0 }; > xcb_motion_notify_event_t *motion_notify = > (xcb_motion_notify_event_t *) event; > > @@ -1140,8 +1141,14 @@ x11_backend_deliver_motion_event(struct x11_backend *b, > > wl_fixed_from_int(motion_notify->event_y), > &x, &y); > > + motion_event = (struct weston_pointer_motion_event) { > + .mask = WESTON_POINTER_MOTION_REL, > + .dx = wl_fixed_to_double(x - b->prev_x), > + .dy = wl_fixed_to_double(y - b->prev_y) > + }; > + > notify_motion(&b->core_seat, weston_compositor_get_time(), > - x - b->prev_x, y - b->prev_y); > + &motion_event); > > b->prev_x = x; > b->prev_y = y; > diff --git a/src/compositor.h b/src/compositor.h > index f3e0075..44d9f86 100644 > --- a/src/compositor.h > +++ b/src/compositor.h > @@ -240,11 +240,24 @@ struct weston_output { > struct weston_timeline_object timeline; > }; > > +enum weston_pointer_motion_mask { > + WESTON_POINTER_MOTION_ABS = 1 << 0, > + WESTON_POINTER_MOTION_REL = 1 << 1, > +}; > + > +struct weston_pointer_motion_event { > + uint32_t mask; > + double x; > + double y; > + double dx; > + double dy; > +}; > + > struct weston_pointer_grab; > struct weston_pointer_grab_interface { > void (*focus)(struct weston_pointer_grab *grab); > void (*motion)(struct weston_pointer_grab *grab, uint32_t time, > - wl_fixed_t x, wl_fixed_t y); > + struct weston_pointer_motion_event *event); > void (*button)(struct weston_pointer_grab *grab, > uint32_t time, uint32_t button, uint32_t state); > void (*axis)(struct weston_pointer_grab *grab, > @@ -366,6 +379,11 @@ struct weston_touch { > uint32_t grab_time; > }; > > +void > +weston_pointer_motion_to_abs(struct weston_pointer *pointer, > + struct weston_pointer_motion_event *event, > + wl_fixed_t *x, wl_fixed_t *y); > + > struct weston_pointer * > weston_pointer_create(struct weston_seat *seat); > void > @@ -389,7 +407,7 @@ weston_pointer_clamp(struct weston_pointer *pointer, > wl_fixed_t *fx, wl_fixed_t *fy); > void > weston_pointer_move(struct weston_pointer *pointer, > - wl_fixed_t x, wl_fixed_t y); > + struct weston_pointer_motion_event *event); > void > weston_pointer_set_default_grab(struct weston_pointer *pointer, > const struct weston_pointer_grab_interface *interface); > @@ -1102,7 +1120,7 @@ weston_surface_activate(struct weston_surface *surface, > struct weston_seat *seat); > void > notify_motion(struct weston_seat *seat, uint32_t time, > - wl_fixed_t dx, wl_fixed_t dy); > + struct weston_pointer_motion_event *event); > void > notify_motion_absolute(struct weston_seat *seat, uint32_t time, > wl_fixed_t x, wl_fixed_t y); > diff --git a/src/data-device.c b/src/data-device.c > index 66c4c7a..d3ead5f 100644 > --- a/src/data-device.c > +++ b/src/data-device.c > @@ -334,7 +334,7 @@ drag_grab_focus(struct weston_pointer_grab *grab) > > static void > drag_grab_motion(struct weston_pointer_grab *grab, uint32_t time, > - wl_fixed_t x, wl_fixed_t y) > + struct weston_pointer_motion_event *event) > { > struct weston_pointer_drag *drag = > container_of(grab, struct weston_pointer_drag, grab); > @@ -342,7 +342,7 @@ drag_grab_motion(struct weston_pointer_grab *grab, > uint32_t time, > float fx, fy; > wl_fixed_t sx, sy; > > - weston_pointer_move(pointer, x, y); > + weston_pointer_move(pointer, event); > > if (drag->base.icon) { > fx = wl_fixed_to_double(pointer->x) + drag->base.dx; > diff --git a/src/input.c b/src/input.c > index 09d12de..53e84a0 100644 > --- a/src/input.c > +++ b/src/input.c > @@ -167,17 +167,20 @@ default_grab_pointer_focus(struct weston_pointer_grab > *grab) > > static void > default_grab_pointer_motion(struct weston_pointer_grab *grab, uint32_t time, > - wl_fixed_t x, wl_fixed_t y) > + struct weston_pointer_motion_event *event) > { > struct weston_pointer *pointer = grab->pointer; > struct wl_list *resource_list; > struct wl_resource *resource; > + wl_fixed_t x, y; > > - if (pointer->focus) > + if (pointer->focus) { > + weston_pointer_motion_to_abs(pointer, event, &x, &y); > weston_view_from_global_fixed(pointer->focus, x, y, > &pointer->sx, &pointer->sy); > + } > > - weston_pointer_move(pointer, x, y); > + weston_pointer_move(pointer, event); > > resource_list = &pointer->focus_resource_list; > wl_resource_for_each(resource, resource_list) { > @@ -936,9 +939,9 @@ weston_pointer_clamp(struct weston_pointer *pointer, > wl_fixed_t *fx, wl_fixed_t > weston_pointer_clamp_for_output(pointer, prev, fx, fy); > } > > -/* Takes absolute values */ > -WL_EXPORT void > -weston_pointer_move(struct weston_pointer *pointer, wl_fixed_t x, wl_fixed_t > y) > +static void > +weston_pointer_move_to(struct weston_pointer *pointer, > + wl_fixed_t x, wl_fixed_t y) > { > int32_t ix, iy; > > @@ -961,6 +964,33 @@ weston_pointer_move(struct weston_pointer *pointer, > wl_fixed_t x, wl_fixed_t y) > wl_signal_emit(&pointer->motion_signal, pointer); > } > > +WL_EXPORT void > +weston_pointer_motion_to_abs(struct weston_pointer *pointer, > + struct weston_pointer_motion_event *event, > + wl_fixed_t *x, wl_fixed_t *y) > +{ > + if (event->mask & WESTON_POINTER_MOTION_ABS) { > + *x = wl_fixed_from_double(event->x); > + *y = wl_fixed_from_double(event->y); > + } else if (event->mask & WESTON_POINTER_MOTION_REL) { > + *x = pointer->x + wl_fixed_from_double(event->dx); > + *y = pointer->y + wl_fixed_from_double(event->dy); > + } else { > + assert(!"invalid motion event"); > + *x = *y = 0; > + } > +} > + > +WL_EXPORT void > +weston_pointer_move(struct weston_pointer *pointer, > + struct weston_pointer_motion_event *event) > +{ > + wl_fixed_t x, y; > + > + weston_pointer_motion_to_abs(pointer, event, &x, &y); > + weston_pointer_move_to(pointer, x, y); > +} > + > /** Verify if the pointer is in a valid position and move it if it isn't. > */ > static void > @@ -1002,18 +1032,19 @@ weston_pointer_handle_output_destroy(struct > wl_listener *listener, void *data) > fy = pointer->y; > > weston_pointer_clamp_for_output(pointer, closest, &fx, &fy); > - weston_pointer_move(pointer, fx, fy); > + weston_pointer_move_to(pointer, fx, fy); > } > > WL_EXPORT void > notify_motion(struct weston_seat *seat, > - uint32_t time, wl_fixed_t dx, wl_fixed_t dy) > + uint32_t time, > + struct weston_pointer_motion_event *event) > { > struct weston_compositor *ec = seat->compositor; > struct weston_pointer *pointer = weston_seat_get_pointer(seat); > > weston_compositor_wake(ec); > - pointer->grab->interface->motion(pointer->grab, time, pointer->x + dx, > pointer->y + dy); > + pointer->grab->interface->motion(pointer->grab, time, event); > } > > static void > @@ -1058,9 +1089,17 @@ notify_motion_absolute(struct weston_seat *seat, > { > struct weston_compositor *ec = seat->compositor; > struct weston_pointer *pointer = weston_seat_get_pointer(seat); > + struct weston_pointer_motion_event event = { 0 }; > > weston_compositor_wake(ec); > - pointer->grab->interface->motion(pointer->grab, time, x, y); > + > + event = (struct weston_pointer_motion_event) { > + .mask = WESTON_POINTER_MOTION_ABS, > + .x = wl_fixed_to_double(x), > + .y = wl_fixed_to_double(y), > + }; > + > + pointer->grab->interface->motion(pointer->grab, time, &event); > } > > WL_EXPORT void > @@ -1439,7 +1478,7 @@ notify_pointer_focus(struct weston_seat *seat, struct > weston_output *output, > struct weston_pointer *pointer = weston_seat_get_pointer(seat); > > if (output) { > - weston_pointer_move(pointer, x, y); > + weston_pointer_move_to(pointer, x, y); > } else { > /* FIXME: We should call weston_pointer_set_focus(seat, > * NULL) here, but somehow that breaks re-entry... */ > diff --git a/src/libinput-device.c b/src/libinput-device.c > index 69dcbf8..7cc6a35 100644 > --- a/src/libinput-device.c > +++ b/src/libinput-device.c > @@ -86,14 +86,17 @@ handle_pointer_motion(struct libinput_device > *libinput_device, > { > struct evdev_device *device = > libinput_device_get_user_data(libinput_device); > - wl_fixed_t dx, dy; > + struct weston_pointer_motion_event event = { 0 }; > + > + event = (struct weston_pointer_motion_event) { > + .mask = WESTON_POINTER_MOTION_REL, > + .dx = libinput_event_pointer_get_dx(pointer_event), > + .dy = libinput_event_pointer_get_dy(pointer_event), > + }; > > - dx = wl_fixed_from_double(libinput_event_pointer_get_dx(pointer_event)); > - dy = wl_fixed_from_double(libinput_event_pointer_get_dy(pointer_event)); > notify_motion(device->seat, > libinput_event_pointer_get_time(pointer_event), > - dx, > - dy); > + &event); > } > > static void > diff --git a/tests/weston-test.c b/tests/weston-test.c > index b593f1e..b6ae91a 100644 > --- a/tests/weston-test.c > +++ b/tests/weston-test.c > @@ -145,10 +145,15 @@ move_pointer(struct wl_client *client, struct > wl_resource *resource, > struct weston_test *test = wl_resource_get_user_data(resource); > struct weston_seat *seat = get_seat(test); > struct weston_pointer *pointer = weston_seat_get_pointer(seat); > + struct weston_pointer_motion_event event = { 0 }; > > - notify_motion(seat, 100, > - wl_fixed_from_int(x) - pointer->x, > - wl_fixed_from_int(y) - pointer->y); > + event = (struct weston_pointer_motion_event) { > + .mask = WESTON_POINTER_MOTION_REL, > + .dx = wl_fixed_to_double(wl_fixed_from_int(x) - pointer->x), > + .dy = wl_fixed_to_double(wl_fixed_from_int(y) - pointer->y), > + }; > + > + notify_motion(seat, 100, &event); > > notify_pointer_position(test, resource); > } > _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel