When a clickpad device without multi-touch kernel support is used,
it gives wrong positions and leads to the annoying pointer jumps.
Filter the bogus events out in such a case.

Signed-off-by: Takashi Iwai <[email protected]>
---
 src/eventcomm.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/src/eventcomm.c b/src/eventcomm.c
index 517e6c3..76ff69d 100644
--- a/src/eventcomm.c
+++ b/src/eventcomm.c
@@ -363,6 +363,21 @@ EventReadHwState(InputInfoPtr pInfo,
     struct SynapticsHwState *hw = &(comm->hwState);
     SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private;
     SynapticsParameters *para = &priv->synpara;
+    int minx, miny, maxx, maxy, x;
+
+    /* range to filger out; a bit wider range is allowed since some devices
+     * are too fuzzy and give slightly shifted positions
+     */
+    minx = priv->minx;
+    maxx = priv->maxx;
+    x = (maxx - minx) / 5;
+    minx -= (minx > x) ? x : minx;
+    maxx += x;
+    miny = priv->miny;
+    maxy = priv->maxy;
+    x = (maxy - miny) / 5;
+    maxy += miny;
+    miny -= (miny > x) ? x : miny;
 
     while (SynapticsReadEvent(pInfo, &ev)) {
        switch (ev.type) {
@@ -377,6 +392,9 @@ EventReadHwState(InputInfoPtr pInfo,
                    hw->numFingers = 3;
                else
                    hw->numFingers = 0;
+               /* if the coord is out of range, we filter it out */
+               if (priv->is_clickpad && hw->z > 0 && (hw->x < minx || hw->x > 
maxx || hw->y < miny || hw->y > maxy))
+                       return FALSE;
                *hwRet = *hw;
                return TRUE;
            }
-- 
1.7.3.1

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to