[PATCH xf86-input-synaptics 11/12] Don't use linear regression when calculating touchpad motion deltas

Peter Hutterer peter.hutterer at who-t.net
Wed Feb 22 22:08:10 PST 2012


On Wed, Feb 22, 2012 at 08:11:58PM -0800, Chase Douglas wrote:
> On 02/22/2012 07:59 PM, Peter Hutterer wrote:
> >On Thu, Feb 09, 2012 at 06:53:05PM -0800, Chase Douglas wrote:
> >>The results depend on the data rate of the device. A device with a
> >>higher data rate, and thus lower individual deltas, will behave
> >>differently with the regression calculation.
> >>
> >>This can be verified on Synaptics semi-mt clickpads. The data rate is
> >>halved when two or more touches are on the device. When trying to press
> >>a button and drag the cursor with another touch, the motion will feel
> >>faster than dragging with only one touch on the device.
> >>
> >>Signed-off-by: Chase Douglas<chase.douglas at canonical.com>
> >>---
> >>  src/synaptics.c |    7 +++----
> >>  1 files changed, 3 insertions(+), 4 deletions(-)
> >>
> >>diff --git a/src/synaptics.c b/src/synaptics.c
> >>index dd138ea..9d8f3ee 100644
> >>--- a/src/synaptics.c
> >>+++ b/src/synaptics.c
> >>@@ -2046,9 +2046,8 @@ get_delta(SynapticsPrivate *priv, const struct SynapticsHwState *hw,
> >>      int x_edge_speed = 0;
> >>      int y_edge_speed = 0;
> >>
> >>-    /* HIST is full enough: priv->count_packet_finger>  3 */
> >>-    *dx = estimate_delta(hw->x, HIST(0).x, HIST(1).x, HIST(2).x);
> >>-    *dy = estimate_delta(hw->y, HIST(0).y, HIST(1).y, HIST(2).y);
> >>+    *dx = hw->x - HIST(0).x;
> >>+    *dy = hw->y - HIST(0).y;
> >>
> >>      if ((priv->tap_state == TS_DRAG) || para->edge_motion_use_always)
> >>          get_edge_speed(priv, hw, edge,&x_edge_speed,&y_edge_speed);
> >>@@ -2118,7 +2117,7 @@ ComputeDeltas(SynapticsPrivate *priv, const struct SynapticsHwState *hw,
> >>       * POLL_MS declaration. */
> >>      delay = MIN(delay, POLL_MS);
> >>
> >>-    if (priv->count_packet_finger<= 3) /* min. 3 packets, see get_delta() */
> >>+    if (priv->count_packet_finger<= 1)
> >>          goto out; /* skip the lot */
> >>
> >>      if (priv->moving_state == MS_TRACKSTICK)
> >>--
> >>1.7.8.3
> >>
> >
> >uhm, that commit seems a bit too simple. how does this affect other devices?
> 
> It doesn't feel any different to me, to be honest. It should affect
> all devices equally, too. Many people have been testing it and no
> one has mentioned a change in motion behavior.
> 
> I think estimate_delta() is mainly used for smoothing out the data
> using interpolation. It's used in other parts of the driver too. I
> think having the smoothing for pointer motion is unnecessary,
> though, since we have acceleration profiles. In other words, there's
> too much smoothing going on already, and dropping this doesn't cause
> a material difference in the feel of motion.

ok. However that brings up the question - why not remove estimate_delta
altogether then?

Cheers,
  Peter


More information about the xorg-devel mailing list