[PATCH xf86-input-synaptics 07/12] Enable clickpad click and drag with two fingers

Chase Douglas chase.douglas at canonical.com
Wed Feb 22 20:22:40 PST 2012


On 02/22/2012 07:58 PM, Peter Hutterer wrote:
> On Thu, Feb 09, 2012 at 06:53:01PM -0800, Chase Douglas wrote:
>> Signed-off-by: Chase Douglas<chase.douglas at canonical.com>
>> ---
>>   src/synaptics.c |   11 +++++++++++
>>   1 files changed, 11 insertions(+), 0 deletions(-)
>>
>> diff --git a/src/synaptics.c b/src/synaptics.c
>> index 662e060..473ce13 100644
>> --- a/src/synaptics.c
>> +++ b/src/synaptics.c
>> @@ -1889,10 +1889,13 @@ HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw,
>>   	    hw->left = 0;
>>   	break;
>>       case TS_CLICKPAD_MOVE:
>> +	if (hw->numFingers>  1)
>> +	    hw->numFingers--;
>>   	SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now);
>>   	if (!hw->left&&  !hw->right&&  !hw->middle) {
>>   	    SetMovingState(priv, MS_FALSE, now);
>>   	    SetTapState(priv, TS_MOVE, now);
>> +	    priv->count_packet_finger = 0;
>>   	}
>>   	break;
>>       }
>> @@ -2777,6 +2780,14 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now,
>>       if (para->touchpad_off == 1)
>>   	return delay;
>>
>> +    /* If a physical button is pressed on a clickpad, use cumulative touch
>> +     * movements for motion */
>> +    if (para->clickpad&&  (hw->left || hw->right || hw->middle))
>> +    {
>> +        hw->x = hw->cumulative_dx;
>> +        hw->y = hw->cumulative_dy;
>> +    }
>> +
>
> help me out here: hw->x is absolute, but hw->cumulative_dx is relative. how
> do we deal with this?

It's not the most elegant due to how synaptics passes state around, but 
essentially the cumulative values are always the same as the x and y 
values while one touch is active. Once two or more touches are active, 
the cumulative values get incremented and decremented by the relative 
motion of each touch.

If you tried to follow one of the touches, the first touch would need to 
be followed or the x and y values would need to be warped and the 
synaptics history reset. Then you have to make sure the right touch is 
picked, which may take multiple events to determine correctly. This 
would add latency to a press-and-drag action.

Instead, using the cumulative motion of all touches means we don't have 
to choose a single touch to follow up front. The only time this gets 
wonky is if you move multiple fingers at the same time while the 
clickpad is pressed. I don't know of any use cases for this, though, so 
I'm not too worried about it.

-- Chase


More information about the xorg-devel mailing list