[PATCH synaptics v5 17/18] Ignore motion during touch count changes on semi-mt devices

Peter Hutterer peter.hutterer at who-t.net
Mon Mar 12 23:37:44 PDT 2012

From: Chase Douglas <chase.douglas at canonical.com>

Semi-mt devices do not track touches. The locations of touches are
unknown, we only have the bounding box of two of them. When the number of
fingers changes, the bounding box coordinates may change as well, but
the cumulative relative motion updates at that instant are invalid.

To work around this, ignore changes in cumulative relative motion if the
touch count changes.

Signed-off-by: Chase Douglas <chase.douglas at canonical.com>
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
 src/synaptics.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/src/synaptics.c b/src/synaptics.c
index 1164918..4275d2a 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1598,6 +1598,14 @@ ReadInput(InputInfoPtr pInfo)
     while (SynapticsGetHwState(pInfo, priv, hw)) {
+	/* Semi-mt device touch slots do not track touches. When there is a
+	 * change in the number of touches, we must disregard the temporary
+	 * motion changes. */
+	if (priv->has_semi_mt && hw->numFingers != priv->hwState->numFingers) {
+	    hw->cumulative_dx = priv->hwState->cumulative_dx;
+	    hw->cumulative_dy = priv->hwState->cumulative_dy;
+	}
 	SynapticsCopyHwState(priv->hwState, hw);
 	delay = HandleState(pInfo, hw, hw->millis, FALSE);
 	SynapticsCopyHwState(priv->old_hw_state, priv->hwState);

More information about the xorg-devel mailing list