Chromium Code Reviews| Index: ui/events/gestures/gesture_sequence.cc |
| diff --git a/ui/events/gestures/gesture_sequence.cc b/ui/events/gestures/gesture_sequence.cc |
| index 7b37f4561b0f901de0fe684c5d6ec5add5abae2a..cedc46f19e606df01f6b78c34775fa0ba86e2688 100644 |
| --- a/ui/events/gestures/gesture_sequence.cc |
| +++ b/ui/events/gestures/gesture_sequence.cc |
| @@ -129,6 +129,12 @@ enum EdgeStateSignatureType { |
| GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED = |
| G(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL, 1, TS_PRESSED, TSI_NOT_PROCESSED), |
| + GST_SYNTHETIC_CLICK_ABORTED_FIRST_RELEASED = |
| + G(GS_SYNTHETIC_CLICK_ABORTED, 0, TS_RELEASED, TSI_ALWAYS), |
| + |
| + GST_SYNTHETIC_CLICK_ABORTED_SECOND_PRESSED = |
| + G(GS_SYNTHETIC_CLICK_ABORTED, 1, TS_PRESSED, TSI_NOT_PROCESSED), |
| + |
| GST_SCROLL_FIRST_RELEASED = |
| G(GS_SCROLL, 0, TS_RELEASED, TSI_ALWAYS), |
| @@ -342,6 +348,8 @@ EdgeStateSignatureType Signature(GestureState gesture_state, |
| case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_STATIONARY: |
| case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED: |
| case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED: |
| + case GST_SYNTHETIC_CLICK_ABORTED_FIRST_RELEASED: |
| + case GST_SYNTHETIC_CLICK_ABORTED_SECOND_PRESSED: |
| case GST_SCROLL_FIRST_RELEASED: |
| case GST_SCROLL_FIRST_MOVED: |
| case GST_SCROLL_FIRST_CANCELLED: |
| @@ -557,6 +565,7 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture( |
| set_state(GS_PENDING_SYNTHETIC_CLICK); |
| break; |
| case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED: |
| + case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED: |
| if (Click(event, point, gestures.get())) |
| point.UpdateForTap(); |
| else |
| @@ -572,24 +581,24 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture( |
| point.UpdateForScroll(); |
| } |
| break; |
| + case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED: |
| case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_MOVED: |
| case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_STATIONARY: |
| - // No scrolling allowed, so nothing happens. |
| - break; |
| - case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED: |
| if (point.IsInScrollWindow(event)) { |
| PrependTapCancelGestureEvent(point, gestures.get()); |
| + set_state(GS_SYNTHETIC_CLICK_ABORTED); |
| + } else { |
| set_state(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL); |
| } |
| break; |
| case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED: |
| case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED: |
| + case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED_HANDLED: |
| + case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED: |
| PrependTapCancelGestureEvent(point, gestures.get()); |
| set_state(GS_NO_GESTURE); |
| break; |
| - case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED: |
| - case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED_HANDLED: |
| - case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED: |
| + case GST_SYNTHETIC_CLICK_ABORTED_FIRST_RELEASED: |
| set_state(GS_NO_GESTURE); |
| break; |
| case GST_SCROLL_FIRST_MOVED: |
| @@ -605,10 +614,11 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture( |
| set_state(GS_NO_GESTURE); |
| break; |
| case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED: |
| + case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED: |
| PrependTapCancelGestureEvent(point, gestures.get()); |
| TwoFingerTapOrPinch(event, point, gestures.get()); |
| break; |
| - case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED: |
| + case GST_SYNTHETIC_CLICK_ABORTED_SECOND_PRESSED: |
| TwoFingerTapOrPinch(event, point, gestures.get()); |
| break; |
| case GST_SCROLL_SECOND_PRESSED: |
| @@ -751,7 +761,12 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture( |
| << " State: " << state_ |
| << " touch id: " << event.touch_id(); |
| - if (last_state == GS_PENDING_SYNTHETIC_CLICK && state_ != last_state) { |
| + // If the state has changed from one in which a long/show press is possible to |
| + // one in which they are not possible, cancel the timers. |
| + if (last_state != state_ && |
| + state_ != GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL && |
|
sadrul
2014/01/17 17:11:35
Can this be somewhat like this:
if (last_state
tdresser
2014/01/17 19:48:42
We don't even need the "last_state != state" check
|
| + (last_state == GS_PENDING_SYNTHETIC_CLICK || |
| + last_state == GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL)) { |
| GetLongPressTimer()->Stop(); |
| GetShowPressTimer()->Stop(); |
| } |
| @@ -1102,7 +1117,8 @@ void GestureSequence::AppendTwoFingerTapGestureEvent(Gestures* gestures) { |
| bool GestureSequence::Click(const TouchEvent& event, |
| const GesturePoint& point, |
| Gestures* gestures) { |
| - DCHECK(state_ == GS_PENDING_SYNTHETIC_CLICK); |
| + DCHECK(state_ == GS_PENDING_SYNTHETIC_CLICK || |
| + state_ == GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL); |
| if (point.IsInClickWindow(event)) { |
| int tap_count = 1; |
| if (point.IsInTripleClickWindow(event)) |
| @@ -1187,6 +1203,7 @@ bool GestureSequence::TwoFingerTouchDown(const TouchEvent& event, |
| Gestures* gestures) { |
| DCHECK(state_ == GS_PENDING_SYNTHETIC_CLICK || |
| state_ == GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL || |
| + state_ == GS_SYNTHETIC_CLICK_ABORTED || |
| state_ == GS_SCROLL); |
| if (state_ == GS_SCROLL) { |