On 05/22/2014 05:35 AM, Peter Hutterer wrote:
> On Tue, May 20, 2014 at 04:34:57PM +0200, Hans de Goede wrote:
>> We don't want touches in the button area to cause the pointer to move. So
>> instead of making a touch the pointer when it moves to TOUCH_BEGIN, wait
>> with making it the pointer until its buttons state moves to 
>> BUTTON_STATE_AREA.
>>
>> Note that a touch in the main area of the touchpad will move to
>> BUTTON_STATE_AREA immediately.
> 
> I stared at that code for a while before I realised why this wouldn't
> regress older touchpads - please add here that "If software-buttons are not
> enabled, any finger is in the BUTTON_STATE_AREA".

Updated the commit msg with this.

> two more style-only fixes below.
> 
>> While at it also refactor the is_pointer setting in general, removing
>> code duplicition wrt checking that another touch is not already
>> the pointer on unpinning a finger, and add safeguards that unpinning
>> does not make a finger which is not in button state BUTTON_STATE_AREA the
>> pointer, nor that the button code makes a pinned finger the pointer.
>>
>> All these sanity checks are combined into a new tp_button_active function,
>> since they should be taken into account for 2 finger scrolling, etc. too.
>>
>> Signed-off-by: Hans de Goede <hdego...@redhat.com>
>> Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
>> ---
>>  src/evdev-mt-touchpad-buttons.c |  7 ++++++
>>  src/evdev-mt-touchpad.c         | 49 
>> +++++++++++++++++++++--------------------
>>  src/evdev-mt-touchpad.h         |  6 +++++
>>  test/touchpad.c                 |  8 +++----
>>  4 files changed, 42 insertions(+), 28 deletions(-)
>>
>> diff --git a/src/evdev-mt-touchpad-buttons.c 
>> b/src/evdev-mt-touchpad-buttons.c
>> index 61055ac..e47a55e 100644
>> --- a/src/evdev-mt-touchpad-buttons.c
>> +++ b/src/evdev-mt-touchpad-buttons.c
>> @@ -142,6 +142,7 @@ tp_button_set_state(struct tp_dispatch *tp, struct 
>> tp_touch *t,
>>              break;
>>      case BUTTON_STATE_AREA:
>>              t->button.curr = BUTTON_EVENT_IN_AREA;
>> +            tp_set_pointer(tp, t);
>>              break;
>>      case BUTTON_STATE_BOTTOM:
>>              break;
>> @@ -598,3 +599,9 @@ tp_post_button_events(struct tp_dispatch *tp, uint32_t 
>> time)
>>  
>>      return rc;
>>  }
>> +
>> +int
>> +tp_button_touch_active(struct tp_dispatch *tp, struct tp_touch *t)
>> +{
>> +    return t->button.state == BUTTON_STATE_AREA;
>> +}
>> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
>> index 7f73f6e..924ba16 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 = NULL;
>> -
>>      if (t->state != TOUCH_UPDATE) {
>>              tp_motion_history_reset(t);
>>              t->dirty = true;
>> @@ -162,15 +160,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;
>> -            }
>>      }
>>  }
>>  
>> @@ -342,7 +331,6 @@ static void
>>  tp_unpin_finger(struct tp_dispatch *tp, struct tp_touch *t)
>>  {
>>      unsigned int xdist, ydist;
>> -    struct tp_touch *tmp = NULL;
>>  
>>      if (!t->pinned.is_pinned)
>>              return;
>> @@ -350,19 +338,11 @@ 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 <
>> -                    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 (xdist * xdist + ydist * ydist >=
>> +                    tp->buttons.motion_dist * tp->buttons.motion_dist) {
> 
> don't indent the line here please.

No idea what exactly you want me to do here, note the indentation is unchanged
from the original check a few lines higher up. Not fixed.

> 
>> +            t->pinned.is_pinned = false;
>> +            tp_set_pointer(tp, t);
>>      }
>> -
>> -    if (t->state != TOUCH_END && !tmp->is_pointer)
>> -            t->is_pointer = true;
>>  }
>>  
>>  static void
>> @@ -378,6 +358,27 @@ 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);
>> +}
>> +
>> +void tp_set_pointer(struct tp_dispatch *tp, struct tp_touch *t)
> 
> please add a line-break after void

Done.

Regards,

Hans

> 
> Cheers,
>    Peter
> 
>> +{
>> +    struct tp_touch *tmp = NULL;
>> +
>> +    /* Only set the touch as pointer if we don't have one yet */
>> +    tp_for_each_touch(tp, tmp) {
>> +            if (tmp->is_pointer)
>> +                    return;
>> +    }
>> +
>> +    if (tp_touch_active(tp, t))
>> +            t->is_pointer = true;
>> +}
>> +
>>  static void
>>  tp_process_state(struct tp_dispatch *tp, uint32_t time)
>>  {
>> diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
>> index 8d8dd84..5509e93 100644
>> --- a/src/evdev-mt-touchpad.h
>> +++ b/src/evdev-mt-touchpad.h
>> @@ -200,6 +200,9 @@ struct tp_dispatch {
>>  void
>>  tp_get_delta(struct tp_touch *t, double *dx, double *dy);
>>  
>> +void
>> +tp_set_pointer(struct tp_dispatch *tp, struct tp_touch *t);
>> +
>>  int
>>  tp_tap_handle_state(struct tp_dispatch *tp, uint32_t time);
>>  
>> @@ -229,4 +232,7 @@ tp_post_button_events(struct tp_dispatch *tp, uint32_t 
>> time);
>>  int
>>  tp_button_handle_state(struct tp_dispatch *tp, uint32_t time);
>>  
>> +int
>> +tp_button_touch_active(struct tp_dispatch *tp, struct tp_touch *t);
>> +
>>  #endif
>> diff --git a/test/touchpad.c b/test/touchpad.c
>> index bbae6cd..959978e 100644
>> --- a/test/touchpad.c
>> +++ b/test/touchpad.c
>> @@ -70,10 +70,10 @@ START_TEST(touchpad_2fg_no_motion)
>>  
>>      litest_drain_events(li);
>>  
>> -    litest_touch_down(dev, 0, 50, 50);
>> -    litest_touch_down(dev, 1, 70, 70);
>> -    litest_touch_move_to(dev, 0, 50, 50, 80, 50, 5);
>> -    litest_touch_move_to(dev, 1, 70, 70, 80, 50, 5);
>> +    litest_touch_down(dev, 0, 20, 20);
>> +    litest_touch_down(dev, 1, 70, 20);
>> +    litest_touch_move_to(dev, 0, 20, 20, 80, 80, 5);
>> +    litest_touch_move_to(dev, 1, 70, 20, 80, 50, 5);
>>      litest_touch_up(dev, 0);
>>      litest_touch_up(dev, 1);
>>  
>> -- 
>> 1.9.0
>>
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to