summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriele Mazzotta <gabriele.mzt@gmail.com>2014-09-16 17:20:15 +0200
committerPeter Hutterer <peter.hutterer@who-t.net>2014-09-17 15:29:51 +1000
commita897147be04d74ed452cda166fd4e01f9615ff72 (patch)
tree266e1a1a73759070dd7860fb63b9d0b42ecbf99f
parent41b2312c006fca1f24e1a366174d3203a63fa04a (diff)
Use ABS_MT events for the palm detection when supported
Use ABS_MT_TOUCH_MAJOR and ABS_MT_PRESSURE instead of ABS_TOOL_WIDTH and ABS_PRESSURE when supported so that the pressure and the width of all the fingers is taken into account for the palm detection. This also fixes the palm detection for those touchpads for which the kernel only sends ABS_MT_TOUCH_MAJOR and not ABS_TOOL_WIDTH. Signed-off-by: Gabriele Mazzotta <gabriele.mzt@gmail.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--src/eventcomm.c12
-rw-r--r--src/synaptics.c3
2 files changed, 15 insertions, 0 deletions
diff --git a/src/eventcomm.c b/src/eventcomm.c
index e789f0e..4850331 100644
--- a/src/eventcomm.c
+++ b/src/eventcomm.c
@@ -606,6 +606,14 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw,
hw->slot_state[slot_index] = SLOTSTATE_CLOSE;
proto_data->num_touches--;
}
+
+ /* When there are no fingers on the touchpad, set width and
+ * pressure to zero as ABS_MT_TOUCH_MAJOR and ABS_MT_PRESSURE
+ * are not zero when fingers are released. */
+ if (proto_data->num_touches == 0) {
+ hw->fingerWidth = 0;
+ hw->z = 0;
+ }
}
else {
ValuatorMask *mask = proto_data->last_mt_vals[slot_index];
@@ -618,6 +626,10 @@ 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)
+ hw->fingerWidth = ev->value;
+ else if (ev->code == ABS_MT_PRESSURE)
+ hw->z = ev->value;
}
valuator_mask_set(mask, map, ev->value);
diff --git a/src/synaptics.c b/src/synaptics.c
index 756751d..9807439 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1829,6 +1829,9 @@ 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)
+ return finger;
+
if (hw->x == 0 || priv->finger_state == FS_UNTOUCHED)
priv->avg_width = 0;
else