[PATCH weston v4 01/20] input: Make pointer grab motion callbacks take an event struct
Jonas Ådahl
jadahl at gmail.com
Thu Nov 19 20:00:20 PST 2015
On Thu, Nov 19, 2015 at 12:23:00PM +1000, Peter Hutterer wrote:
> On Tue, Nov 17, 2015 at 06:10:47PM +0800, 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 <jadahl at gmail.com>
> > ---
>
> Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
Pushed this (also with Dereks RB) as well as two others (8 and 9) you
RB:ed. The others with RBs can be pushed together with the other stuff,
as they just add fields used later in the series.
Jonas
>
> Cheers,
> Peter
>
> > 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);
> > }
> > --
> > 2.4.3
> >
> > _______________________________________________
> > wayland-devel mailing list
> > wayland-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> >
More information about the wayland-devel
mailing list