Index: ui/base/gestures/gesture_point.cc |
diff --git a/ui/base/gestures/gesture_point.cc b/ui/base/gestures/gesture_point.cc |
index 31d9e918e2c41c9ac688ce040240e4d57cec05f7..a95b2974cb78799d7a4897d4b5243bb49ccf49d6 100644 |
--- a/ui/base/gestures/gesture_point.cc |
+++ b/ui/base/gestures/gesture_point.cc |
@@ -17,6 +17,7 @@ namespace ui { |
GesturePoint::GesturePoint() |
: first_touch_time_(0.0), |
+ second_last_touch_time_(0.0), |
last_touch_time_(0.0), |
last_tap_time_(0.0), |
velocity_calculator_( |
@@ -28,7 +29,7 @@ GesturePoint::GesturePoint() |
GesturePoint::~GesturePoint() {} |
void GesturePoint::Reset() { |
- first_touch_time_ = last_touch_time_ = 0.0; |
+ first_touch_time_ = second_last_touch_time_ = last_touch_time_ = 0.0; |
velocity_calculator_.ClearHistory(); |
point_id_ = -1; |
clear_enclosing_rectangle(); |
@@ -38,6 +39,10 @@ void GesturePoint::ResetVelocity() { |
velocity_calculator_.ClearHistory(); |
} |
+gfx::Vector2d GesturePoint::ScrollDelta() { |
+ return last_touch_position_ - second_last_touch_position_; |
+} |
+ |
void GesturePoint::UpdateValues(const TouchEvent& event) { |
const int64 event_timestamp_microseconds = |
event.time_stamp().InMicroseconds(); |
@@ -53,6 +58,9 @@ void GesturePoint::UpdateValues(const TouchEvent& event) { |
if (event.type() == ui::ET_TOUCH_PRESSED) { |
first_touch_time_ = last_touch_time_; |
first_touch_position_ = event.location(); |
+ second_last_touch_position_ = last_touch_position_; |
+ second_last_touch_time_ = last_touch_time_; |
+ |
velocity_calculator_.ClearHistory(); |
velocity_calculator_.PointSeen(event.location().x(), |
event.location().y(), |
@@ -70,11 +78,8 @@ void GesturePoint::UpdateForTap() { |
} |
void GesturePoint::UpdateForScroll() { |
- // Update the first-touch position and time so that the scroll-delta and |
- // scroll-velocity can be computed correctly for the next scroll gesture |
- // event. |
- first_touch_position_ = last_touch_position_; |
- first_touch_time_ = last_touch_time_; |
+ second_last_touch_position_ = last_touch_position_; |
+ second_last_touch_time_ = last_touch_time_; |
} |
bool GesturePoint::IsInClickWindow(const TouchEvent& event) const { |
@@ -97,28 +102,26 @@ bool GesturePoint::IsInFlickWindow(const TouchEvent& event) { |
} |
bool GesturePoint::DidScroll(const TouchEvent& event, int dist) const { |
- return abs(last_touch_position_.x() - first_touch_position_.x()) > dist || |
- abs(last_touch_position_.y() - first_touch_position_.y()) > dist; |
+ gfx::Vector2d d = last_touch_position_ - second_last_touch_position_; |
+ return abs(d.x()) > dist || abs(d.y()) > dist; |
} |
bool GesturePoint::HasEnoughDataToEstablishRail() const { |
- int dx = x_delta(); |
- int dy = y_delta(); |
- |
- int delta_squared = dx * dx + dy * dy; |
+ gfx::Vector2d d = last_touch_position_ - first_touch_position_; |
+ int64 delta_squared = d.LengthSquared(); |
return delta_squared > GestureConfiguration::min_scroll_delta_squared(); |
} |
bool GesturePoint::IsInHorizontalRailWindow() const { |
- int dx = x_delta(); |
- int dy = y_delta(); |
- return abs(dx) > GestureConfiguration::rail_start_proportion() * abs(dy); |
+ gfx::Vector2d d = last_touch_position_ - second_last_touch_position_; |
+ return abs(d.x()) > |
+ GestureConfiguration::rail_start_proportion() * abs(d.y()); |
} |
bool GesturePoint::IsInVerticalRailWindow() const { |
- int dx = x_delta(); |
- int dy = y_delta(); |
- return abs(dy) > GestureConfiguration::rail_start_proportion() * abs(dx); |
+ gfx::Vector2d d = last_touch_position_ - second_last_touch_position_; |
+ return abs(d.y()) > |
+ GestureConfiguration::rail_start_proportion() * abs(d.x()); |
} |
bool GesturePoint::BreaksHorizontalRail() { |