[PATCH synaptics] Don't assume that touch devices report per finger width and pressure

Gabriele Mazzotta gabriele.mzt at gmail.com
Wed Jan 7 05:12:33 PST 2015


The palm detection relies on both the width and the pressure.
a897147be04 ("Use ABS_MT events for the palm detection when supported")
assumed that all the touch devices can report both ABS_MT_TOUCH_MAJOR
and ABS_MT_PRESSURE, but this is not necessarily true. This assumption
could hence break the palm detection when at least one of the mentioned
events is not declared but both ABS_TOOL_WIDTH and ABS_PRESSURE are
reported.

Signed-off-by: Gabriele Mazzotta <gabriele.mzt at gmail.com>
---
 src/eventcomm.c    | 10 ++++++++--
 src/synaptics.c    |  2 +-
 src/synapticsstr.h |  1 +
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/eventcomm.c b/src/eventcomm.c
index 931859b..9d98feb 100644
--- a/src/eventcomm.c
+++ b/src/eventcomm.c
@@ -626,9 +626,11 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw,
                     hw->cumulative_dx += ev->value - last_val;
                 else if (ev->code == ABS_MT_POSITION_Y)
                     hw->cumulative_dy += ev->value - last_val;
-                else if (ev->code == ABS_MT_TOUCH_MAJOR)
+                else if (ev->code == ABS_MT_TOUCH_MAJOR &&
+                         priv->has_mt_palm_detect)
                     hw->fingerWidth = ev->value;
-                else if (ev->code == ABS_MT_PRESSURE)
+                else if (ev->code == ABS_MT_PRESSURE &&
+                         priv->has_mt_palm_detect)
                     hw->z = ev->value;
             }
 
@@ -886,6 +888,10 @@ event_query_touch(InputInfoPtr pInfo)
             return;
         }
 
+        if (libevdev_has_event_code(dev, EV_ABS, ABS_MT_TOUCH_MAJOR) &&
+            libevdev_has_event_code(dev, EV_ABS, ABS_MT_PRESSURE))
+            priv->has_mt_palm_detect = TRUE;
+
         axnum = 0;
         for (axis = ABS_MT_SLOT + 1; axis <= ABS_MT_MAX; axis++) {
             int axis_idx = axis - ABS_MT_TOUCH_MAJOR;
diff --git a/src/synaptics.c b/src/synaptics.c
index 2746565..3b11fda 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1857,7 +1857,7 @@ SynapticsDetectFinger(SynapticsPrivate * priv, struct SynapticsHwState *hw)
     if ((hw->z > para->palm_min_z) && (hw->fingerWidth > para->palm_min_width))
         return FS_BLOCKED;
 
-    if (priv->has_touch)
+    if (priv->has_mt_palm_detect)
         return finger;
 
     if (hw->x == 0 || priv->finger_state == FS_UNTOUCHED)
diff --git a/src/synapticsstr.h b/src/synapticsstr.h
index dcc7cd0..9a5542f 100644
--- a/src/synapticsstr.h
+++ b/src/synapticsstr.h
@@ -331,6 +331,7 @@ struct _SynapticsPrivateRec {
     Bool has_width;             /* device reports finger width */
     Bool has_scrollbuttons;     /* device has physical scrollbuttons */
     Bool has_semi_mt;           /* device is only semi-multitouch capable */
+    Bool has_mt_palm_detect;    /* device reports per finger width and pressure */
 
     enum TouchpadModel model;   /* The detected model */
     unsigned short id_vendor;   /* vendor id */
-- 
2.1.4



More information about the xorg-devel mailing list