The evdev protocol only goes up to three touches for non-multitouch devices. If you perform a four touch tap, the finger count will only go up to three touches if you roll your fingers, or will always be 0 if all four touches land at the same time.
This change ensures the correct finger count is reported. Signed-off-by: Chase Douglas <[email protected]> --- I test build with HAVE_MULTITOUCH undefined to be sure it didn't break anything. src/eventcomm.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/eventcomm.c b/src/eventcomm.c index 3721c91..b485377 100644 --- a/src/eventcomm.c +++ b/src/eventcomm.c @@ -72,6 +72,7 @@ struct eventcomm_proto_data int axis_map[MT_ABS_SIZE]; int cur_slot; ValuatorMask **last_mt_vals; + int num_touches; #endif }; @@ -565,6 +566,7 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw, if (ev->value >= 0) { hw->slot_state[slot_index] = SLOTSTATE_OPEN; + proto_data->num_touches++; if (slot_index >= 0) valuator_mask_copy(hw->mt_mask[slot_index], @@ -574,7 +576,10 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw, "Attempted to copy values from out-of-range " "slot, touch events may be incorrect.\n"); } else + { hw->slot_state[slot_index] = SLOTSTATE_CLOSE; + proto_data->num_touches--; + } } else { int map = proto_data->axis_map[ev->code - ABS_MT_TOUCH_MAJOR]; @@ -607,10 +612,17 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw, * @param comm Assembled information from previous events. * @return The number of fingers currently set. */ -static int count_fingers(const struct CommData *comm) +static int count_fingers(InputInfoPtr pInfo, const struct CommData *comm) { + SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + struct eventcomm_proto_data *proto_data = priv->proto_data; int fingers = 0; +#ifdef HAVE_MULTITOUCH + if (priv->has_touch) + return proto_data->num_touches; +#endif + if (comm->oneFinger) fingers = 1; else if (comm->twoFingers) @@ -653,7 +665,7 @@ EventReadHwState(InputInfoPtr pInfo, case EV_SYN: switch (ev.code) { case SYN_REPORT: - hw->numFingers = count_fingers(comm); + hw->numFingers = count_fingers(pInfo, comm); hw->millis = 1000 * ev.time.tv_sec + ev.time.tv_usec / 1000; SynapticsCopyHwState(hwRet, hw); return TRUE; -- 1.7.9.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
