[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