touchpad: add a TOUCH_MAYBE_END state
authorPeter Hutterer <peter.hutterer@who-t.net>
Wed, 28 Feb 2018 02:51:27 +0000 (12:51 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Thu, 1 Mar 2018 02:24:48 +0000 (12:24 +1000)
commit6ccd8e934f965150173866db265ca544031c6e6b
tree32277d6af1b284637b3331daab6e5a012c22bb9b
parent3979b9e16a5ed141506d95f80ddfd7b94651dcfa
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
src/evdev-mt-touchpad.c
src/evdev-mt-touchpad.h
test/test-touchpad.c