On 03/02/15(Tue) 22:36, Ulf Brosziewski wrote: > On 01/30/2015 11:04 AM, Ulf Brosziewski wrote: > >On 01/30/2015 07:15 AM, Martin Pieuchot wrote: > >>On 30/01/15(Fri) 01:25, Ulf Brosziewski wrote: > >>>Probably I was too sceptical about synaptics.c. The bug I observed > >>>with the ALPS touchpad seems to be due to a kind of mismatch between > >>>the ALPS code in pms and the event handling in wsconscomm. The patch > >>>below contains the initial change as well as what was necessary to > >>>fix this. > >> > >>Do you think it is possible to fix the pms(4) driver instead of adding > >>another quirk? > >> > >>>... > > > >Certainly that would be a better solution. For synaptics hardware there > >seems to be no specific W value that signals the end of a touch. If I > >understand it correctly, the hardware reports zero coordinates instead > >and the X driver adjusts its state accordingly. I will try to check soon > >whether this is correct and whether the ALPS code could be adapted. > > > > > > I couldn't test it directly, but according to the "Synaptics PS/2 TouchPad > Interfacing Guide" synaptics hardware does indeed signal a W value of 0 if > there is no pressure as well as for two-finger contacts. This means that > the ALPS part of pms is correct and shouldn't be changed. For a proper > finger count Z must be checked, and the place to do this is probably in > wsconscomm. I have changed the patch accordingly. > > The change in the new version applies to all touchpad/clickpad models and > would require appropriate testing. In my own tests with the ALPS Glidepoint > touchpad and the Elantech Clickpad - and the patched pms version - I didn't > observe any problems.
I'm running with this diff on a "pms0: Synaptics clickpad, firmware 8.0". I'm seeing no problem with it, and it seems to improve the two-finger scrolling situation where previously the cursor would go crazy. Since it has been tested on various Synaptics, ALPS and Elantech I think it is safe to put it in. Anybody wants to ok this diff? Btw Ulf, it seems your mail client mangles tab/space. I couldn't apply your diff correctly :/ > diff --git a/wsconscomm.c b/wsconscomm.c > index df3512d..70c103a 100644 > --- a/wsconscomm.c > +++ b/wsconscomm.c > @@ -132,12 +132,6 @@ WSConsReadHwState(InputInfoPtr pInfo, > struct wscons_event event; > Bool v; > > - /* Reset cumulative values if buttons were not previously pressed */ > - if (!hw->left && !hw->right && !hw->middle) { > - hw->cumulative_dx = hw->x; > - hw->cumulative_dy = hw->y; > - } > - > while (WSConsReadEvent(pInfo, &event)) { > switch (event.type) { > case WSCONS_EVENT_MOUSE_UP: > @@ -187,9 +181,11 @@ WSConsReadHwState(InputInfoPtr pInfo, > break; > case WSCONS_EVENT_MOUSE_ABSOLUTE_X: > hw->x = event.value; > + hw->cumulative_dx = hw->x; > break; > case WSCONS_EVENT_MOUSE_ABSOLUTE_Y: > hw->y = priv->maxy - event.value + priv->miny; > + hw->cumulative_dy = hw->y; > break; > case WSCONS_EVENT_MOUSE_ABSOLUTE_Z: > hw->z = event.value; > @@ -218,6 +214,10 @@ WSConsReadHwState(InputInfoPtr pInfo, > } > break; > case WSCONS_EVENT_SYNC: > + if (hw->z == 0) { > + hw->fingerWidth = 0; > + hw->numFingers = 0; > + } > hw->millis = 1000 * event.time.tv_sec + event.time.tv_nsec / > 1000000; > SynapticsCopyHwState(hwRet, hw); > return TRUE; >