[PATCH xf86-input-synaptics 1/2] Count number of multitouch touches for multitouch finger count

Peter Hutterer peter.hutterer at who-t.net
Sun Mar 25 21:38:13 PDT 2012


On Fri, Mar 23, 2012 at 10:51:58AM -0700, Chase Douglas wrote:
> The evdev protocol only goes up to three touches for non-multitouch
> devices. If you perform a four touch tap, the finger count will only go
> up to three touches if you roll your fingers, or will always be 0 if all
> four touches land at the same time.
> 
> This change ensures the correct finger count is reported.
> 
> Signed-off-by: Chase Douglas <chase.douglas at canonical.com>
> ---
> I test build with HAVE_MULTITOUCH undefined to be sure it didn't break
> anything.

merged, thanks.

Cheers,
  Peter
> 
>  src/eventcomm.c |   16 ++++++++++++++--
>  1 files changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/src/eventcomm.c b/src/eventcomm.c
> index 3721c91..b485377 100644
> --- a/src/eventcomm.c
> +++ b/src/eventcomm.c
> @@ -72,6 +72,7 @@ struct eventcomm_proto_data
>      int axis_map[MT_ABS_SIZE];
>      int cur_slot;
>      ValuatorMask **last_mt_vals;
> +    int num_touches;
>  #endif
>  };
>  
> @@ -565,6 +566,7 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw,
>              if (ev->value >= 0)
>              {
>                  hw->slot_state[slot_index] = SLOTSTATE_OPEN;
> +                proto_data->num_touches++;
>  
>                  if (slot_index >= 0)
>                      valuator_mask_copy(hw->mt_mask[slot_index],
> @@ -574,7 +576,10 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw,
>                                  "Attempted to copy values from out-of-range "
>                                  "slot, touch events may be incorrect.\n");
>              } else
> +            {
>                  hw->slot_state[slot_index] = SLOTSTATE_CLOSE;
> +                proto_data->num_touches--;
> +            }
>          } else
>          {
>              int map = proto_data->axis_map[ev->code - ABS_MT_TOUCH_MAJOR];
> @@ -607,10 +612,17 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw,
>   * @param comm Assembled information from previous events.
>   * @return The number of fingers currently set.
>   */
> -static int count_fingers(const struct CommData *comm)
> +static int count_fingers(InputInfoPtr pInfo, const struct CommData *comm)
>  {
> +    SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private;
> +    struct eventcomm_proto_data *proto_data = priv->proto_data;
>      int fingers = 0;
>  
> +#ifdef HAVE_MULTITOUCH
> +    if (priv->has_touch)
> +        return proto_data->num_touches;
> +#endif
> +
>      if (comm->oneFinger)
>  	fingers = 1;
>      else if (comm->twoFingers)
> @@ -653,7 +665,7 @@ EventReadHwState(InputInfoPtr pInfo,
>  	case EV_SYN:
>  	    switch (ev.code) {
>  	    case SYN_REPORT:
> -		hw->numFingers = count_fingers(comm);
> +		hw->numFingers = count_fingers(pInfo, comm);
>  		hw->millis = 1000 * ev.time.tv_sec + ev.time.tv_usec / 1000;
>  		SynapticsCopyHwState(hwRet, hw);
>  		return TRUE;
> -- 
> 1.7.9.1
> 


More information about the xorg-devel mailing list