Chromium Code Reviews| Index: ui/events/gesture_detection/gesture_detector.cc |
| diff --git a/ui/events/gesture_detection/gesture_detector.cc b/ui/events/gesture_detection/gesture_detector.cc |
| index f0c3cb1c4206f0093933de764b52609c603e6489..a6920d308f8e6a118cec45abc0e4423b9d53b6bc 100644 |
| --- a/ui/events/gesture_detection/gesture_detector.cc |
| +++ b/ui/events/gesture_detection/gesture_detector.cc |
| @@ -306,8 +306,8 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) { |
| if (!IsWithinTouchSlop(ev)) { |
| handled = listener_->OnScroll( |
| *current_down_event_, ev, |
| - (ev.GetPointerCount() > 1 ? *secondary_pointer_down_event_ |
| - : ev), |
| + (maximum_pointer_count_ > 1 ? *secondary_pointer_down_event_ |
| + : ev), |
| scroll_x, scroll_y); |
| last_focus_x_ = focus_x; |
| last_focus_y_ = focus_y; |
| @@ -324,7 +324,8 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) { |
| std::abs(scroll_y) > kScrollEpsilon) { |
| handled = listener_->OnScroll( |
| *current_down_event_, ev, |
| - (ev.GetPointerCount() > 1 ? *secondary_pointer_down_event_ : ev), |
| + (maximum_pointer_count_ > 1 ? *secondary_pointer_down_event_ |
| + : ev), |
| scroll_x, scroll_y); |
| last_focus_x_ = focus_x; |
| last_focus_y_ = focus_y; |
| @@ -538,26 +539,23 @@ bool GestureDetector::HandleSwipeIfNeeded(const MotionEvent& up, |
| } |
| bool GestureDetector::IsWithinTouchSlop(const MotionEvent& ev) { |
| - // If there are more than two down pointers, tapping is not possible. |
| - // Slop region check is not needed. |
| - if (ev.GetPointerCount() > 2) |
| + // If there have been more than two down pointers in the touch sequence, |
| + // tapping is not possible. Slop region check is not needed. |
| + if (maximum_pointer_count_ > 2) |
| return false; |
| - const int id0 = current_down_event_->GetPointerId(0); |
| - const int ev_idx0 = ev.GetPointerId(0) == id0 ? 0 : 1; |
| - |
| - // Check if the primary pointer exceeded the slop region. |
| - float dx = current_down_event_->GetX() - ev.GetX(ev_idx0); |
| - float dy = current_down_event_->GetY() - ev.GetY(ev_idx0); |
| - if (dx * dx + dy * dy > touch_slop_square_) |
| - return false; |
| - |
| - if (ev.GetPointerCount() == 2) { |
| - // Check if the secondary pointer exceeded the slop region. |
| - const int ev_idx1 = ev_idx0 == 0 ? 1 : 0; |
| - const int idx1 = secondary_pointer_down_event_->GetActionIndex(); |
| - dx = secondary_pointer_down_event_->GetX(idx1) - ev.GetX(ev_idx1); |
| - dy = secondary_pointer_down_event_->GetY(idx1) - ev.GetY(ev_idx1); |
| + for (size_t i = 0; i < ev.GetPointerCount(); i++) { |
| + const int pid = ev.GetPointerId(i); |
|
tdresser
2016/07/22 15:57:45
Throughout, let's use pointer_id instead of pid, f
sahel
2016/07/22 19:46:42
Done.
|
| + const MotionEvent* source_pointer_down_event = GetSourcePointerDownEvent( |
| + *current_down_event_, |
| + maximum_pointer_count_ > 1 ? *secondary_pointer_down_event_ |
| + : *current_down_event_, |
| + pid); |
| + DCHECK(source_pointer_down_event); |
|
tdresser
2016/07/22 15:57:45
Return if source_pointer_down_event is nullptr.
sahel
2016/07/22 19:46:42
Done.
|
| + int source_index = getPointerIndex(*source_pointer_down_event, pid); |
| + DCHECK_GE(source_index, 0); |
| + float dx = source_pointer_down_event->GetX(source_index) - ev.GetX(i); |
|
tdresser
2016/07/22 15:57:45
What happens if source_index is 0? Should we retur
sahel
2016/07/22 19:46:42
I changed the code, an early return will happen if
|
| + float dy = source_pointer_down_event->GetY(source_index) - ev.GetY(i); |
| if (dx * dx + dy * dy > touch_slop_square_) |
| return false; |
| } |
| @@ -565,4 +563,27 @@ bool GestureDetector::IsWithinTouchSlop(const MotionEvent& ev) { |
| return true; |
| } |
| +const MotionEvent* GestureDetector::GetSourcePointerDownEvent( |
| + const MotionEvent& current_down_event, |
| + const MotionEvent& secondary_pointer_down_event, |
| + const int pid) { |
| + if (current_down_event.GetPointerId(0) == pid) |
| + return ¤t_down_event; |
| + |
| + for (size_t i = 0; i < secondary_pointer_down_event.GetPointerCount(); i++) { |
| + if (secondary_pointer_down_event.GetPointerId(i) == pid) |
| + return &secondary_pointer_down_event; |
| + } |
| + |
| + return NULL; |
|
tdresser
2016/07/22 15:57:45
Should this ever happen? If not, maybe we should h
sahel
2016/07/22 19:46:42
Done.
|
| +} |
| + |
| +int GestureDetector::getPointerIndex(const MotionEvent& event, const int pid) { |
| + for (size_t i = 0; i < event.GetPointerCount(); i++) { |
| + if (event.GetPointerId(i) == pid) |
| + return i; |
| + } |
| + return -1; |
|
tdresser
2016/07/22 15:57:45
Should this case ever happen? Should we have a DCH
sahel
2016/07/22 19:46:42
Done.
|
| +} |
| + |
| } // namespace ui |