[PATCH] synaptics: detect corner tap using the initial touch position

Peter Hutterer peter.hutterer at who-t.net
Sun Jan 30 18:58:20 PST 2011


On Sun, Jan 23, 2011 at 04:14:48PM +0100, Nicolas Cavalari wrote:
> From: Nicolas Cavallari <batchman at free.fr>
> 
> Currently, when detecting a tap release, the corner tap detection
> uses the current touch position to figure out which corner it
> corresponds. The problem is that, theoretically, there is no such position
> because there is no touch. It work in mosts cases because most touchpad
> are fast enough to still have a position on release, but some aren't.
> 
> In that case, the driver do corner tap detection using the position
> given by the hardware when there is no touch, that is, (0,0), (1,5855)
> or whatever. The driver will detect them as corner tap, regardless of
> the initial touch position. On the default configuration, corner taps
> are ignored, so basically, these tap are not working.
> 
> This patch make tap detection use the initial touch position to
> detect corner taps.
> 
> Signed-off-by: Nicolas Cavallari <batchman at free.fr>

merged, thanks.

Cheers,
  Peter
> ---
>  src/synaptics.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/src/synaptics.c b/src/synaptics.c
> index 88bd024..783bd64 100644
> --- a/src/synaptics.c
> +++ b/src/synaptics.c
> @@ -1538,11 +1538,12 @@ GetTimeOut(SynapticsPrivate *priv)
>  
>  static int
>  HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw,
> -		    edge_type edge, enum FingerState finger, Bool inside_active_area)
> +		    enum FingerState finger, Bool inside_active_area)
>  {
>      SynapticsParameters *para = &priv->synpara;
>      Bool touch, release, is_timeout, move;
>      int timeleft, timeout;
> +    edge_type edge;
>      int delay = 1000000000;
>  
>      if (priv->palm)
> @@ -1589,6 +1590,7 @@ HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw,
>  	    SetTapState(priv, TS_MOVE, hw->millis);
>  	    goto restart;
>  	} else if (release) {
> +	    edge = edge_detection(priv, priv->touch_on.x, priv->touch_on.y);
>  	    SelectTapButton(priv, edge);
>  	    /* Disable taps outside of the active area */
>  	    if (!inside_active_area) {
> @@ -2399,7 +2401,7 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw)
>  
>      /* tap and drag detection. Needs to be performed even if the finger is in
>       * the dead area to reset the state. */
> -    timeleft = HandleTapProcessing(priv, hw, edge, finger, inside_active_area);
> +    timeleft = HandleTapProcessing(priv, hw, finger, inside_active_area);
>      if (timeleft > 0)
>  	delay = MIN(delay, timeleft);
>  
> -- 
> 1.7.2.3


More information about the xorg-devel mailing list