[PATCH xf86-input-synaptics 1/2] Allow using the entire touchpad for motions started inside the active area

Peter Hutterer peter.hutterer at who-t.net
Wed Feb 19 20:18:55 PST 2014


On Wed, Feb 19, 2014 at 06:30:35PM +0100, Hans de Goede wrote:
> synaptics offers an option to make parts of the touchpad insensitive. This
> is ie useful to do palm avoidance rather then palm detection (which may be
> unreliable) by disabling an area of 15% on the right and left side of the
> touchpad.
> 
> Currently a motion which has started inside the active area, stops as soon
> as it moves outside of the active area.
> 
> If a motion started inside the active area and thus has already generated some
> move events, this makes no sense. If the user moves outside of the active
> area in this case, this is very likely because the user wants to continue
> the motion.
> 
> This commit allows such motions to continue normally.
> 
> I would like to thank Juerd Waalboer for the basic idea, some coding and lots
> of testing for this fix.

I think this is the right solution. This option was merged for the very
first clickpads we encountered that didn't provide per-finger tracking
information (or anything very much, come to think of it) and was always a
bit of a clutch. It triggers a slight behaviour change - moving onto a
software button and clicking may result in extra cursor movement - but I
think it's for the better.

I've squashed in a couple of man page changes to change from "takes place
.." to "starts in ...".

Cheers,
   Peter

> 
> Cc: Juerd Waalboer <juerd at tnx.nl>
> Reported-by: Juerd Waalboer <juerd at tnx.nl>
> Tested-by: Juerd Waalboer <juerd at tnx.nl>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  src/synaptics.c | 11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/src/synaptics.c b/src/synaptics.c
> index 24017bd..8064844 100644
> --- a/src/synaptics.c
> +++ b/src/synaptics.c
> @@ -1408,6 +1408,11 @@ is_inside_active_area(SynapticsPrivate * priv, int x, int y)
>  {
>      Bool inside_area = TRUE;
>  
> +    /* If a finger is down, then it must have started inside the active_area,
> +       allow the motion to complete using the entire area */
> +    if (priv->finger_state >= FS_TOUCHED)
> +        return TRUE;
> +
>      if ((priv->synpara.area_left_edge != 0) &&
>          (x < priv->synpara.area_left_edge))
>          inside_area = FALSE;
> @@ -3028,13 +3033,9 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now,
>         invalid are: x, y, z, numFingers, fingerWidth
>         valid are: millis, left/right/middle/up/down/etc.
>       */
> -    if (!inside_active_area) {
> +    if (!inside_active_area)
>          reset_hw_state(hw);
>  
> -        /* FIXME: if finger accidentally moves into the area and doesn't
> -         * really release, the finger should remain down. */
> -    }
> -
>      /* no edge or finger detection outside of area */
>      if (inside_active_area) {
>          edge = edge_detection(priv, hw->x, hw->y);
> -- 
> 1.8.5.3
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the xorg-devel mailing list