[PATCH synaptics v2 09/21] Add last_scroll_millis to track scroll event timing

Daniel Stone daniel at fooishbar.org
Tue Jun 14 10:05:57 PDT 2011


From: Derek Foreman <derek.foreman at collabora.co.uk>

Stopping a little short of having a full scroll history, adding
last_scroll_millis lets us track when the last scroll event we sent was,
for more accurate timing of coasting in particular.

Signed-off-by: Derek Foreman <derek.foreman at collabora.co.uk>
Reviewed-by: Daniel Stone <daniel at fooishbar.org>
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/synaptics.c    |   14 +++++++++-----
 src/synapticsstr.h |    1 +
 2 files changed, 10 insertions(+), 5 deletions(-)

v2: Include HandleScrolling hunks which inexplicably crept into another patch
    in the series.

diff --git a/src/synaptics.c b/src/synaptics.c
index 95faa42..c14dbf8 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1754,7 +1754,7 @@ get_delta_for_trackstick(SynapticsPrivate *priv, const struct SynapticsHwState *
                          double *dx, double *dy)
 {
     SynapticsParameters *para = &priv->synpara;
-    double dtime = (hw->millis - HIST(0).millis) / 1000.0;
+    double dtime = (hw->millis - priv->last_scroll_millis) / 1000.0;
 
     *dx = (hw->x - priv->trackstick_neutral_x);
     *dy = (hw->y - priv->trackstick_neutral_y);
@@ -1809,7 +1809,7 @@ get_delta(SynapticsPrivate *priv, const struct SynapticsHwState *hw,
           edge_type edge, double *dx, double *dy)
 {
     SynapticsParameters *para = &priv->synpara;
-    double dtime = (hw->millis - HIST(0).millis) / 1000.0;
+    double dtime = (hw->millis - priv->last_scroll_millis) / 1000.0;
     double integral;
     double tmpf;
     int x_edge_speed = 0;
@@ -2215,7 +2215,7 @@ HandleScrolling(SynapticsPrivate *priv, struct SynapticsHwState *hw,
     }
 
     if (priv->autoscroll_yspd) {
-	double dtime = (hw->millis - HIST(0).millis) / 1000.0;
+	double dtime = (hw->millis - priv->last_scroll_millis) / 1000.0;
 	double ddy = para->coasting_friction * dtime;
 	priv->autoscroll_y += priv->autoscroll_yspd * dtime;
 	delay = MIN(delay, POLL_MS);
@@ -2236,7 +2236,7 @@ HandleScrolling(SynapticsPrivate *priv, struct SynapticsHwState *hw,
     }
 
     if (priv->autoscroll_xspd) {
-	double dtime = (hw->millis - HIST(0).millis) / 1000.0;
+	double dtime = (hw->millis - priv->last_scroll_millis) / 1000.0;
 	double ddx = para->coasting_friction * dtime;
 	priv->autoscroll_x += priv->autoscroll_xspd * dtime;
 	delay = MIN(delay, POLL_MS);
@@ -2600,8 +2600,12 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw)
     /* Process scroll events only if coordinates are
      * in the Synaptics Area
      */
-    if (inside_active_area)
+    if (inside_active_area &&
+        (scroll.down != 0 || scroll.up != 0 || scroll.left != 0 ||
+         scroll.right != 0)) {
 	post_scroll_events(pInfo, scroll);
+	priv->last_scroll_millis = hw->millis;
+    }
 
     if (double_click) {
 	post_button_click(pInfo, 1);
diff --git a/src/synapticsstr.h b/src/synapticsstr.h
index 6a54455..b65069f 100644
--- a/src/synapticsstr.h
+++ b/src/synapticsstr.h
@@ -220,6 +220,7 @@ typedef struct _SynapticsPrivateRec
     double autoscroll_x;		/* Accumulated horizontal coasting scroll */
     double autoscroll_y;		/* Accumulated vertical coasting scroll */
     int scroll_packet_count;		/* Scroll duration */
+    unsigned long last_scroll_millis;   /* time last scroll event posted */
     double frac_x, frac_y;		/* absolute -> relative fraction */
     enum MidButtonEmulation mid_emu_state;	/* emulated 3rd button */
     int repeatButtons;			/* buttons for repeat */
-- 
1.7.5.3



More information about the xorg-devel mailing list