Report 3-rd and 4-th fingers as first finger for Elan hw v.2 and v.3 as
Linux does. It should not affect gesture processing in current state as it ignores finger coords on 3-finger tap detection but it should make evdev reports looking more Linux-alike. Reviewed by: gonzo Approved by: gonzo MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D10266
This commit is contained in:
parent
4d52eab637
commit
13d94d2651
@ -3772,27 +3772,30 @@ proc_elantech(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
|
||||
nfingers = (pb->ipacket[0] & 0xc0) >> 6;
|
||||
if (nfingers == 3 && (pb->ipacket[3] & 0x80))
|
||||
nfingers = 4;
|
||||
mask = (1 << nfingers) - 1;
|
||||
|
||||
fn = ELANTECH_FINGER_SET_XYP(pb);
|
||||
if (nfingers == 0) {
|
||||
mask = (1 << nfingers) - 1; /* = 0x00 */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Map 3-rd and 4-th fingers to first finger */
|
||||
mask = (1 << 1) - 1; /* = 0x01 */
|
||||
f[0] = ELANTECH_FINGER_SET_XYP(pb);
|
||||
if (sc->elanhw.haspressure) {
|
||||
fn.w = ((pb->ipacket[0] & 0x30) >> 2) |
|
||||
f[0].w = ((pb->ipacket[0] & 0x30) >> 2) |
|
||||
((pb->ipacket[3] & 0x30) >> 4);
|
||||
} else {
|
||||
fn.p = PSM_FINGER_DEFAULT_P;
|
||||
fn.w = PSM_FINGER_DEFAULT_W;
|
||||
f[0].p = PSM_FINGER_DEFAULT_P;
|
||||
f[0].w = PSM_FINGER_DEFAULT_W;
|
||||
}
|
||||
|
||||
/*
|
||||
* HW v2 dont report exact finger positions when 3 or more
|
||||
* fingers are on touchpad. Use reported value as fingers
|
||||
* position as it is required for tap detection
|
||||
* fingers are on touchpad.
|
||||
*/
|
||||
if (nfingers > 2)
|
||||
fn.flags = PSM_FINGER_FUZZY;
|
||||
f[0].flags = PSM_FINGER_FUZZY;
|
||||
|
||||
for (id = 0; id < imin(nfingers, ELANTECH_MAX_FINGERS); id++)
|
||||
f[id] = fn;
|
||||
break;
|
||||
|
||||
case ELANTECH_PKT_V2_2FINGER: /*HW V2. Two finger touch */
|
||||
@ -3838,8 +3841,12 @@ proc_elantech(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
|
||||
* -------------------------------------------
|
||||
*/
|
||||
nfingers = (pb->ipacket[0] & 0xc0) >> 6;
|
||||
mask = (1 << nfingers) - 1;
|
||||
id = nfingers - 1;
|
||||
/* Map 3-rd finger to first finger */
|
||||
id = nfingers > 2 ? 0 : nfingers - 1;
|
||||
mask = (1 << (id + 1)) - 1;
|
||||
|
||||
if (nfingers == 0)
|
||||
break;
|
||||
|
||||
fn = ELANTECH_FINGER_SET_XYP(pb);
|
||||
fn.w = ((pb->ipacket[0] & 0x30) >> 2) |
|
||||
@ -3847,15 +3854,11 @@ proc_elantech(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
|
||||
|
||||
/*
|
||||
* HW v3 dont report exact finger positions when 3 or more
|
||||
* fingers are on touchpad. Use reported value as fingers
|
||||
* position as it is required for tap detection
|
||||
* fingers are on touchpad.
|
||||
*/
|
||||
if (nfingers > 1)
|
||||
fn.flags = PSM_FINGER_FUZZY;
|
||||
|
||||
for (id = 0; id < imin(nfingers, ELANTECH_MAX_FINGERS); id++)
|
||||
f[id] = fn;
|
||||
|
||||
if (nfingers == 2) {
|
||||
if (ELANTECH_PKT_IS_V3_HEAD(pb, sc->elanhw.hascrc)) {
|
||||
sc->elanaction.fingers[0] = fn;
|
||||
@ -3863,6 +3866,7 @@ proc_elantech(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
|
||||
} else
|
||||
f[0] = sc->elanaction.fingers[0];
|
||||
}
|
||||
f[id] = fn;
|
||||
break;
|
||||
|
||||
case ELANTECH_PKT_V4_STATUS: /* HW Version 4. Status packet */
|
||||
|
Loading…
x
Reference in New Issue
Block a user