[PATCH xf86-input-synaptics] Ignore pre-existing touches

Peter Hutterer peter.hutterer at who-t.net
Mon May 14 19:10:04 PDT 2012


On Mon, May 14, 2012 at 10:20:01AM -0700, Chase Douglas wrote:
> If a touch is physically active when the device is enabled, then all
> events for that touch must be ignored. In particular, we cannot close
> the touch or we will decrement touch count counters below zero. If these
> counters go below zero memory corruption can occur.
> 
> Note that a device is disabled and enabled every time the user types on
> the keyboard if synclient is used to disable the trackpad while typing.
> This is a very common option.
> 
> Signed-off-by: Chase Douglas <chase.douglas at canonical.com>

merged, but I don't think it's enough. the current behaviour when the device
is disabled is pretty bad: if the device is enabled with a finger on the
pad, it won't react to that finger, but if it was _disabled_ one finger on
the pad and re-enabled with one finger it will jump to some position.

plus, if I disable the device with two fingers on the pad and re-enable it
with no fingers on the pad, I get the errors below whenever I release the
second finger (no errors for the first finger).

[187400.101] [dix] SynPS/2 Synaptics TouchPad: unable to find touch point 0
[187400.101] [dix] SynPS/2 Synaptics TouchPad: unable to find touch point 1

a simliar error comes in other cases but this one was the only one I've been
able to narrow down.

Cheers,
  Peter

> ---
>  src/eventcomm.c |    5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/src/eventcomm.c b/src/eventcomm.c
> index d9430e1..8b6afb9 100644
> --- a/src/eventcomm.c
> +++ b/src/eventcomm.c
> @@ -545,8 +545,7 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw,
>          if (slot_index < 0)
>              return;
>  
> -        if (hw->slot_state[slot_index] == SLOTSTATE_EMPTY ||
> -            hw->slot_state[slot_index] == SLOTSTATE_OPEN_EMPTY)
> +        if (hw->slot_state[slot_index] == SLOTSTATE_OPEN_EMPTY)
>              hw->slot_state[slot_index] = SLOTSTATE_UPDATE;
>          if (ev->code == ABS_MT_TRACKING_ID) {
>              if (ev->value >= 0) {
> @@ -561,7 +560,7 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw,
>                                  "Attempted to copy values from out-of-range "
>                                  "slot, touch events may be incorrect.\n");
>              }
> -            else {
> +            else if (hw->slot_state[slot_index] != SLOTSTATE_EMPTY) {
>                  hw->slot_state[slot_index] = SLOTSTATE_CLOSE;
>                  proto_data->num_touches--;
>              }
> -- 
> 1.7.9.5
> 


More information about the xorg-devel mailing list