[RFC libinput 1/2] touchpad: Extend the touchpad gesture API with pinch gestures
Hans de Goede
hdegoede at redhat.com
Mon Mar 16 02:38:58 PDT 2015
Hi,
On 12-03-15 23:57, Peter Hutterer wrote:
> On Wed, Mar 11, 2015 at 03:20:54PM +0100, Hans de Goede wrote:
>> Extend the touchpad gesture API with pinch gestures. Note that this
>> new API offers a single event stream for both pinch and rotate data, this
>> is deliberate as some applications may be interested in getting both at
>> the same time. Applications which are only interested in one or the other
>> can simply ignore the other.
>>
>> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
>> ---
>> src/libinput-private.h | 12 +++++++++
>> src/libinput.c | 51 +++++++++++++++++++++++++++++++++++--
>> src/libinput.h | 68 ++++++++++++++++++++++++++++++++++++++++++--------
>> src/libinput.sym | 2 ++
>> test/litest.c | 9 +++++++
>> tools/event-debug.c | 27 +++++++++++++++++++-
>> 6 files changed, 156 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/libinput-private.h b/src/libinput-private.h
>> index 86d1636..c0847bd 100644
>> --- a/src/libinput-private.h
>> +++ b/src/libinput-private.h
>> @@ -330,6 +330,18 @@ touch_notify_touch_up(struct libinput_device *device,
>> int32_t seat_slot);
>>
>> void
>> +gesture_notify_pinch(struct libinput_device *device,
>> + uint64_t time,
>> + enum libinput_event_type type,
>> + int finger_count,
>> + double dx,
>> + double dy,
>> + double dx_unaccel,
>> + double dy_unaccel,
>> + double distance,
>> + double angle);
>> +
>> +void
>> gesture_notify_swipe(struct libinput_device *device,
>> uint64_t time,
>> enum libinput_event_type type,
>> diff --git a/src/libinput.c b/src/libinput.c
>> index f49e7fe..5fb0c65 100644
>> --- a/src/libinput.c
>> +++ b/src/libinput.c
>> @@ -87,6 +87,8 @@ struct libinput_event_gesture {
>> double dy;
>> double dx_unaccel;
>> double dy_unaccel;
>> + double distance;
>> + double angle;
>> };
>>
>> static void
>> @@ -196,6 +198,9 @@ libinput_event_get_pointer_event(struct libinput_event *event)
>> case LIBINPUT_EVENT_GESTURE_SWIPE_START:
>> case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
>> case LIBINPUT_EVENT_GESTURE_SWIPE_END:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_START:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_END:
>> break;
>> }
>>
>> @@ -226,6 +231,9 @@ libinput_event_get_keyboard_event(struct libinput_event *event)
>> case LIBINPUT_EVENT_GESTURE_SWIPE_START:
>> case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
>> case LIBINPUT_EVENT_GESTURE_SWIPE_END:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_START:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_END:
>> break;
>> }
>>
>> @@ -255,6 +263,9 @@ libinput_event_get_touch_event(struct libinput_event *event)
>> case LIBINPUT_EVENT_GESTURE_SWIPE_START:
>> case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
>> case LIBINPUT_EVENT_GESTURE_SWIPE_END:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_START:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_END:
>> break;
>> }
>>
>> @@ -285,6 +296,9 @@ libinput_event_get_gesture_event(struct libinput_event *event)
>> case LIBINPUT_EVENT_GESTURE_SWIPE_START:
>> case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
>> case LIBINPUT_EVENT_GESTURE_SWIPE_END:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_START:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_END:
>> return (struct libinput_event_gesture *) event;
>> }
>>
>> @@ -314,6 +328,9 @@ libinput_event_get_device_notify_event(struct libinput_event *event)
>> case LIBINPUT_EVENT_GESTURE_SWIPE_START:
>> case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
>> case LIBINPUT_EVENT_GESTURE_SWIPE_END:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_START:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
>> + case LIBINPUT_EVENT_GESTURE_PINCH_END:
>> break;
>> }
>>
>> @@ -595,6 +612,18 @@ libinput_event_gesture_get_dy_unaccelerated(
>> return event->dy_unaccel;
>> }
>>
>> +LIBINPUT_EXPORT double
>> +libinput_event_gesture_get_distance(struct libinput_event_gesture *event)
>> +{
>> + return event->distance;
>> +}
>> +
>> +LIBINPUT_EXPORT double
>> +libinput_event_gesture_get_angle(struct libinput_event_gesture *event)
>> +{
>> + return event->angle;
>> +}
>> +
>> struct libinput_source *
>> libinput_add_fd(struct libinput *libinput,
>> int fd,
>> @@ -1257,14 +1286,16 @@ touch_notify_frame(struct libinput_device *device,
>> }
>>
>> void
>> -gesture_notify_swipe(struct libinput_device *device,
>> +gesture_notify_pinch(struct libinput_device *device,
>> uint64_t time,
>> enum libinput_event_type type,
>> int finger_count,
>> double dx,
>> double dy,
>> double dx_unaccel,
>> - double dy_unaccel)
>> + double dy_unaccel,
>> + double distance,
>> + double angle)
>> {
>> struct libinput_event_gesture *gesture_event;
>>
>> @@ -1279,12 +1310,28 @@ gesture_notify_swipe(struct libinput_device *device,
>> .dy = dy,
>> .dx_unaccel = dx_unaccel,
>> .dy_unaccel = dy_unaccel,
>> + .distance = distance,
>> + .angle = angle,
>> };
>>
>> post_device_event(device, time, type,
>> &gesture_event->base);
>> }
>>
>> +void
>> +gesture_notify_swipe(struct libinput_device *device,
>> + uint64_t time,
>> + enum libinput_event_type type,
>> + int finger_count,
>> + double dx,
>> + double dy,
>> + double dx_unaccel,
>> + double dy_unaccel)
>> +{
>> + gesture_notify_pinch(device, time, type, finger_count,
>> + dx, dy, dx_unaccel, dy_unaccel, 0.0, 0.0);
>> +}
>> +
>
> maybe more obvious to have a static void gesture_notify() and then call that
> from gesture_notify_pinch and gesture_notify_swipe. Less confusing than
> calling the notify_pinch from a notify_swipe.
Fixed for the first non RFC posting of this set.
>
>> static void
>> libinput_post_event(struct libinput *libinput,
>> struct libinput_event *event)
>> diff --git a/src/libinput.h b/src/libinput.h
>> index 1637a64..a005d66 100644
>> --- a/src/libinput.h
>> +++ b/src/libinput.h
>> @@ -178,6 +178,9 @@ enum libinput_event_type {
>> LIBINPUT_EVENT_GESTURE_SWIPE_START = 800,
>> LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE,
>> LIBINPUT_EVENT_GESTURE_SWIPE_END,
>> + LIBINPUT_EVENT_GESTURE_PINCH_START,
>> + LIBINPUT_EVENT_GESTURE_PINCH_UPDATE,
>> + LIBINPUT_EVENT_GESTURE_PINCH_END,
>> };
>>
>> /**
>> @@ -957,7 +960,7 @@ libinput_event_gesture_get_finger_count(struct libinput_event_gesture *event);
>> * @ingroup event_gesture
>> *
>> * Return the delta between the last event and the current event. For gesture
>> - * events that are not of type @ref LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE, this
>> + * events that are not of type LIBINPUT_EVENT_GESTURE_FOO_UPDATE, this
>
> annoying as it is, I'd prefer this spelled out for all possibilities and
> @ref'd accordingly.
Also fixed for the first non RFC posting of this set.
> Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
> otherwise
Regards,
Hans
More information about the wayland-devel
mailing list