On Wed, Feb 19, 2014 at 10:04:11PM +0100, Jonas Ådahl wrote: > Instead of having one touch events representing different types of touch > events by providing a touch type, have one separate event type per touch > type. This means the LIBINPUT_EVENT_TYPE_TOUCH is replaced with > LIBINPUT_EVENT_TYPE_TOUCH_DOWN, LIBINPUT_EVENT_TYPE_TOUCH_MOTION, > LIBINPUT_EVENT_TYPE_TOUCH_UP and LIBINPUT_EVENT_TYPE_TOUCH_CANCEL. > > Signed-off-by: Jonas Ådahl <[email protected]>
Reviewed-by: Peter Hutterer <[email protected]> Note that for proper doxygen you need to add @ref before all new LIBINPUT_... bits in the function documentation. And it'd be nice to move the touch_type documentation to TOUCH_DOWN so it's still present in the documentation. Cheers, Peter > --- > src/evdev.c | 63 +++++++++++----------------------- > src/libinput-private.h | 27 +++++++++++---- > src/libinput.c | 93 > +++++++++++++++++++++++++++++++++++++++----------- > src/libinput.h | 54 ++++++++++++----------------- > tools/event-debug.c | 45 +++++++++++++----------- > 5 files changed, 159 insertions(+), 123 deletions(-) > > diff --git a/src/evdev.c b/src/evdev.c > index 2b7070a..d54bcd1 100644 > --- a/src/evdev.c > +++ b/src/evdev.c > @@ -110,6 +110,7 @@ static void > evdev_flush_pending_event(struct evdev_device *device, uint32_t time) > { > int32_t cx, cy; > + li_fixed_t x, y; > int slot; > uint32_t seat_slot; > struct libinput_device *base = &device->base; > @@ -135,28 +136,20 @@ evdev_flush_pending_event(struct evdev_device *device, > uint32_t time) > seat_slot = ffs(~seat->slot_map) - 1; > device->mt.slots[slot].seat_slot = seat_slot; > seat->slot_map |= 1 << seat_slot; > + x = li_fixed_from_int(device->mt.slots[slot].x); > + y = li_fixed_from_int(device->mt.slots[slot].y); > > - touch_notify_touch(base, > - time, > - slot, > - seat_slot, > - li_fixed_from_int(device->mt.slots[slot].x), > - li_fixed_from_int(device->mt.slots[slot].y), > - LIBINPUT_TOUCH_TYPE_DOWN); > + touch_notify_touch_down(base, time, slot, seat_slot, x, y); > break; > case EVDEV_ABSOLUTE_MT_MOTION: > if (!(device->seat_caps & EVDEV_DEVICE_TOUCH)) > break; > > seat_slot = device->mt.slots[slot].seat_slot; > + x = li_fixed_from_int(device->mt.slots[slot].x); > + y = li_fixed_from_int(device->mt.slots[slot].y); > > - touch_notify_touch(base, > - time, > - slot, > - seat_slot, > - li_fixed_from_int(device->mt.slots[slot].x), > - li_fixed_from_int(device->mt.slots[slot].y), > - LIBINPUT_TOUCH_TYPE_MOTION); > + touch_notify_touch_motion(base, time, slot, seat_slot, x, y); > break; > case EVDEV_ABSOLUTE_MT_UP: > if (!(device->seat_caps & EVDEV_DEVICE_TOUCH)) > @@ -165,12 +158,7 @@ evdev_flush_pending_event(struct evdev_device *device, > uint32_t time) > seat_slot = device->mt.slots[slot].seat_slot; > seat->slot_map &= ~(1 << seat_slot); > > - touch_notify_touch(base, > - time, > - slot, > - seat_slot, > - 0, 0, > - LIBINPUT_TOUCH_TYPE_UP); > + touch_notify_touch_up(base, time, slot, seat_slot); > break; > case EVDEV_ABSOLUTE_TOUCH_DOWN: > if (!(device->seat_caps & EVDEV_DEVICE_TOUCH)) > @@ -181,29 +169,21 @@ evdev_flush_pending_event(struct evdev_device *device, > uint32_t time) > seat->slot_map |= 1 << seat_slot; > > transform_absolute(device, &cx, &cy); > - touch_notify_touch(base, > - time, > - -1, > - seat_slot, > - li_fixed_from_int(cx), > - li_fixed_from_int(cy), > - LIBINPUT_TOUCH_TYPE_DOWN); > + x = li_fixed_from_int(cx); > + y = li_fixed_from_int(cy); > + > + touch_notify_touch_down(base, time, -1, seat_slot, x, y); > break; > case EVDEV_ABSOLUTE_MOTION: > transform_absolute(device, &cx, &cy); > + x = li_fixed_from_int(cx); > + y = li_fixed_from_int(cy); > + > if (device->seat_caps & EVDEV_DEVICE_TOUCH) { > - touch_notify_touch(base, > - time, > - -1, > - device->abs.seat_slot, > - li_fixed_from_int(cx), > - li_fixed_from_int(cy), > - LIBINPUT_TOUCH_TYPE_DOWN); > + seat_slot = device->abs.seat_slot; > + touch_notify_touch_motion(base, time, -1, seat_slot, x, > y); > } else if (device->seat_caps & EVDEV_DEVICE_POINTER) { > - pointer_notify_motion_absolute(base, > - time, > - li_fixed_from_int(cx), > - li_fixed_from_int(cy)); > + pointer_notify_motion_absolute(base, time, x, y); > } > break; > case EVDEV_ABSOLUTE_TOUCH_UP: > @@ -213,12 +193,7 @@ evdev_flush_pending_event(struct evdev_device *device, > uint32_t time) > seat_slot = device->abs.seat_slot; > seat->slot_map &= ~(1 << seat_slot); > > - touch_notify_touch(base, > - time, > - -1, > - seat_slot, > - 0, 0, > - LIBINPUT_TOUCH_TYPE_UP); > + touch_notify_touch_up(base, time, -1, seat_slot); > break; > default: > assert(0 && "Unknown pending event type"); > diff --git a/src/libinput-private.h b/src/libinput-private.h > index e9931b8..d6d82bc 100644 > --- a/src/libinput-private.h > +++ b/src/libinput-private.h > @@ -146,13 +146,26 @@ pointer_notify_axis(struct libinput_device *device, > li_fixed_t value); > > void > -touch_notify_touch(struct libinput_device *device, > - uint32_t time, > - int32_t slot, > - int32_t seat_slot, > - li_fixed_t x, > - li_fixed_t y, > - enum libinput_touch_type touch_type); > +touch_notify_touch_down(struct libinput_device *device, > + uint32_t time, > + int32_t slot, > + int32_t seat_slot, > + li_fixed_t x, > + li_fixed_t y); > + > +void > +touch_notify_touch_motion(struct libinput_device *device, > + uint32_t time, > + int32_t slot, > + int32_t seat_slot, > + li_fixed_t x, > + li_fixed_t y); > + > +void > +touch_notify_touch_up(struct libinput_device *device, > + uint32_t time, > + int32_t slot, > + int32_t seat_slot); > > void > touch_notify_frame(struct libinput_device *device, > diff --git a/src/libinput.c b/src/libinput.c > index e0b7f71..75f1ad1 100644 > --- a/src/libinput.c > +++ b/src/libinput.c > @@ -75,7 +75,6 @@ struct libinput_event_touch { > int32_t seat_slot; > li_fixed_t x; > li_fixed_t y; > - enum libinput_touch_type touch_type; > }; > > static void > @@ -115,7 +114,10 @@ libinput_event_get_pointer_event(struct libinput_event > *event) > case LIBINPUT_EVENT_POINTER_BUTTON: > case LIBINPUT_EVENT_POINTER_AXIS: > return (struct libinput_event_pointer *) event; > - case LIBINPUT_EVENT_TOUCH_TOUCH: > + case LIBINPUT_EVENT_TOUCH_DOWN: > + case LIBINPUT_EVENT_TOUCH_UP: > + case LIBINPUT_EVENT_TOUCH_MOTION: > + case LIBINPUT_EVENT_TOUCH_CANCEL: > case LIBINPUT_EVENT_TOUCH_FRAME: > break; > } > @@ -138,7 +140,10 @@ libinput_event_get_keyboard_event(struct libinput_event > *event) > case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: > case LIBINPUT_EVENT_POINTER_BUTTON: > case LIBINPUT_EVENT_POINTER_AXIS: > - case LIBINPUT_EVENT_TOUCH_TOUCH: > + case LIBINPUT_EVENT_TOUCH_DOWN: > + case LIBINPUT_EVENT_TOUCH_UP: > + case LIBINPUT_EVENT_TOUCH_MOTION: > + case LIBINPUT_EVENT_TOUCH_CANCEL: > case LIBINPUT_EVENT_TOUCH_FRAME: > break; > } > @@ -160,7 +165,10 @@ libinput_event_get_touch_event(struct libinput_event > *event) > case LIBINPUT_EVENT_POINTER_BUTTON: > case LIBINPUT_EVENT_POINTER_AXIS: > break; > - case LIBINPUT_EVENT_TOUCH_TOUCH: > + case LIBINPUT_EVENT_TOUCH_DOWN: > + case LIBINPUT_EVENT_TOUCH_UP: > + case LIBINPUT_EVENT_TOUCH_MOTION: > + case LIBINPUT_EVENT_TOUCH_CANCEL: > case LIBINPUT_EVENT_TOUCH_FRAME: > return (struct libinput_event_touch *) event; > } > @@ -182,7 +190,10 @@ libinput_event_get_device_notify_event(struct > libinput_event *event) > case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: > case LIBINPUT_EVENT_POINTER_BUTTON: > case LIBINPUT_EVENT_POINTER_AXIS: > - case LIBINPUT_EVENT_TOUCH_TOUCH: > + case LIBINPUT_EVENT_TOUCH_DOWN: > + case LIBINPUT_EVENT_TOUCH_UP: > + case LIBINPUT_EVENT_TOUCH_MOTION: > + case LIBINPUT_EVENT_TOUCH_CANCEL: > case LIBINPUT_EVENT_TOUCH_FRAME: > break; > } > @@ -334,12 +345,6 @@ libinput_event_touch_get_y(struct libinput_event_touch > *event) > return event->y; > } > > -LIBINPUT_EXPORT enum libinput_touch_type > -libinput_event_touch_get_touch_type(struct libinput_event_touch *event) > -{ > - return event->touch_type; > -} > - > struct libinput_source * > libinput_add_fd(struct libinput *libinput, > int fd, > @@ -778,13 +783,39 @@ pointer_notify_axis(struct libinput_device *device, > } > > void > -touch_notify_touch(struct libinput_device *device, > - uint32_t time, > - int32_t slot, > - int32_t seat_slot, > - li_fixed_t x, > - li_fixed_t y, > - enum libinput_touch_type touch_type) > +touch_notify_touch_down(struct libinput_device *device, > + uint32_t time, > + int32_t slot, > + int32_t seat_slot, > + li_fixed_t x, > + li_fixed_t y) > +{ > + struct libinput_event_touch *touch_event; > + > + touch_event = zalloc(sizeof *touch_event); > + if (!touch_event) > + return; > + > + *touch_event = (struct libinput_event_touch) { > + .time = time, > + .slot = slot, > + .seat_slot = seat_slot, > + .x = x, > + .y = y, > + }; > + > + post_device_event(device, > + LIBINPUT_EVENT_TOUCH_DOWN, > + &touch_event->base); > +} > + > +void > +touch_notify_touch_motion(struct libinput_device *device, > + uint32_t time, > + int32_t slot, > + int32_t seat_slot, > + li_fixed_t x, > + li_fixed_t y) > { > struct libinput_event_touch *touch_event; > > @@ -798,11 +829,33 @@ touch_notify_touch(struct libinput_device *device, > .seat_slot = seat_slot, > .x = x, > .y = y, > - .touch_type = touch_type, > }; > > post_device_event(device, > - LIBINPUT_EVENT_TOUCH_TOUCH, > + LIBINPUT_EVENT_TOUCH_MOTION, > + &touch_event->base); > +} > + > +void > +touch_notify_touch_up(struct libinput_device *device, > + uint32_t time, > + int32_t slot, > + int32_t seat_slot) > +{ > + struct libinput_event_touch *touch_event; > + > + touch_event = zalloc(sizeof *touch_event); > + if (!touch_event) > + return; > + > + *touch_event = (struct libinput_event_touch) { > + .time = time, > + .slot = slot, > + .seat_slot = seat_slot, > + }; > + > + post_device_event(device, > + LIBINPUT_EVENT_TOUCH_UP, > &touch_event->base); > } > > diff --git a/src/libinput.h b/src/libinput.h > index a27c164..780b10e 100644 > --- a/src/libinput.h > +++ b/src/libinput.h > @@ -99,21 +99,6 @@ enum libinput_pointer_axis { > }; > > /** > - * @ingroup device > - * > - * Logical touch state of a touch point. A touch point usually follows the > - * sequence down, motion, up, with the number of motion events being zero or > - * greater. If a touch point was used for gesture interpretation internally > - * and will not generate any further events, the touchpoint is cancelled. > - */ > -enum libinput_touch_type { > - LIBINPUT_TOUCH_TYPE_DOWN = 0, > - LIBINPUT_TOUCH_TYPE_UP = 1, > - LIBINPUT_TOUCH_TYPE_MOTION = 2, > - LIBINPUT_TOUCH_TYPE_CANCEL = 4 > -}; > - > -/** > * @ingroup base > * > * Event type for events returned by libinput_get_event(). > @@ -149,7 +134,10 @@ enum libinput_event_type { > LIBINPUT_EVENT_POINTER_BUTTON, > LIBINPUT_EVENT_POINTER_AXIS, > > - LIBINPUT_EVENT_TOUCH_TOUCH = 500, > + LIBINPUT_EVENT_TOUCH_DOWN = 500, > + LIBINPUT_EVENT_TOUCH_UP, > + LIBINPUT_EVENT_TOUCH_MOTION, > + LIBINPUT_EVENT_TOUCH_CANCEL, > /** > * Signals the end of a set of touchpoints at one device sample > * time. This event has no coordinate information attached. > @@ -172,7 +160,9 @@ struct libinput_event_pointer; > * > * Touch event representing a touch down, move or up, as well as a touch > * cancel and touch frame events. Valid event types for this event are @ref > - * LIBINPUT_EVENT_TOUCH_TOUCH and @ref LIBINPUT_EVENT_TOUCH_FRAME. > + * LIBINPUT_EVENT_TOUCH_DOWN, LIBINPUT_EVENT_TOUCH_MOTION, > + * LIBINPUT_EVENT_TOUCH_UP, LIBINPUT_EVENT_TOUCH_CANCEL and @ref > + * LIBINPUT_EVENT_TOUCH_FRAME. > */ > struct libinput_event_touch; > > @@ -561,7 +551,8 @@ libinput_event_touch_get_time(struct libinput_event_touch > *event); > * If the touch event has no assigned slot, for example if it is from a > * single touch device, this function returns -1. > * > - * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME. > + * @note this function should not be called for LIBINPUT_EVENT_TOUCH_CANCEL > or > + * LIBINPUT_EVENT_TOUCH_FRAME. > * > * @return The slot of this touch event > */ > @@ -577,7 +568,8 @@ libinput_event_touch_get_slot(struct libinput_event_touch > *event); > * Events from single touch devices will be represented as one individual > * touch point per device. > * > - * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME. > + * @note this function should not be called for LIBINPUT_EVENT_TOUCH_CANCEL > or > + * LIBINPUT_EVENT_TOUCH_FRAME. > * > * @return The seat slot of the touch event > */ > @@ -593,7 +585,8 @@ libinput_event_touch_get_seat_slot(struct > libinput_event_touch *event); > * corresponding output screen coordinate, use > * libinput_event_touch_get_x_transformed(). > * > - * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME. > + * @note this function should only be called for LIBINPUT_EVENT_TOUCH_DOWN > and > + * LIBINPUT_EVENT_TOUCH_MOTION. > * > * @param event The libinput touch event > * @return the current absolute x coordinate > @@ -610,7 +603,10 @@ libinput_event_touch_get_x(struct libinput_event_touch > *event); > * corresponding output screen coordinate, use > * libinput_event_touch_get_y_transformed(). > * > - * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME. > + * For LIBINPUT_EVENT_TOUCH_UP 0 is returned. > + * > + * @note this function should only be called for LIBINPUT_EVENT_TOUCH_DOWN > and > + * LIBINPUT_EVENT_TOUCH_MOTION. > * > * @param event The libinput touch event > * @return the current absolute y coordinate > @@ -624,7 +620,8 @@ libinput_event_touch_get_y(struct libinput_event_touch > *event); > * Return the current absolute x coordinate of the touch event, transformed > to > * screen coordinates. > * > - * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME. > + * @note this function should only be called for LIBINPUT_EVENT_TOUCH_DOWN > and > + * LIBINPUT_EVENT_TOUCH_MOTION. > * > * @param event The libinput touch event > * @param width The current output screen width > @@ -640,7 +637,8 @@ libinput_event_touch_get_x_transformed(struct > libinput_event_touch *event, > * Return the current absolute y coordinate of the touch event, transformed > to > * screen coordinates. > * > - * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME. > + * @note this function should only be called for LIBINPUT_EVENT_TOUCH_DOWN > and > + * LIBINPUT_EVENT_TOUCH_MOTION. > * > * @param event The libinput touch event > * @param height The current output screen height > @@ -651,16 +649,6 @@ libinput_event_touch_get_y_transformed(struct > libinput_event_touch *event, > uint32_t height); > > /** > - * @ingroup event_touch > - * > - * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME. > - * > - * @return the type of touch that occured on the device > - */ > -enum libinput_touch_type > -libinput_event_touch_get_touch_type(struct libinput_event_touch *event); > - > -/** > * @defgroup base Initialization and manipulation of libinput contexts > */ > > diff --git a/tools/event-debug.c b/tools/event-debug.c > index 4eb5dd3..876f6f0 100644 > --- a/tools/event-debug.c > +++ b/tools/event-debug.c > @@ -199,8 +199,17 @@ print_event_header(struct libinput_event *ev) > case LIBINPUT_EVENT_POINTER_AXIS: > type = "POINTER_AXIS"; > break; > - case LIBINPUT_EVENT_TOUCH_TOUCH: > - type = "TOUCH_TOUCH"; > + case LIBINPUT_EVENT_TOUCH_DOWN: > + type = "TOUCH_DOWN"; > + break; > + case LIBINPUT_EVENT_TOUCH_MOTION: > + type = "TOUCH_MOTION"; > + break; > + case LIBINPUT_EVENT_TOUCH_UP: > + type = "TOUCH_UP"; > + break; > + case LIBINPUT_EVENT_TOUCH_CANCEL: > + type = "TOUCH_CANCEL"; > break; > case LIBINPUT_EVENT_TOUCH_FRAME: > type = "TOUCH_FRAME"; > @@ -309,7 +318,7 @@ print_axis_event(struct libinput_event *ev) > } > > static void > -print_touch_frame_event(struct libinput_event *ev) > +print_touch_event_without_coords(struct libinput_event *ev) > { > struct libinput_event_touch *t = libinput_event_get_touch_event(ev); > > @@ -318,26 +327,15 @@ print_touch_frame_event(struct libinput_event *ev) > } > > static void > -print_touch_event(struct libinput_event *ev) > +print_touch_event_with_coords(struct libinput_event *ev) > { > struct libinput_event_touch *t = libinput_event_get_touch_event(ev); > li_fixed_t x = libinput_event_touch_get_x_transformed(t, screen_width), > y = libinput_event_touch_get_y_transformed(t, screen_height); > - const char *type; > - > - switch (libinput_event_touch_get_touch_type(t)) { > - case LIBINPUT_TOUCH_TYPE_DOWN: type = "down"; break; > - case LIBINPUT_TOUCH_TYPE_UP: type = "up"; break; > - case LIBINPUT_TOUCH_TYPE_MOTION: type = "motion"; break; > - case LIBINPUT_TOUCH_TYPE_CANCEL: type = "cancel"; break; > - default: > - abort(); > - } > > print_event_time(libinput_event_touch_get_time(t)); > > - printf("%6s %d (%d) %5.2f/%5.2f\n", > - type, > + printf("%d (%d) %5.2f/%5.2f\n", > libinput_event_touch_get_slot(t), > libinput_event_touch_get_seat_slot(t), > li_fixed_to_double(x), > @@ -376,11 +374,20 @@ handle_and_print_events(struct libinput *li) > case LIBINPUT_EVENT_POINTER_AXIS: > print_axis_event(ev); > break; > - case LIBINPUT_EVENT_TOUCH_TOUCH: > - print_touch_event(ev); > + case LIBINPUT_EVENT_TOUCH_DOWN: > + print_touch_event_with_coords(ev); > + break; > + case LIBINPUT_EVENT_TOUCH_MOTION: > + print_touch_event_with_coords(ev); > + break; > + case LIBINPUT_EVENT_TOUCH_UP: > + print_touch_event_without_coords(ev); > + break; > + case LIBINPUT_EVENT_TOUCH_CANCEL: > + print_touch_event_without_coords(ev); > break; > case LIBINPUT_EVENT_TOUCH_FRAME: > - print_touch_frame_event(ev); > + print_touch_event_without_coords(ev); > break; > } > > -- > 1.8.3.2 > > _______________________________________________ > wayland-devel mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/wayland-devel > _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
