touchpad: add a TOUCH_MAYBE_END state
This state is used by the pre-processing of the touch states to indicate that the touch point has ended and is changed to TOUCH_END as soon as that pre-processing is finished. Sometimes we have to resurrect a touch point that has physically or logically ended but needs to be kept around to keep the BTN_TOOL_* fake finger count happy. Particularly on Synaptics touchpads, where a BTN_TOOL_TRIPLETAP can cause a touch point to end (i.e. 1 touch down + TRIPLETAP) but that touch restarts in the next sequence. We had a quirk for this in place already, but if we end the touch and then re-instate it with tp_begin_touch(), we may lose some information about thumb/palm/etc. states that touch already had. As a result, the state machines can get confused and a touch that was previously ignored as thumb suddenly isn't one anymore and triggers assertions. The specific sequence in bug 10528 is: * touch T1 down * touch T2 down, detected as speed-based thumb, tap state machine ignores it * frame F: TRIPLETAP down, touch T2 up * frame F+1: touch T2 down in next frame, but without the thumb bit * frame F+n: touch T2 ends, tap state machine gets confused because that touch should not trigger a release https://bugs.freedesktop.org/show_bug.cgi?id=105258 Signed-off-by:Peter Hutterer <peter.hutterer@who-t.net>
- src/evdev-mt-touchpad-edge-scroll.c 8 additions, 0 deletionssrc/evdev-mt-touchpad-edge-scroll.c
- src/evdev-mt-touchpad.c 74 additions, 19 deletionssrc/evdev-mt-touchpad.c
- src/evdev-mt-touchpad.h 5 additions, 4 deletionssrc/evdev-mt-touchpad.h
- test/test-touchpad.c 67 additions, 0 deletionstest/test-touchpad.c