Re: [PATCH] input: fix BTN_TOUCH reporting in input_mt_report_pointer_emulation for hovering finger

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <cywang@xxxxxxxxxxxx> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux