Prevent flings without a matching scroll
A fling gesture should only be generated after a scroll ends. We use
the did_generate_scroll_ flag to track if there has been a scroll since
the last fling. However, this flag is never set to false when a fling
is generated, so it is possible to send fling events without a matching
scroll event.
This CL sets the did_generate_scroll_ flag to false after a fling is
generated.
BUG=chromium:811855
TEST=created a test in touchtests with multiple flings without matching
scrolls. This CL prevents the extra flings.
Change-Id: I9b8b791b71b906e9579849e93d327359df876ddc
Reviewed-on: https://chromium-review.googlesource.com/916629
Commit-Ready: Sean O'Brien <seobrien@chromium.org>
Tested-by: Sean O'Brien <seobrien@chromium.org>
Reviewed-by: Andrew de los Reyes <adlr@chromium.org>
diff --git a/include/immediate_interpreter.h b/include/immediate_interpreter.h
index 00bd840..4eb7e1d 100644
--- a/include/immediate_interpreter.h
+++ b/include/immediate_interpreter.h
@@ -175,8 +175,8 @@
const HardwareStateBuffer& state_buffer,
const FingerState& current) const;
- // Compute a scroll result. Return false when something goes wrong.
- bool ComputeScroll(const HardwareStateBuffer& state_buffer,
+ // Compute a scroll and fill result. Return false when something goes wrong.
+ bool FillResultScroll(const HardwareStateBuffer& state_buffer,
const FingerMap& prev_gs_fingers,
const FingerMap& gs_fingers,
GestureType prev_gesture_type,
@@ -184,10 +184,10 @@
Gesture* result,
ScrollEventBuffer* scroll_buffer);
- // Compute a ScrollEvent that can be turned directly into a fling.
- void ComputeFling(const HardwareStateBuffer& state_buffer,
+ // Compute a fling and fill result.
+ void FillResultFling(const HardwareStateBuffer& state_buffer,
const ScrollEventBuffer& scroll_buffer,
- Gesture* result) const;
+ Gesture* result);
// Update ScrollEventBuffer when the current gesture type is not scroll.
void UpdateScrollEventBuffer(GestureType gesture_type,
diff --git a/src/immediate_interpreter.cc b/src/immediate_interpreter.cc
index cc2b5d3..31343d6 100644
--- a/src/immediate_interpreter.cc
+++ b/src/immediate_interpreter.cc
@@ -439,7 +439,7 @@
return dp > dp_thresh;
}
-bool ScrollManager::ComputeScroll(
+bool ScrollManager::FillResultScroll(
const HardwareStateBuffer& state_buffer,
const FingerMap& prev_gs_fingers,
const FingerMap& gs_fingers,
@@ -658,9 +658,9 @@
return true;
}
-void ScrollManager::ComputeFling(const HardwareStateBuffer& state_buffer,
+void ScrollManager::FillResultFling(const HardwareStateBuffer& state_buffer,
const ScrollEventBuffer& scroll_buffer,
- Gesture* result) const {
+ Gesture* result) {
if (!did_generate_scroll_)
return;
ScrollEvent out = { 0.0, 0.0, 0.0 };
@@ -704,6 +704,7 @@
vx,
vy,
GESTURES_FLING_START);
+ did_generate_scroll_ = false;
}
FingerButtonClick::FingerButtonClick(const ImmediateInterpreter* interpreter)
@@ -3196,7 +3197,7 @@
break;
}
case kGestureTypeScroll: {
- if (!scroll_manager_.ComputeScroll(state_buffer_,
+ if (!scroll_manager_.FillResultScroll(state_buffer_,
prev_active_gs_fingers_,
fingers,
prev_gesture_type_,
@@ -3207,7 +3208,7 @@
break;
}
case kGestureTypeFling: {
- scroll_manager_.ComputeFling(state_buffer_, scroll_buffer_, &result_);
+ scroll_manager_.FillResultFling(state_buffer_, scroll_buffer_, &result_);
break;
}
case kGestureTypeSwipe:
diff --git a/src/multitouch_mouse_interpreter.cc b/src/multitouch_mouse_interpreter.cc
index 6ae1480..4cd5af7 100644
--- a/src/multitouch_mouse_interpreter.cc
+++ b/src/multitouch_mouse_interpreter.cc
@@ -173,7 +173,7 @@
if (should_fling_ && AnyGesturingFingerLeft(*state_buffer_.Get(0),
prev_gs_fingers_)) {
current_gesture_type_ = kGestureTypeFling;
- scroll_manager_.ComputeFling(state_buffer_, scroll_buffer_, &result);
+ scroll_manager_.FillResultFling(state_buffer_, scroll_buffer_, &result);
if (result.type == kGestureTypeFling)
result.details.fling.vx = 0.0;
if (result.details.fling.vy == 0.0)
@@ -194,7 +194,7 @@
// * Finger movements after button goes up
bool update_scroll_buffer =
- scroll_manager_.ComputeScroll(state_buffer_,
+ scroll_manager_.FillResultScroll(state_buffer_,
prev_gs_fingers_,
gs_fingers_,
prev_gesture_type_,