| Index: ui/events/gesture_detection/gesture_provider.cc
|
| diff --git a/ui/events/gesture_detection/gesture_provider.cc b/ui/events/gesture_detection/gesture_provider.cc
|
| index a7a43ee50782511551e508d35b42bb82af939750..5b750a5aed5a7acac26ff218e34f9e42fff60c1e 100644
|
| --- a/ui/events/gesture_detection/gesture_provider.cc
|
| +++ b/ui/events/gesture_detection/gesture_provider.cc
|
| @@ -12,6 +12,7 @@
|
| #include "ui/events/gesture_detection/gesture_event_data.h"
|
| #include "ui/events/gesture_detection/gesture_listeners.h"
|
| #include "ui/events/gesture_detection/motion_event.h"
|
| +#include "ui/events/gesture_detection/motion_event_generic.h"
|
| #include "ui/events/gesture_detection/scale_gesture_listeners.h"
|
| #include "ui/gfx/geometry/point_f.h"
|
|
|
| @@ -64,6 +65,7 @@ gfx::RectF ClampBoundingBox(const gfx::RectF& bounds,
|
| GestureProvider::Config::Config()
|
| : display(gfx::Display::kInvalidDisplayID, gfx::Rect(1, 1)),
|
| disable_click_delay(false),
|
| + double_tap_support_for_platform_enabled(true),
|
| gesture_begin_end_types_enabled(false),
|
| min_gesture_bounds_length(0),
|
| max_gesture_bounds_length(0) {
|
| @@ -84,7 +86,8 @@ class GestureProvider::GestureListenerImpl : public ScaleGestureListener,
|
| client_(client),
|
| gesture_detector_(config.gesture_detector_config, this, this),
|
| scale_gesture_detector_(config.scale_gesture_detector_config, this),
|
| - snap_scroll_controller_(config.display),
|
| + snap_scroll_controller_(config.gesture_detector_config.touch_slop,
|
| + config.display.size()),
|
| ignore_multitouch_zoom_events_(false),
|
| ignore_single_tap_(false),
|
| pinch_event_sent_(false),
|
| @@ -94,7 +97,7 @@ class GestureProvider::GestureListenerImpl : public ScaleGestureListener,
|
|
|
| void OnTouchEvent(const MotionEvent& event) {
|
| const bool in_scale_gesture = IsScaleGestureDetectionInProgress();
|
| - snap_scroll_controller_.SetSnapScrollingMode(event, in_scale_gesture);
|
| + snap_scroll_controller_.SetSnapScrollMode(event, in_scale_gesture);
|
| if (in_scale_gesture)
|
| SetIgnoreSingleTap(true);
|
|
|
| @@ -214,7 +217,7 @@ class GestureProvider::GestureListenerImpl : public ScaleGestureListener,
|
| return false;
|
| if (!pinch_event_sent_) {
|
| Send(CreateGesture(ET_GESTURE_PINCH_BEGIN,
|
| - e.GetId(),
|
| + e.GetPointerId(),
|
| e.GetToolType(),
|
| detector.GetEventTime(),
|
| detector.GetFocusX(),
|
| @@ -250,7 +253,7 @@ class GestureProvider::GestureListenerImpl : public ScaleGestureListener,
|
| GestureEventDetails pinch_details(ET_GESTURE_PINCH_UPDATE);
|
| pinch_details.set_scale(scale);
|
| Send(CreateGesture(pinch_details,
|
| - e.GetId(),
|
| + e.GetPointerId(),
|
| e.GetToolType(),
|
| detector.GetEventTime(),
|
| detector.GetFocusX(),
|
| @@ -278,9 +281,10 @@ class GestureProvider::GestureListenerImpl : public ScaleGestureListener,
|
| float raw_distance_y) override {
|
| float distance_x = raw_distance_x;
|
| float distance_y = raw_distance_y;
|
| - if (!scroll_event_sent_) {
|
| - // Remove the touch slop region from the first scroll event to avoid a
|
| - // jump.
|
| + if (!scroll_event_sent_ && e2.GetPointerCount() == 1) {
|
| + // Remove the touch slop region from the first scroll event to
|
| + // avoid a jump. Touch slop isn't used for multi-finger
|
| + // gestures, so in those cases we don't subtract the slop.
|
| float distance =
|
| std::sqrt(distance_x * distance_x + distance_y * distance_y);
|
| float epsilon = 1e-3f;
|
| @@ -292,26 +296,6 @@ class GestureProvider::GestureListenerImpl : public ScaleGestureListener,
|
| distance_x *= ratio;
|
| distance_y *= ratio;
|
| }
|
| -
|
| - // Note that scroll start hints are in distance traveled, where
|
| - // scroll deltas are in the opposite direction.
|
| - GestureEventDetails scroll_details(
|
| - ET_GESTURE_SCROLL_BEGIN, -raw_distance_x, -raw_distance_y);
|
| -
|
| - // Use the co-ordinates from the touch down, as these co-ordinates are
|
| - // used to determine which layer the scroll should affect.
|
| - Send(CreateGesture(scroll_details,
|
| - e2.GetId(),
|
| - e2.GetToolType(),
|
| - e2.GetEventTime(),
|
| - e1.GetX(),
|
| - e1.GetY(),
|
| - e1.GetRawX(),
|
| - e1.GetRawY(),
|
| - e2.GetPointerCount(),
|
| - GetBoundingBox(e2, scroll_details.type()),
|
| - e2.GetFlags()));
|
| - DCHECK(scroll_event_sent_);
|
| }
|
|
|
| snap_scroll_controller_.UpdateSnapScrollMode(distance_x, distance_y);
|
| @@ -322,26 +306,36 @@ class GestureProvider::GestureListenerImpl : public ScaleGestureListener,
|
| distance_x = 0;
|
| }
|
|
|
| - if (distance_x || distance_y) {
|
| + if (!distance_x && !distance_y)
|
| + return true;
|
| +
|
| + if (!scroll_event_sent_) {
|
| + // Note that scroll start hints are in distance traveled, where
|
| + // scroll deltas are in the opposite direction.
|
| GestureEventDetails scroll_details(
|
| - ET_GESTURE_SCROLL_UPDATE, -distance_x, -distance_y);
|
| - const gfx::RectF bounding_box = GetBoundingBox(e2, scroll_details.type());
|
| - const gfx::PointF center = bounding_box.CenterPoint();
|
| - const gfx::PointF raw_center =
|
| - center + gfx::Vector2dF(e2.GetRawOffsetX(), e2.GetRawOffsetY());
|
| - Send(CreateGesture(scroll_details,
|
| - e2.GetId(),
|
| - e2.GetToolType(),
|
| - e2.GetEventTime(),
|
| - center.x(),
|
| - center.y(),
|
| - raw_center.x(),
|
| - raw_center.y(),
|
| - e2.GetPointerCount(),
|
| - bounding_box,
|
| + ET_GESTURE_SCROLL_BEGIN, -raw_distance_x, -raw_distance_y);
|
| +
|
| + // Use the co-ordinates from the touch down, as these co-ordinates are
|
| + // used to determine which layer the scroll should affect.
|
| + Send(CreateGesture(scroll_details, e2.GetPointerId(), e2.GetToolType(),
|
| + e2.GetEventTime(), e1.GetX(), e1.GetY(), e1.GetRawX(),
|
| + e1.GetRawY(), e2.GetPointerCount(),
|
| + GetBoundingBox(e2, scroll_details.type()),
|
| e2.GetFlags()));
|
| + DCHECK(scroll_event_sent_);
|
| }
|
|
|
| + GestureEventDetails scroll_details(ET_GESTURE_SCROLL_UPDATE, -distance_x,
|
| + -distance_y);
|
| + const gfx::RectF bounding_box = GetBoundingBox(e2, scroll_details.type());
|
| + const gfx::PointF center = bounding_box.CenterPoint();
|
| + const gfx::PointF raw_center =
|
| + center + gfx::Vector2dF(e2.GetRawOffsetX(), e2.GetRawOffsetY());
|
| + Send(CreateGesture(scroll_details, e2.GetPointerId(), e2.GetToolType(),
|
| + e2.GetEventTime(), center.x(), center.y(),
|
| + raw_center.x(), raw_center.y(), e2.GetPointerCount(),
|
| + bounding_box, e2.GetFlags()));
|
| +
|
| return true;
|
| }
|
|
|
| @@ -390,7 +384,7 @@ class GestureProvider::GestureListenerImpl : public ScaleGestureListener,
|
| GestureEventDetails two_finger_tap_details(
|
| ET_GESTURE_TWO_FINGER_TAP, e1.GetTouchMajor(), e1.GetTouchMajor());
|
| Send(CreateGesture(two_finger_tap_details,
|
| - e2.GetId(),
|
| + e2.GetPointerId(),
|
| e2.GetToolType(),
|
| e2.GetEventTime(),
|
| e1.GetX(),
|
| @@ -538,7 +532,7 @@ class GestureProvider::GestureListenerImpl : public ScaleGestureListener,
|
| GestureEventData CreateGesture(const GestureEventDetails& details,
|
| const MotionEvent& event) {
|
| return GestureEventData(details,
|
| - event.GetId(),
|
| + event.GetPointerId(),
|
| event.GetToolType(),
|
| event.GetEventTime(),
|
| event.GetX(),
|
| @@ -678,7 +672,8 @@ class GestureProvider::GestureListenerImpl : public ScaleGestureListener,
|
| GestureProvider::GestureProvider(const Config& config,
|
| GestureProviderClient* client)
|
| : double_tap_support_for_page_(true),
|
| - double_tap_support_for_platform_(true),
|
| + double_tap_support_for_platform_(
|
| + config.double_tap_support_for_platform_enabled),
|
| gesture_begin_end_types_enabled_(config.gesture_begin_end_types_enabled) {
|
| DCHECK(client);
|
| DCHECK(!config.min_gesture_bounds_length ||
|
| @@ -710,6 +705,13 @@ bool GestureProvider::OnTouchEvent(const MotionEvent& event) {
|
| return true;
|
| }
|
|
|
| +void GestureProvider::ResetDetection() {
|
| + MotionEventGeneric generic_cancel_event(MotionEvent::ACTION_CANCEL,
|
| + base::TimeTicks::Now(),
|
| + PointerProperties());
|
| + OnTouchEvent(generic_cancel_event);
|
| +}
|
| +
|
| void GestureProvider::SetMultiTouchZoomSupportEnabled(bool enabled) {
|
| gesture_listener_->SetMultiTouchZoomEnabled(enabled);
|
| }
|
| @@ -761,7 +763,7 @@ void GestureProvider::OnTouchEventHandlingBegin(const MotionEvent& event) {
|
| const int action_index = event.GetActionIndex();
|
| gesture_listener_->Send(gesture_listener_->CreateGesture(
|
| ET_GESTURE_BEGIN,
|
| - event.GetId(),
|
| + event.GetPointerId(),
|
| event.GetToolType(),
|
| event.GetEventTime(),
|
| event.GetX(action_index),
|
|
|