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