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) { |