|
@@ -938,18 +938,36 @@ static int alps_decode_packet_v7(struct alps_fields *f,
|
|
|
return 0;
|
|
|
if (pkt_id == V7_PACKET_ID_UNKNOWN)
|
|
|
return -1;
|
|
|
+ /*
|
|
|
+ * NEW packets are send to indicate a discontinuity in the finger
|
|
|
+ * coordinate reporting. Specifically a finger may have moved from
|
|
|
+ * slot 0 to 1 or vice versa. INPUT_MT_TRACK takes care of this for
|
|
|
+ * us.
|
|
|
+ *
|
|
|
+ * NEW packets have 3 problems:
|
|
|
+ * 1) They do not contain middle / right button info (on non clickpads)
|
|
|
+ * this can be worked around by preserving the old button state
|
|
|
+ * 2) They do not contain an accurate fingercount, and they are
|
|
|
+ * typically send when the number of fingers changes. We cannot use
|
|
|
+ * the old finger count as that may mismatch with the amount of
|
|
|
+ * touch coordinates we've available in the NEW packet
|
|
|
+ * 3) Their x data for the second touch is inaccurate leading to
|
|
|
+ * a possible jump of the x coordinate by 16 units when the first
|
|
|
+ * non NEW packet comes in
|
|
|
+ * Since problems 2 & 3 cannot be worked around, just ignore them.
|
|
|
+ */
|
|
|
+ if (pkt_id == V7_PACKET_ID_NEW)
|
|
|
+ return 1;
|
|
|
|
|
|
alps_get_finger_coordinate_v7(f->mt, p, pkt_id);
|
|
|
|
|
|
- if (pkt_id == V7_PACKET_ID_TWO || pkt_id == V7_PACKET_ID_MULTI) {
|
|
|
- f->left = (p[0] & 0x80) >> 7;
|
|
|
- f->right = (p[0] & 0x20) >> 5;
|
|
|
- f->middle = (p[0] & 0x10) >> 4;
|
|
|
- }
|
|
|
+ f->left = (p[0] & 0x80) >> 7;
|
|
|
+ f->right = (p[0] & 0x20) >> 5;
|
|
|
+ f->middle = (p[0] & 0x10) >> 4;
|
|
|
|
|
|
if (pkt_id == V7_PACKET_ID_TWO)
|
|
|
f->fingers = alps_get_mt_count(f->mt);
|
|
|
- else if (pkt_id == V7_PACKET_ID_MULTI)
|
|
|
+ else /* pkt_id == V7_PACKET_ID_MULTI */
|
|
|
f->fingers = 3 + (p[5] & 0x03);
|
|
|
|
|
|
return 0;
|