[PATCH xf86-input-synaptics 1/2] Count number of multitouch touches for multitouch finger count
Chase Douglas
chase.douglas at canonical.com
Fri Mar 23 10:51:58 PDT 2012
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 <chase.douglas at canonical.com>
---
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
More information about the xorg-devel
mailing list