From: Nicolas Cavallari <batch...@free.fr>

Currently, when detecting a tap release, the corner tap detection
uses the current touch position to figure out which corner it
corresponds. The problem is that, theoretically, there is no such position
because there is no touch. It work in mosts cases because most touchpad
are fast enough to still have a position on release, but some aren't.

In that case, the driver do corner tap detection using the position
given by the hardware when there is no touch, that is, (0,0), (1,5855)
or whatever. The driver will detect them as corner tap, regardless of
the initial touch position. On the default configuration, corner taps
are ignored, so basically, these tap are not working.

This patch make tap detection use the initial touch position to
detect corner taps.

Signed-off-by: Nicolas Cavallari <batch...@free.fr>
---
 src/synaptics.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/synaptics.c b/src/synaptics.c
index 88bd024..783bd64 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1538,11 +1538,12 @@ GetTimeOut(SynapticsPrivate *priv)
 
 static int
 HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw,
-                   edge_type edge, enum FingerState finger, Bool 
inside_active_area)
+                   enum FingerState finger, Bool inside_active_area)
 {
     SynapticsParameters *para = &priv->synpara;
     Bool touch, release, is_timeout, move;
     int timeleft, timeout;
+    edge_type edge;
     int delay = 1000000000;
 
     if (priv->palm)
@@ -1589,6 +1590,7 @@ HandleTapProcessing(SynapticsPrivate *priv, struct 
SynapticsHwState *hw,
            SetTapState(priv, TS_MOVE, hw->millis);
            goto restart;
        } else if (release) {
+           edge = edge_detection(priv, priv->touch_on.x, priv->touch_on.y);
            SelectTapButton(priv, edge);
            /* Disable taps outside of the active area */
            if (!inside_active_area) {
@@ -2399,7 +2401,7 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState 
*hw)
 
     /* tap and drag detection. Needs to be performed even if the finger is in
      * the dead area to reset the state. */
-    timeleft = HandleTapProcessing(priv, hw, edge, finger, inside_active_area);
+    timeleft = HandleTapProcessing(priv, hw, finger, inside_active_area);
     if (timeleft > 0)
        delay = MIN(delay, timeleft);
 
-- 
1.7.2.3

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to