On Tue, Apr 15, 2014 at 02:28:08PM +0200, Hans de Goede wrote: > Move scanning for a suitable touch to be the pointer to tp_process_state > and take tp_button_touch_active into account. > > Note this adds a tp_touch_active helper since we want to do the same checks in > other places too (ie to see if a finger should count for 2 finger scrolling). > > Signed-off-by: Hans de Goede <[email protected]> > Acked-by: Peter Hutterer <[email protected]> > --- > src/evdev-mt-touchpad.c | 47 +++++++++++++++++++++++------------------------ > 1 file changed, 23 insertions(+), 24 deletions(-) > > diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c > index 9df4a78..b671211 100644 > --- a/src/evdev-mt-touchpad.c > +++ b/src/evdev-mt-touchpad.c > @@ -152,8 +152,6 @@ tp_get_touch(struct tp_dispatch *tp, unsigned int slot) > static inline void > tp_begin_touch(struct tp_dispatch *tp, struct tp_touch *t) > { > - struct tp_touch *tmp; > - > if (t->state != TOUCH_UPDATE) { > tp_motion_history_reset(t); > t->dirty = true; > @@ -161,15 +159,6 @@ tp_begin_touch(struct tp_dispatch *tp, struct tp_touch > *t) > tp->nfingers_down++; > assert(tp->nfingers_down >= 1); > tp->queued |= TOUCHPAD_EVENT_MOTION; > - > - tp_for_each_touch(tp, tmp) { > - if (tmp->is_pointer) > - break; > - } > - > - if (!tmp->is_pointer) { > - t->is_pointer = true; > - } > } > } > > @@ -341,7 +330,6 @@ static void > tp_unpin_finger(struct tp_dispatch *tp, struct tp_touch *t) > { > unsigned int xdist, ydist; > - struct tp_touch *tmp; > > if (!t->pinned.is_pinned) > return; > @@ -349,19 +337,9 @@ tp_unpin_finger(struct tp_dispatch *tp, struct tp_touch > *t) > xdist = abs(t->x - t->pinned.center_x); > ydist = abs(t->y - t->pinned.center_y); > > - if (xdist * xdist + ydist * ydist < > + if (xdist * xdist + ydist * ydist >= > tp->buttons.motion_dist * tp->buttons.motion_dist) > - return; > - > - t->pinned.is_pinned = false; > - > - tp_for_each_touch(tp, tmp) { > - if (tmp->is_pointer) > - break; > - } > - > - if (t->state != TOUCH_END && !tmp->is_pointer) > - t->is_pointer = true; > + t->pinned.is_pinned = false; > } > > static void > @@ -377,6 +355,13 @@ tp_pin_fingers(struct tp_dispatch *tp) > } > } > > +static int > +tp_touch_active(struct tp_dispatch *tp, struct tp_touch *t) > +{ > + return (t->state == TOUCH_BEGIN || t->state == TOUCH_UPDATE) && > + !t->pinned.is_pinned && tp_button_touch_active(tp, t); > +} > + > static void > tp_process_state(struct tp_dispatch *tp, uint32_t time) > { > @@ -409,6 +394,20 @@ tp_process_state(struct tp_dispatch *tp, uint32_t time) > if ((tp->queued & TOUCHPAD_EVENT_BUTTON_PRESS) && > !tp->buttons.has_buttons) > tp_pin_fingers(tp); > + > + /* If we don't have a touch as pointer find a suitable one */ > + tp_for_each_touch(tp, t) { > + if (t->is_pointer) > + break; > + } > + if (!t->is_pointer) { > + tp_for_each_touch(tp, t) { > + if (tp_touch_active(tp, t)) { > + t->is_pointer = true; > + break; > + } > + } > + } > } >
this changes the way the touchpad behaves for scrolling (it breaks the touchpad_2fg_no_motion test). Before, a touch is marked as pointer touch on begin. Now a touch can be marked pointer touch as soon as it is the last touch and that causes a spurious motion event in the above test: as soon as the first finger is lifted, the second finger generates a motion event. This is a bit of a side-effect pinning all fingers, I think we need something more sophisticated to tell which touchpoint is the controlling one. Cheers, Peter _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
