[PATCH synaptics] If the touchpad is in TOUCHPAD_OFF mode, allow physical clicks

Hans de Goede hdegoede at redhat.com
Mon Mar 17 01:07:40 PDT 2014


Hi,

On 03/17/2014 05:55 AM, Peter Hutterer wrote:
> Enabling clicks in off mode also allows for the new Lenovo *40 series to use
> the top software buttons while the touchpad is disabled. This benefits those
> that usually disable touchpads altogether but still need the buttons for the
> trackstick.
> 
> This changes existing behaviour, but TouchpadOff was always intended to stop
> erroneous events while typing. Physical button presses are hard to trigger
> accidentally. On the touchpads that TouchpadOff concept was originally
> designed for the buttons are nowhere near the keyboard and are physically
> separated from the touchpad anyway. On Clickpads, triggering a physical
> click requires more force than accidentally touching the surface.
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=76156
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

Looks good.

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans

> ---
>  man/synaptics.man |  7 ++++++-
>  src/synaptics.c   | 17 +++++++----------
>  2 files changed, 13 insertions(+), 11 deletions(-)
> 
> diff --git a/man/synaptics.man b/man/synaptics.man
> index 97f0114..c1626c3 100644
> --- a/man/synaptics.man
> +++ b/man/synaptics.man
> @@ -261,9 +261,14 @@ Valid values are:
>  .TS
>  l l.
>  0	Touchpad is enabled
> -1	Touchpad is switched off
> +1	Touchpad is switched off (physical clicks still work)
>  2	Only tapping and scrolling is switched off
>  .TE
> +When the touchpad is switched off, button events caused by a physical
> +button press are still interpreted. On a ClickPad, this includes
> +software-emulated middle and right buttons as defined by 
> +the SoftButtonAreas setting.
> +.TP
>  Property: "Synaptics Off"
>  .TP
>  .BI "Option \*qLockedDrags\*q \*q" boolean \*q
> diff --git a/src/synaptics.c b/src/synaptics.c
> index aeb1c57..07fd450 100644
> --- a/src/synaptics.c
> +++ b/src/synaptics.c
> @@ -1934,7 +1934,8 @@ HandleTapProcessing(SynapticsPrivate * priv, struct SynapticsHwState *hw,
>      enum EdgeType edge;
>      int delay = 1000000000;
>  
> -    if (priv->finger_state == FS_BLOCKED)
> +    if (para->touchpad_off == TOUCHPAD_OFF ||
> +        priv->finger_state == FS_BLOCKED)
>          return delay;
>  
>      touch = finger >= FS_TOUCHED && priv->finger_state == FS_UNTOUCHED;
> @@ -2349,7 +2350,9 @@ HandleScrolling(SynapticsPrivate * priv, struct SynapticsHwState *hw,
>      SynapticsParameters *para = &priv->synpara;
>      int delay = 1000000000;
>  
> -    if ((priv->synpara.touchpad_off == TOUCHPAD_TAP_OFF) || (priv->finger_state == FS_BLOCKED)) {
> +    if (priv->synpara.touchpad_off == TOUCHPAD_TAP_OFF ||
> +        priv->synpara.touchpad_off == TOUCHPAD_OFF ||
> +        priv->finger_state == FS_BLOCKED) {
>          stop_coasting(priv);
>          priv->circ_scroll_on = FALSE;
>          priv->vert_scroll_edge_on = FALSE;
> @@ -3080,12 +3083,6 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now,
>      Bool using_cumulative_coords = FALSE;
>      Bool ignore_motion;
>  
> -    /* If touchpad is switched off, we skip the whole thing and return delay */
> -    if (para->touchpad_off == TOUCHPAD_OFF) {
> -        UpdateTouchState(pInfo, hw);
> -        return delay;
> -    }
> -
>      /* We need both and x/y, the driver can't handle just one of the two
>       * yet. But since it's possible to hit a phys button on non-clickpads
>       * without ever getting motion data first, we must continue with 0/0 for
> @@ -3124,8 +3121,8 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now,
>               current_button_area(para, hw->x, hw->y) == NO_BUTTON_AREA)
>          priv->last_button_area = NO_BUTTON_AREA;
>  
> -    ignore_motion =
> -        !using_cumulative_coords && priv->last_button_area != NO_BUTTON_AREA;
> +    ignore_motion = para->touchpad_off == TOUCHPAD_OFF ||
> +        (!using_cumulative_coords && priv->last_button_area != NO_BUTTON_AREA);
>  
>      /* these two just update hw->left, right, etc. */
>      update_hw_button_state(pInfo, hw, now, &delay);
> 


More information about the xorg-devel mailing list