Add hold gesture implementation
Merge request to implement the new hold gesture described in !293 (closed) and fix #300 (closed) at least at the libinput level.
Hold gestures are notifications about fingers on the touchpad. As touchpad touches are generally fully abstracted, a client cannot currently know when a user is interacting with the touchpad without moving.
Hold gestures are primarily designed for two interactions:
- hold-to-interact: where a hold gesture is active for some time a menu could pop up, or some object is selected, etc.
- hold-to-cancel: where e.g. kinetic scrolling is currently active, the start of a hold gesture can be used to stop the scroll
Since hold gestures by definition do not have movement, there is no need for an "update" stage in the gesture.
Status:
- libinput: Implement hold gestures (this MR)
- libinput: Documentation !293 (closed)
- Wayland protocols wayland/wayland-protocols!81 (merged)
- wlroots implementation: https://github.com/swaywm/wlroots/pull/3047
- Mutter https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1830
- GTK https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/3454
Implementation explanation:
Hold gestures are a little bit special because they are the only gestures that don't require motion to be triggered.
That's why you will notice that I had the make a couple of small changes in src/evdev-mt-touchpad.c - tp_post_events
and add tp->gesture.filter_motion
.
In the next layer, the gesture state machine, I integrated pointer motion as an extra state and moved the motion based gesture recognition (swipe, pinch, scroll and pointer motion) to a common place, emitting gesture_event
events when they are recogniced.
Next, I added the hold gesture state, that can be triggered following 2 paths:
- If tap is not enabled, hold is triggered after
DEFAULT_GESTURE_HOLD_TIMEOUT
if no motion or gesture is detected - If tap is enabled, hold is synchronised with the tap state machine and triggered on
TAP_STATE_HOLD
,TAP_STATE_TOUCH_2_HOLD
orTAP_STATE_TOUCH_3_HOLD
I decided to not change how LIBINPUT_DEVICE_CAP_GESTURE
works, even though it is technically possible to add some level of support to devices with !tp->gesture.enabled
.
I think that the diff is big and complex enough at this point and I'd rather prefer to improve support in a follow up MR once this get's implemented by clients, we see that hold gestures are useful and/or someone request support.