summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriele Mazzotta <gabriele.mzt@gmail.com>2015-01-07 14:12:33 +0100
committerPeter Hutterer <peter.hutterer@who-t.net>2015-01-08 09:14:39 +1000
commita05894d169be42f03d21fb8287da902d8c24c566 (patch)
tree349ec32b807b2beb8954abd5a73c3313783be1d4
parenta897147be04d74ed452cda166fd4e01f9615ff72 (diff)
Don't assume that touch devices report per finger width and pressure
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@gmail.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--src/eventcomm.c10
-rw-r--r--src/synaptics.c2
-rw-r--r--src/synapticsstr.h1
3 files changed, 10 insertions, 3 deletions
diff --git a/src/eventcomm.c b/src/eventcomm.c
index 4850331..53a0ca4 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;
}
@@ -880,6 +882,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 9807439..e6a90f2 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1829,7 +1829,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 75f52d5..a17e39b 100644
--- a/src/synapticsstr.h
+++ b/src/synapticsstr.h
@@ -310,6 +310,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 */