summaryrefslogtreecommitdiff
path: root/src
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 /src
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>
Diffstat (limited to 'src')
-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 */