[PATCH synaptics 2/2] Reset scroll delta when finger is lifted

Peter Hutterer peter.hutterer at who-t.net
Wed Apr 25 23:22:32 PDT 2012


On Wed, Apr 25, 2012 at 10:37:26PM -0700, Chase Douglas wrote:
> On 04/25/2012 08:00 PM, Peter Hutterer wrote:
> > Provides for a more consistent scrolling experience, otherwise delta
> > leftovers may trigger extra events even when the actual scrolling action
> > stays the same.
> > 
> > Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> > ---
> >  src/synaptics.c |    2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/src/synaptics.c b/src/synaptics.c
> > index 0546ab9..429f5d0 100644
> > --- a/src/synaptics.c
> > +++ b/src/synaptics.c
> > @@ -2414,6 +2414,8 @@ HandleScrolling(SynapticsPrivate *priv, struct SynapticsHwState *hw,
> >  		DBG(7, "circular scroll detected on edge\n");
> >  	    }
> >  	}
> > +        priv->scroll.delta_y = 0;
> > +        priv->scroll.delta_x = 0;
> >      }
> >      if (!priv->circ_scroll_on) {
> >  	if (finger) {
> 
> This path is followed when a finger begins contact, not when a finger is
> lifted. I'm guessing it is correct, though, because we want to reset the
> scroll deltas when we start a new motion?

yeah, sorry. wrong word in the commit msg. FS_UNTOUCHED, the condition this
is hit at is "no finger is touching". This path is run more often than
necessary, so it gets reset too often here. But integrating it into the
state machine requires more changes than I'm comfortable with at this point
and we need some "reset scrolling state" function anyways. Until that
exists, this one will do.

I moved this up a bit (in my local tree) for better readability. Same two
lines are now  below the call to stop_coasting(). No functional changes
though.

diff --git a/src/synaptics.c b/src/synaptics.c
index 104a2c7..51ecda5 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -2398,6 +2398,8 @@ HandleScrolling(SynapticsPrivate *priv, struct SynapticsHwState *hw,
     /* scroll detection */
     if (finger && priv->finger_state == FS_UNTOUCHED) {
        stop_coasting(priv);
+        priv->scroll.delta_y = 0;
+        priv->scroll.delta_x = 0;
        if (para->circular_scrolling) {
            if ((para->circular_trigger == 0 && edge) ||
                (para->circular_trigger == 1 && edge & TOP_EDGE) ||
@@ -2414,8 +2416,6 @@ HandleScrolling(SynapticsPrivate *priv, struct SynapticsHwState *hw,
                DBG(7, "circular scroll detected on edge\n");
            }
        }
-        priv->scroll.delta_y = 0;
-        priv->scroll.delta_x = 0;
     }
     if (!priv->circ_scroll_on) {
        if (finger) {


Cheers,
  Peter


More information about the xorg-devel mailing list