fwiw, I've been running this on my lenovo x120e for a the week.
--patrick

On 4/21/16, Ulf Brosziewski <ulf.brosziew...@t-online.de> wrote:
> Ping?
>
> It isn't a severe bug and it doesn't concern a spectacular feature,
> but shouldn't we fix it?
>
>
> On 04/16/2016 06:01 PM, Ulf Brosziewski wrote:
>> The changes I have introduced in wsconscomm.c recently can make the
>> transition from two-finger scrolling to coasting somewhat difficult.
>> Provided that you have scrolled quickly enough, coasting will start
>> if you finish the scroll gesture by lifting both fingers simultaneously,
>> but a short delay will prevent coasting. When the contact count drops
>> from 2 to 1 a RESET event will occur, and the handler clears the scroll
>> flag.
>>
>> The diff below is a fix for this problem. The new version won't interrupt
>> or stop scrolling, rather it ensures that the current coordinate deltas
>> won't affect its speed or direction. I have tested it with my Elantech-v4
>> touchpad.
>>
>> OK?
>>
>>
>> Index: src/wsconscomm.c
>> ===================================================================
>> RCS file: /cvs/xenocara/driver/xf86-input-synaptics/src/wsconscomm.c,v
>> retrieving revision 1.14
>> diff -u -p -r1.14 wsconscomm.c
>> --- src/wsconscomm.c 30 Mar 2016 23:33:34 -0000      1.14
>> +++ src/wsconscomm.c 16 Apr 2016 15:15:46 -0000
>> @@ -150,6 +150,21 @@ WSConsQueryHardware(InputInfoPtr pInfo)
>>      return WSConsIsTouchpad(pInfo, NULL);
>>  }
>>
>> +static void
>> +WSConsAdjustScrollCoords(SynapticsPrivate *priv, struct SynapticsHwState
>> *hw)
>> +{
>> +    int dx, dy, i;
>> +
>> +    dx = hw->x - priv->scroll.last_x;
>> +    dy = hw->y - priv->scroll.last_y;
>> +    priv->scroll.last_x = hw->x;
>> +    priv->scroll.last_y = hw->y;
>> +    for (i = 0; i < SYNAPTICS_MOVE_HISTORY; i++) {
>> +        priv->move_hist[i].x += dx;
>> +        priv->move_hist[i].y += dy;
>> +    }
>> +}
>> +
>>  static Bool
>>  WSConsReadHwState(InputInfoPtr pInfo,
>>      struct CommData *comm, struct SynapticsHwState *hwRet)
>> @@ -158,7 +173,7 @@ WSConsReadHwState(InputInfoPtr pInfo,
>>      struct wsconscomm_proto_data *proto_data = priv->proto_data;
>>      struct SynapticsHwState *hw = comm->hwState;
>>      struct wscons_event *event;
>> -    Bool v;
>> +    Bool v, reset = FALSE;
>>
>>      while ((event = WSConsGetEvent(pInfo)) != NULL) {
>>          switch (event->type) {
>> @@ -229,15 +244,18 @@ WSConsReadHwState(InputInfoPtr pInfo,
>>              hw->fingerWidth = event->value;
>>              break;
>>          case WSCONS_EVENT_TOUCH_RESET:
>> -            /*
>> -             * The contact count or the active MT-slot has changed.
>> -             * Suppress pointer motion and two-finger scrolling.
>> -             */
>> -            priv->count_packet_finger = 0;
>> -            priv->vert_scroll_twofinger_on = FALSE;
>> -            priv->horiz_scroll_twofinger_on = FALSE;
>> +            /* The contact count or the active MT slot has changed. */
>> +            reset = TRUE;
>>              break;
>>          case WSCONS_EVENT_SYNC:
>> +            if (reset) {
>> +                /* Ensure that pointer motion stops. */
>> +                priv->count_packet_finger = 0;
>> +                if (priv->vert_scroll_twofinger_on
>> +                    || priv->horiz_scroll_twofinger_on) {
>> +                    WSConsAdjustScrollCoords(priv, hw);
>> +                }
>> +            }
>>              hw->millis = 1000 * event->time.tv_sec +
>>                  event->time.tv_nsec / 1000000;
>>              SynapticsCopyHwState(hwRet, hw);
>>
>>
>
>

Reply via email to