Hi Chung-Yih,

On Wed, Oct 15, 2014 at 07:02:31PM +0800, Chung-Yih Wang (王崇懿) wrote:
> any comment for this patch?
> 
> On Thu, Oct 9, 2014 at 9:31 PM, Chung-yih Wang <[email protected]> wrote:
> >   From the definition of BTN_TOUCH, BTN_TOOL_<name> and BTN_TOUCH codes are
> > orthogonal. BTN_TOUCH should be zero if there is no physical contact, e.g.
> > hovering finger, happened on device. The patch uses touch_count and 
> > finger_count
> > to get the final reporting code for BTN_TOUCH and BTN_TOOL_<name>,
> > respectively. In addition, as there are some hard-coded pressure thresholds
> > defined in touch device's driver classes, 'touch_threshold' is introduced 
> > into
> > struct input_dev in order to tell if a finger is considered as a touch one 
> > in
> > input_mt_report_pointer_emulation().
> >
> > ---
> >  drivers/input/input-mt.c | 15 ++++++++++-----
> >  include/linux/input.h    |  2 ++
> >  2 files changed, 12 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c
> > index fbe29fc..47e41d6 100644
> > --- a/drivers/input/input-mt.c
> > +++ b/drivers/input/input-mt.c
> > @@ -192,18 +192,21 @@ void input_mt_report_pointer_emulation(struct 
> > input_dev *dev, bool use_count)
> >  {
> >         struct input_mt *mt = dev->mt;
> >         struct input_mt_slot *oldest;
> > -       int oldid, count, i;
> > +       int oldid, i;
> > +       int touch_count, finger_count;
> >
> >         if (!mt)
> >                 return;
> >
> >         oldest = NULL;
> >         oldid = mt->trkid;
> > -       count = 0;
> > +       touch_count = 0;
> > +       finger_count = 0;
> >
> >         for (i = 0; i < mt->num_slots; ++i) {
> >                 struct input_mt_slot *ps = &mt->slots[i];
> >                 int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID);
> > +               int pressure = input_mt_get_value(ps, ABS_MT_PRESSURE);
> >
> >                 if (id < 0)
> >                         continue;
> > @@ -211,12 +214,14 @@ void input_mt_report_pointer_emulation(struct 
> > input_dev *dev, bool use_count)
> >                         oldest = ps;
> >                         oldid = id;
> >                 }
> > -               count++;
> > +               finger_count++;
> > +               if (pressure > dev->touch_threshold)
> > +                       touch_count++;
> >         }
> >
> > -       input_event(dev, EV_KEY, BTN_TOUCH, count > 0);
> > +       input_event(dev, EV_KEY, BTN_TOUCH, touch_count > 0);
> >         if (use_count)
> > -               input_mt_report_finger_count(dev, count);
> > +               input_mt_report_finger_count(dev, finger_count);
> >
> >         if (oldest) {
> >                 int x = input_mt_get_value(oldest, ABS_MT_POSITION_X);
> > diff --git a/include/linux/input.h b/include/linux/input.h
> > index 82ce323..5b2739d 100644
> > --- a/include/linux/input.h
> > +++ b/include/linux/input.h
> > @@ -187,6 +187,8 @@ struct input_dev {
> >         struct input_value *vals;
> >
> >         bool devres_managed;
> > +
> > +       unsigned int touch_threshold;

I'd rather not use the pressure threshold, but gate it on distance,
since touch threshold would be user preference. This way we are not
changing existing behavior where registered touches are reported in the
finger count, only true hovering contacts will be excluded.

Henrik, Benjamin?

Thanks.

-- 
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to