[PATCH synaptics] Don't assume that touch devices report per finger width and pressure
Peter Hutterer
peter.hutterer at who-t.net
Wed Jan 7 15:17:14 PST 2015
On Wed, Jan 07, 2015 at 02:12:33PM +0100, Gabriele Mazzotta wrote:
> 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>
merged and pushed, thanks.
Cheers,
Peter
> ---
> 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