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 <[email protected]> --- 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 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
