From: Derek Foreman <[email protected]>

Use better time estimates so we can provide better fake motion events.
This reduces the difference between motion with one and two fingers down
to be almost imperceptible, despite the reporting rate being halved on
PS/2 devices.

Signed-off-by: Derek Foreman <[email protected]>
Reviewed-by: Daniel Stone <[email protected]>
Reviewed-by: Peter Hutterer <[email protected]>
---
 src/synaptics.c    |   10 +++++-----
 src/synapticsstr.h |    1 +
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/synaptics.c b/src/synaptics.c
index cfd1384..a68a6fd 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1808,7 +1808,7 @@ get_edge_speed(SynapticsPrivate *priv, const struct 
SynapticsHwState *hw,
  * history and return relative co-ordinates.
  */
 static void regress(SynapticsPrivate *priv, const struct SynapticsHwState *hw,
-                    double *dx, double *dy)
+                    double *dx, double *dy, unsigned long start_time)
 {
     const SynapticsParameters *pars = &priv->synpara;
     int i, j;
@@ -1841,8 +1841,8 @@ static void regress(SynapticsPrivate *priv, const struct 
SynapticsHwState *hw,
     xb1 = xb1n/b1d;
     yb1 = yb1n/b1d;
 
-    *dx = -xb1 * (HIST(0).millis - hw->millis);
-    *dy = -yb1 * (HIST(0).millis - hw->millis);
+    *dx = -xb1 * (start_time - hw->millis);
+    *dy = -yb1 * (start_time - hw->millis);
     return;
 
 filtered:
@@ -1864,7 +1864,8 @@ get_delta(SynapticsPrivate *priv, const struct 
SynapticsHwState *hw,
     Bool outlier = FALSE;
 
     /* regress() performs the actual motion prediction. */
-    regress(priv, hw, dx, dy);
+    regress(priv, hw, dx, dy, priv->last_motion_millis);
+    priv->last_motion_millis = hw->millis;
 
     if ((priv->tap_state == TS_DRAG) || para->edge_motion_use_always)
         get_edge_speed(priv, hw, edge, &x_edge_speed, &y_edge_speed);
@@ -2673,7 +2674,6 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState 
*hw, CARD32 now,
     /* generate a history of the absolute positions */
     if (inside_active_area && !from_timer)
        store_history(priv, hw->x, hw->y, hw->millis);
-
     return delay;
 }
 
diff --git a/src/synapticsstr.h b/src/synapticsstr.h
index 1290dc1..cdb6d99 100644
--- a/src/synapticsstr.h
+++ b/src/synapticsstr.h
@@ -199,6 +199,7 @@ typedef struct _SynapticsPrivateRec
     int button_delay_millis;           /* button delay for 3rd button 
emulation */
     Bool prev_up;                      /* Previous up button value, for double 
click emulation */
     enum FingerState finger_state;     /* previous finger state */
+    unsigned long last_motion_millis;  /* time of the last motion */
 
     enum TapState tap_state;           /* State of tap processing */
     int tap_max_fingers;               /* Max number of fingers seen since 
entering start state */
-- 
1.7.5.3

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to