Hi, On 11/11/2014 05:55 PM, Dmitry Torokhov wrote: > Hi Hans, > > On Mon, Oct 27, 2014 at 10:40:20AM +0100, Hans de Goede wrote: >> Hi Matthias, >> >> On 10/25/2014 02:01 PM, Mathias Gottschlag wrote: >>> +static void focaltech_report_state(struct psmouse *psmouse) >>> +{ >>> + int i; >>> + struct focaltech_data *priv = psmouse->private; >>> + struct focaltech_hw_state *state = &priv->state; >>> + struct input_dev *dev = psmouse->dev; >>> + int finger_count = 0; >>> + >>> + for (i = 0; i < FOC_MAX_FINGERS; i++) { >>> + struct focaltech_finger_state *finger = &state->fingers[i]; >>> + int active = finger->active && finger->valid; >>> + input_mt_slot(dev, i); >>> + input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); >>> + if (active) { >>> + finger_count++; >>> + input_report_abs(dev, ABS_MT_POSITION_X, finger->x); >>> + input_report_abs(dev, ABS_MT_POSITION_Y, >>> + focaltech_invert_y(finger->y)); >>> + } >>> + } >>> + input_mt_report_pointer_emulation(dev, false); >>> + input_mt_report_finger_count(dev, finger_count); >> >> These 2 lines should be replace with: >> input_mt_report_pointer_emulation(dev, finger_count); >> >> So that BTN_TOUCH properly gets set when at least one finger is down (this is >> mandatory when not reporting pressure). > > I am baffled by this suggestion. input_mt_report_pointer_emulation() > always report BTN_TOUCH, regardless of the value of the 2nd argument. My bad, I misread the code (I think I mixed up the use_count and count vars). > Also, the name of the 2nd argument is "use_count" and it is boolean, so > I am not sure why you are suggesting that we basically do: > > if (finger_count) > input_mt_report_pointer_emulation(dev, true /*count them again */); > else > input_mt_report_pointer_emulation(dve, false); > > Did you mean to tell Mathias to call > input_mt_report_pointer_emulation(dev, *true*); to instruct MT core to > count contacts and emit appropriate BTN_TOOL_* based on number of > contacts (if any)? Right, rereading things, their is no need for the focaltech code to do its own finger counting, and these 2 calls: input_mt_report_pointer_emulation(dev, false); input_mt_report_finger_count(dev, finger_count); Should be replaced with: input_mt_report_pointer_emulation(dev, true); Sorry for the confusion. Regards, Hans -- 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