[PATCH xf86-input-synaptics 11/12] Don't use linear regression when calculating touchpad motion deltas
Chase Douglas
chase.douglas at canonical.com
Wed Feb 22 20:11:58 PST 2012
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.
-- Chase
More information about the xorg-devel
mailing list