Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/events/gesture_detection/gesture_provider.h" | 5 #include "ui/events/gesture_detection/gesture_provider.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 24 case MotionEvent::ACTION_POINTER_UP: return "ACTION_POINTER_UP"; | 24 case MotionEvent::ACTION_POINTER_UP: return "ACTION_POINTER_UP"; |
| 25 case MotionEvent::ACTION_DOWN: return "ACTION_DOWN"; | 25 case MotionEvent::ACTION_DOWN: return "ACTION_DOWN"; |
| 26 case MotionEvent::ACTION_UP: return "ACTION_UP"; | 26 case MotionEvent::ACTION_UP: return "ACTION_UP"; |
| 27 case MotionEvent::ACTION_CANCEL: return "ACTION_CANCEL"; | 27 case MotionEvent::ACTION_CANCEL: return "ACTION_CANCEL"; |
| 28 case MotionEvent::ACTION_MOVE: return "ACTION_MOVE"; | 28 case MotionEvent::ACTION_MOVE: return "ACTION_MOVE"; |
| 29 } | 29 } |
| 30 return ""; | 30 return ""; |
| 31 } | 31 } |
| 32 | 32 |
| 33 GestureEventData CreateGesture(EventType type, | 33 GestureEventData CreateGesture(EventType type, |
| 34 int motion_event_id, | |
| 34 base::TimeTicks time, | 35 base::TimeTicks time, |
| 35 float x, | 36 float x, |
| 36 float y, | 37 float y, |
| 37 const GestureEventDetails& details) { | 38 const GestureEventDetails& details) { |
| 38 return GestureEventData(type, time, x, y, details); | 39 return GestureEventData(type, motion_event_id, time, x, y, details); |
| 39 } | 40 } |
| 40 | 41 |
| 41 GestureEventData CreateGesture(EventType type, | 42 GestureEventData CreateGesture(EventType type, |
| 43 int motion_event_id, | |
| 42 base::TimeTicks time, | 44 base::TimeTicks time, |
| 43 float x, | 45 float x, |
| 44 float y) { | 46 float y) { |
| 45 return GestureEventData(type, time, x, y); | 47 return GestureEventData(type, motion_event_id, time, x, y); |
| 46 } | 48 } |
| 47 | 49 |
| 48 GestureEventData CreateGesture(EventType type, | 50 GestureEventData CreateGesture(EventType type, |
| 49 const MotionEvent& event, | 51 const MotionEvent& event, |
| 50 const GestureEventDetails& details) { | 52 const GestureEventDetails& details) { |
| 51 return CreateGesture( | 53 return GestureEventData(type, |
| 52 type, event.GetEventTime(), event.GetX(), event.GetY(), details); | 54 event.GetId(), |
| 55 event.GetEventTime(), | |
| 56 event.GetX(), | |
| 57 event.GetY(), | |
| 58 details); | |
| 53 } | 59 } |
| 54 | 60 |
| 55 GestureEventData CreateGesture(EventType type, | 61 GestureEventData CreateGesture(EventType type, |
| 56 const MotionEvent& event) { | 62 const MotionEvent& event) { |
| 57 return CreateGesture(type, event.GetEventTime(), event.GetX(), event.GetY()); | 63 return CreateGesture(type, |
| 64 event.GetId(), | |
| 65 event.GetEventTime(), | |
| 66 event.GetX(), | |
| 67 event.GetY()); | |
| 58 } | 68 } |
| 59 | 69 |
| 60 float Round(float f) { | 70 float Round(float f) { |
| 61 return (f > 0.f) ? std::floor(f + 0.5f) : std::ceil(f - 0.5f); | 71 return (f > 0.f) ? std::floor(f + 0.5f) : std::ceil(f - 0.5f); |
| 62 } | 72 } |
| 63 | 73 |
| 64 GestureEventDetails CreateTapGestureDetails(EventType type, | 74 GestureEventDetails CreateTapGestureDetails(EventType type, |
| 65 const MotionEvent& event) { | 75 const MotionEvent& event) { |
| 66 // Set the tap count to 1 even for ET_GESTURE_DOUBLE_TAP, in order to be | 76 // Set the tap count to 1 even for ET_GESTURE_DOUBLE_TAP, in order to be |
| 67 // consistent with double tap behavior on a mobile viewport. See | 77 // consistent with double tap behavior on a mobile viewport. See |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 98 bool handled = scale_gesture_detector_.OnTouchEvent(event); | 108 bool handled = scale_gesture_detector_.OnTouchEvent(event); |
| 99 if (!in_scale_gesture && | 109 if (!in_scale_gesture && |
| 100 (event.GetAction() == MotionEvent::ACTION_UP || | 110 (event.GetAction() == MotionEvent::ACTION_UP || |
| 101 event.GetAction() == MotionEvent::ACTION_CANCEL)) { | 111 event.GetAction() == MotionEvent::ACTION_CANCEL)) { |
| 102 return false; | 112 return false; |
| 103 } | 113 } |
| 104 return handled; | 114 return handled; |
| 105 } | 115 } |
| 106 | 116 |
| 107 // ScaleGestureDetector::ScaleGestureListener implementation. | 117 // ScaleGestureDetector::ScaleGestureListener implementation. |
| 108 virtual bool OnScaleBegin(const ScaleGestureDetector& detector) OVERRIDE { | 118 virtual bool OnScaleBegin(const ScaleGestureDetector& detector, |
| 119 const MotionEvent& e) OVERRIDE { | |
| 109 if (ignore_detector_events_) | 120 if (ignore_detector_events_) |
| 110 return false; | 121 return false; |
| 111 pinch_event_sent_ = false; | 122 pinch_event_sent_ = false; |
| 112 return true; | 123 return true; |
| 113 } | 124 } |
| 114 | 125 |
| 115 virtual void OnScaleEnd(const ScaleGestureDetector& detector) OVERRIDE { | 126 virtual void OnScaleEnd(const ScaleGestureDetector& detector, |
| 127 const MotionEvent& e) OVERRIDE { | |
| 116 if (!pinch_event_sent_) | 128 if (!pinch_event_sent_) |
| 117 return; | 129 return; |
| 118 provider_->Send( | 130 provider_->Send(CreateGesture(ET_GESTURE_PINCH_END, |
| 119 CreateGesture(ET_GESTURE_PINCH_END, detector.GetEventTime(), 0, 0)); | 131 e.GetId(), |
| 132 detector.GetEventTime(), | |
| 133 0, | |
| 134 0)); | |
| 120 pinch_event_sent_ = false; | 135 pinch_event_sent_ = false; |
| 121 } | 136 } |
| 122 | 137 |
| 123 virtual bool OnScale(const ScaleGestureDetector& detector) OVERRIDE { | 138 virtual bool OnScale(const ScaleGestureDetector& detector, |
| 139 const MotionEvent& e) OVERRIDE { | |
| 124 if (ignore_detector_events_) | 140 if (ignore_detector_events_) |
| 125 return false; | 141 return false; |
| 126 if (!pinch_event_sent_) { | 142 if (!pinch_event_sent_) { |
| 127 pinch_event_sent_ = true; | 143 pinch_event_sent_ = true; |
| 128 provider_->Send(CreateGesture(ET_GESTURE_PINCH_BEGIN, | 144 provider_->Send(CreateGesture(ET_GESTURE_PINCH_BEGIN, |
| 145 e.GetId(), | |
| 129 detector.GetEventTime(), | 146 detector.GetEventTime(), |
| 130 detector.GetFocusX(), | 147 detector.GetFocusX(), |
| 131 detector.GetFocusY())); | 148 detector.GetFocusY())); |
| 132 } | 149 } |
| 133 GestureEventDetails pinch_details( | 150 GestureEventDetails pinch_details( |
| 134 ET_GESTURE_PINCH_UPDATE, detector.GetScaleFactor(), 0); | 151 ET_GESTURE_PINCH_UPDATE, detector.GetScaleFactor(), 0); |
| 135 provider_->Send(CreateGesture(ET_GESTURE_PINCH_UPDATE, | 152 provider_->Send(CreateGesture(ET_GESTURE_PINCH_UPDATE, |
| 153 e.GetId(), | |
| 136 detector.GetEventTime(), | 154 detector.GetEventTime(), |
| 137 detector.GetFocusX(), | 155 detector.GetFocusX(), |
| 138 detector.GetFocusY(), | 156 detector.GetFocusY(), |
| 139 pinch_details)); | 157 pinch_details)); |
| 140 return true; | 158 return true; |
| 141 } | 159 } |
| 142 | 160 |
| 143 bool IsScaleGestureDetectionInProgress() const { | 161 bool IsScaleGestureDetectionInProgress() const { |
| 144 return !ignore_detector_events_ && scale_gesture_detector_.IsInProgress(); | 162 return !ignore_detector_events_ && scale_gesture_detector_.IsInProgress(); |
| 145 } | 163 } |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 268 } | 286 } |
| 269 | 287 |
| 270 last_raw_x_ = e2.GetRawX(); | 288 last_raw_x_ = e2.GetRawX(); |
| 271 last_raw_y_ = e2.GetRawY(); | 289 last_raw_y_ = e2.GetRawY(); |
| 272 if (!provider_->IsScrollInProgress()) { | 290 if (!provider_->IsScrollInProgress()) { |
| 273 // Note that scroll start hints are in distance traveled, where | 291 // Note that scroll start hints are in distance traveled, where |
| 274 // scroll deltas are in the opposite direction. | 292 // scroll deltas are in the opposite direction. |
| 275 GestureEventDetails scroll_details( | 293 GestureEventDetails scroll_details( |
| 276 ET_GESTURE_SCROLL_BEGIN, -raw_distance_x, -raw_distance_y); | 294 ET_GESTURE_SCROLL_BEGIN, -raw_distance_x, -raw_distance_y); |
| 277 provider_->Send(CreateGesture(ET_GESTURE_SCROLL_BEGIN, | 295 provider_->Send(CreateGesture(ET_GESTURE_SCROLL_BEGIN, |
| 296 e1.GetId(), | |
|
jdduke (slow)
2014/04/02 18:33:12
Hmm... e1 is the ACTION_DOWN, don't we want the id
tdresser
2014/04/03 14:01:23
There were a couple other similar issues - my init
| |
| 278 e2.GetEventTime(), | 297 e2.GetEventTime(), |
| 279 e1.GetX(), | 298 e1.GetX(), |
| 280 e1.GetY(), | 299 e1.GetY(), |
| 281 scroll_details)); | 300 scroll_details)); |
| 282 } | 301 } |
| 283 | 302 |
| 284 // distance_x and distance_y is the scrolling offset since last OnScroll. | 303 // distance_x and distance_y is the scrolling offset since last OnScroll. |
| 285 // Because we are passing integers to Blink, this could introduce | 304 // Because we are passing integers to Blink, this could introduce |
| 286 // rounding errors. The rounding errors will accumulate overtime. | 305 // rounding errors. The rounding errors will accumulate overtime. |
| 287 // To solve this, we should be adding back the rounding errors each time | 306 // To solve this, we should be adding back the rounding errors each time |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 307 float velocity_x, | 326 float velocity_x, |
| 308 float velocity_y) OVERRIDE { | 327 float velocity_y) OVERRIDE { |
| 309 if (snap_scroll_controller_.IsSnappingScrolls()) { | 328 if (snap_scroll_controller_.IsSnappingScrolls()) { |
| 310 if (snap_scroll_controller_.IsSnapHorizontal()) { | 329 if (snap_scroll_controller_.IsSnapHorizontal()) { |
| 311 velocity_y = 0; | 330 velocity_y = 0; |
| 312 } else { | 331 } else { |
| 313 velocity_x = 0; | 332 velocity_x = 0; |
| 314 } | 333 } |
| 315 } | 334 } |
| 316 | 335 |
| 317 provider_->Fling( | 336 provider_->Fling(e2.GetEventTime(), |
| 318 e2.GetEventTime(), e1.GetX(), e1.GetY(), velocity_x, velocity_y); | 337 e1.GetId(), |
|
jdduke (slow)
2014/04/02 18:33:12
Hmm, I think we want e2.getId() on the fling (the
tdresser
2014/04/03 14:01:23
Done.
| |
| 338 e1.GetX(), | |
| 339 e1.GetY(), | |
| 340 velocity_x, | |
| 341 velocity_y); | |
| 319 return true; | 342 return true; |
| 320 } | 343 } |
| 321 | 344 |
| 322 virtual void OnShowPress(const MotionEvent& e) OVERRIDE { | 345 virtual void OnShowPress(const MotionEvent& e) OVERRIDE { |
| 323 GestureEventDetails show_press_details(ET_GESTURE_SHOW_PRESS, 0, 0); | 346 GestureEventDetails show_press_details(ET_GESTURE_SHOW_PRESS, 0, 0); |
| 324 // TODO(jdduke): Expose minor axis length and rotation in |MotionEvent|. | 347 // TODO(jdduke): Expose minor axis length and rotation in |MotionEvent|. |
| 325 show_press_details.set_bounding_box( | 348 show_press_details.set_bounding_box( |
| 326 gfx::RectF(e.GetTouchMajor(), e.GetTouchMajor())); | 349 gfx::RectF(e.GetTouchMajor(), e.GetTouchMajor())); |
| 327 provider_->Send( | 350 provider_->Send( |
| 328 CreateGesture(ET_GESTURE_SHOW_PRESS, e, show_press_details)); | 351 CreateGesture(ET_GESTURE_SHOW_PRESS, e, show_press_details)); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 396 case MotionEvent::ACTION_MOVE: | 419 case MotionEvent::ACTION_MOVE: |
| 397 if (double_tap_mode_ == DOUBLE_TAP_MODE_DRAG_DETECTION_IN_PROGRESS) { | 420 if (double_tap_mode_ == DOUBLE_TAP_MODE_DRAG_DETECTION_IN_PROGRESS) { |
| 398 float distance_x = double_tap_drag_zoom_anchor_x_ - e.GetX(); | 421 float distance_x = double_tap_drag_zoom_anchor_x_ - e.GetX(); |
| 399 float distance_y = double_tap_drag_zoom_anchor_y_ - e.GetY(); | 422 float distance_y = double_tap_drag_zoom_anchor_y_ - e.GetY(); |
| 400 | 423 |
| 401 // Begin double-tap drag zoom mode if the move distance is | 424 // Begin double-tap drag zoom mode if the move distance is |
| 402 // further than the threshold. | 425 // further than the threshold. |
| 403 if (IsDistanceGreaterThanTouchSlop(distance_x, distance_y)) { | 426 if (IsDistanceGreaterThanTouchSlop(distance_x, distance_y)) { |
| 404 GestureEventDetails scroll_details( | 427 GestureEventDetails scroll_details( |
| 405 ET_GESTURE_SCROLL_BEGIN, -distance_x, -distance_y); | 428 ET_GESTURE_SCROLL_BEGIN, -distance_x, -distance_y); |
| 406 provider_->Send( | 429 provider_->Send(CreateGesture( |
| 407 CreateGesture(ET_GESTURE_SCROLL_BEGIN, e, scroll_details)); | 430 ET_GESTURE_SCROLL_BEGIN, e, scroll_details)); |
| 408 provider_->Send( | 431 provider_->Send( |
| 409 CreateGesture(ET_GESTURE_PINCH_BEGIN, | 432 CreateGesture(ET_GESTURE_PINCH_BEGIN, |
| 433 e.GetId(), | |
| 410 e.GetEventTime(), | 434 e.GetEventTime(), |
| 411 Round(double_tap_drag_zoom_anchor_x_), | 435 Round(double_tap_drag_zoom_anchor_x_), |
| 412 Round(double_tap_drag_zoom_anchor_y_))); | 436 Round(double_tap_drag_zoom_anchor_y_))); |
| 413 double_tap_mode_ = DOUBLE_TAP_MODE_DRAG_ZOOM; | 437 double_tap_mode_ = DOUBLE_TAP_MODE_DRAG_ZOOM; |
| 414 } | 438 } |
| 415 } else if (double_tap_mode_ == DOUBLE_TAP_MODE_DRAG_ZOOM) { | 439 } else if (double_tap_mode_ == DOUBLE_TAP_MODE_DRAG_ZOOM) { |
| 416 provider_->Send(CreateGesture(ET_GESTURE_SCROLL_UPDATE, e)); | 440 provider_->Send(CreateGesture(ET_GESTURE_SCROLL_UPDATE, e)); |
| 417 | 441 |
| 418 float dy = double_tap_y_ - e.GetY(); | 442 float dy = double_tap_y_ - e.GetY(); |
| 419 float scale = std::pow(dy > 0 ? 1.0f - kDoubleTapDragZoomSpeed | 443 float scale = std::pow(dy > 0 ? 1.0f - kDoubleTapDragZoomSpeed |
| 420 : 1.0f + kDoubleTapDragZoomSpeed, | 444 : 1.0f + kDoubleTapDragZoomSpeed, |
| 421 std::abs(dy * px_to_dp_)); | 445 std::abs(dy * px_to_dp_)); |
| 422 GestureEventDetails pinch_details(ET_GESTURE_PINCH_UPDATE, scale, 0); | 446 GestureEventDetails pinch_details(ET_GESTURE_PINCH_UPDATE, scale, 0); |
| 423 provider_->Send(CreateGesture(ET_GESTURE_PINCH_UPDATE, | 447 provider_->Send(CreateGesture(ET_GESTURE_PINCH_UPDATE, |
| 448 e.GetId(), | |
| 424 e.GetEventTime(), | 449 e.GetEventTime(), |
| 425 Round(double_tap_drag_zoom_anchor_x_), | 450 Round(double_tap_drag_zoom_anchor_x_), |
| 426 Round(double_tap_drag_zoom_anchor_y_), | 451 Round(double_tap_drag_zoom_anchor_y_), |
| 427 pinch_details)); | 452 pinch_details)); |
| 428 } | 453 } |
| 429 break; | 454 break; |
| 430 case MotionEvent::ACTION_UP: | 455 case MotionEvent::ACTION_UP: |
| 431 if (double_tap_mode_ != DOUBLE_TAP_MODE_DRAG_ZOOM) { | 456 if (double_tap_mode_ != DOUBLE_TAP_MODE_DRAG_ZOOM) { |
| 432 // Normal double-tap gesture. | 457 // Normal double-tap gesture. |
| 433 provider_->Send( | 458 provider_->Send( |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 630 } | 655 } |
| 631 | 656 |
| 632 bool handled = gesture_listener_->OnTouchEvent(event, in_scale_gesture); | 657 bool handled = gesture_listener_->OnTouchEvent(event, in_scale_gesture); |
| 633 handled |= scale_gesture_listener_->OnTouchEvent(event); | 658 handled |= scale_gesture_listener_->OnTouchEvent(event); |
| 634 | 659 |
| 635 if (event.GetAction() == MotionEvent::ACTION_UP || | 660 if (event.GetAction() == MotionEvent::ACTION_UP || |
| 636 event.GetAction() == MotionEvent::ACTION_CANCEL) { | 661 event.GetAction() == MotionEvent::ACTION_CANCEL) { |
| 637 // "Last finger raised" could be an end to movement, but it should | 662 // "Last finger raised" could be an end to movement, but it should |
| 638 // only terminate scrolling if the event did not cause a fling. | 663 // only terminate scrolling if the event did not cause a fling. |
| 639 if (was_touch_scrolling_ && !handled) | 664 if (was_touch_scrolling_ && !handled) |
| 640 EndTouchScrollIfNecessary(event.GetEventTime(), true); | 665 EndTouchScrollIfNecessary(event.GetEventTime(), event.GetId(), true); |
| 641 | 666 |
| 642 // We shouldn't necessarily cancel a tap on ACTION_UP, as the double-tap | 667 // We shouldn't necessarily cancel a tap on ACTION_UP, as the double-tap |
| 643 // timeout may yet trigger a SINGLE_TAP. | 668 // timeout may yet trigger a SINGLE_TAP. |
| 644 if (event.GetAction() == MotionEvent::ACTION_CANCEL) | 669 if (event.GetAction() == MotionEvent::ACTION_CANCEL) |
| 645 SendTapCancelIfNecessary(event); | 670 SendTapCancelIfNecessary(event); |
| 646 | 671 |
| 647 current_down_event_.reset(); | 672 current_down_event_.reset(); |
| 648 } | 673 } |
| 649 | 674 |
| 650 return true; | 675 return true; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 696 | 721 |
| 697 scale_gesture_listener_.reset( | 722 scale_gesture_listener_.reset( |
| 698 new ScaleGestureListenerImpl(config.scale_gesture_detector_config, this)); | 723 new ScaleGestureListenerImpl(config.scale_gesture_detector_config, this)); |
| 699 } | 724 } |
| 700 | 725 |
| 701 bool GestureProvider::CanHandle(const MotionEvent& event) const { | 726 bool GestureProvider::CanHandle(const MotionEvent& event) const { |
| 702 return event.GetAction() == MotionEvent::ACTION_DOWN || current_down_event_; | 727 return event.GetAction() == MotionEvent::ACTION_DOWN || current_down_event_; |
| 703 } | 728 } |
| 704 | 729 |
| 705 void GestureProvider::Fling(base::TimeTicks time, | 730 void GestureProvider::Fling(base::TimeTicks time, |
| 731 int motion_event_id, | |
| 706 float x, | 732 float x, |
| 707 float y, | 733 float y, |
| 708 float velocity_x, | 734 float velocity_x, |
| 709 float velocity_y) { | 735 float velocity_y) { |
| 710 if (!velocity_x && !velocity_y) { | 736 if (!velocity_x && !velocity_y) { |
| 711 EndTouchScrollIfNecessary(time, true); | 737 EndTouchScrollIfNecessary(time, motion_event_id, true); |
| 712 return; | 738 return; |
| 713 } | 739 } |
| 714 | 740 |
| 715 if (!touch_scroll_in_progress_) { | 741 if (!touch_scroll_in_progress_) { |
| 716 // The native side needs a ET_GESTURE_SCROLL_BEGIN before | 742 // The native side needs a ET_GESTURE_SCROLL_BEGIN before |
| 717 // ET_SCROLL_FLING_START to send the fling to the correct target. Send if it | 743 // ET_SCROLL_FLING_START to send the fling to the correct target. Send if it |
| 718 // has not sent. The distance traveled in one second is a reasonable scroll | 744 // has not sent. The distance traveled in one second is a reasonable scroll |
| 719 // start hint. | 745 // start hint. |
| 720 GestureEventDetails scroll_details( | 746 GestureEventDetails scroll_details( |
| 721 ET_GESTURE_SCROLL_BEGIN, velocity_x, velocity_y); | 747 ET_GESTURE_SCROLL_BEGIN, velocity_x, velocity_y); |
| 722 Send(CreateGesture(ET_GESTURE_SCROLL_BEGIN, time, x, y, scroll_details)); | 748 Send(CreateGesture( |
| 749 ET_GESTURE_SCROLL_BEGIN, motion_event_id, time, x, y, scroll_details)); | |
| 723 } | 750 } |
| 724 EndTouchScrollIfNecessary(time, false); | 751 EndTouchScrollIfNecessary(time, motion_event_id, false); |
| 725 | 752 |
| 726 GestureEventDetails fling_details( | 753 GestureEventDetails fling_details( |
| 727 ET_SCROLL_FLING_START, velocity_x, velocity_y); | 754 ET_SCROLL_FLING_START, velocity_x, velocity_y); |
| 728 Send(CreateGesture(ET_SCROLL_FLING_START, time, x, y, fling_details)); | 755 Send(CreateGesture( |
| 756 ET_SCROLL_FLING_START, motion_event_id, time, x, y, fling_details)); | |
| 729 } | 757 } |
| 730 | 758 |
| 731 void GestureProvider::Send(const GestureEventData& gesture) { | 759 void GestureProvider::Send(const GestureEventData& gesture) { |
| 732 DCHECK(!gesture.time.is_null()); | 760 DCHECK(!gesture.time.is_null()); |
| 733 // The only valid events that should be sent without an active touch sequence | 761 // The only valid events that should be sent without an active touch sequence |
| 734 // are SHOW_PRESS and TAP, potentially triggered by the double-tap | 762 // are SHOW_PRESS and TAP, potentially triggered by the double-tap |
| 735 // delay timing out. | 763 // delay timing out. |
| 736 DCHECK(current_down_event_ || gesture.type == ET_GESTURE_TAP || | 764 DCHECK(current_down_event_ || gesture.type == ET_GESTURE_TAP || |
| 737 gesture.type == ET_GESTURE_SHOW_PRESS); | 765 gesture.type == ET_GESTURE_SHOW_PRESS); |
| 738 | 766 |
| 739 switch (gesture.type) { | 767 switch (gesture.type) { |
| 740 case ET_GESTURE_TAP_DOWN: | 768 case ET_GESTURE_TAP_DOWN: |
| 741 needs_tap_ending_event_ = true; | 769 needs_tap_ending_event_ = true; |
| 742 break; | 770 break; |
| 743 case ET_GESTURE_TAP_UNCONFIRMED: | 771 case ET_GESTURE_TAP_UNCONFIRMED: |
| 744 needs_show_press_event_ = false; | 772 needs_show_press_event_ = false; |
| 745 break; | 773 break; |
| 746 case ET_GESTURE_TAP: | 774 case ET_GESTURE_TAP: |
| 747 if (needs_show_press_event_) | 775 if (needs_show_press_event_) |
| 748 Send(CreateGesture( | 776 Send(CreateGesture(ET_GESTURE_SHOW_PRESS, |
| 749 ET_GESTURE_SHOW_PRESS, gesture.time, gesture.x, gesture.y)); | 777 gesture.motion_event_id, |
| 778 gesture.time, | |
| 779 gesture.x, | |
| 780 gesture.y)); | |
| 750 needs_tap_ending_event_ = false; | 781 needs_tap_ending_event_ = false; |
| 751 break; | 782 break; |
| 752 case ET_GESTURE_DOUBLE_TAP: | 783 case ET_GESTURE_DOUBLE_TAP: |
| 753 needs_tap_ending_event_ = false; | 784 needs_tap_ending_event_ = false; |
| 754 break; | 785 break; |
| 755 case ET_GESTURE_TAP_CANCEL: | 786 case ET_GESTURE_TAP_CANCEL: |
| 756 if (!needs_tap_ending_event_) | 787 if (!needs_tap_ending_event_) |
| 757 return; | 788 return; |
| 758 needs_tap_ending_event_ = false; | 789 needs_tap_ending_event_ = false; |
| 759 break; | 790 break; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 803 GestureEventDetails long_tap_details(ET_GESTURE_LONG_TAP, 0, 0); | 834 GestureEventDetails long_tap_details(ET_GESTURE_LONG_TAP, 0, 0); |
| 804 long_tap_details.set_bounding_box( | 835 long_tap_details.set_bounding_box( |
| 805 gfx::RectF(event.GetTouchMajor(), event.GetTouchMajor())); | 836 gfx::RectF(event.GetTouchMajor(), event.GetTouchMajor())); |
| 806 Send(CreateGesture(ET_GESTURE_LONG_TAP, event, long_tap_details)); | 837 Send(CreateGesture(ET_GESTURE_LONG_TAP, event, long_tap_details)); |
| 807 return true; | 838 return true; |
| 808 } | 839 } |
| 809 return false; | 840 return false; |
| 810 } | 841 } |
| 811 | 842 |
| 812 void GestureProvider::EndTouchScrollIfNecessary(base::TimeTicks time, | 843 void GestureProvider::EndTouchScrollIfNecessary(base::TimeTicks time, |
| 844 int motion_event_id, | |
| 813 bool send_scroll_end_event) { | 845 bool send_scroll_end_event) { |
| 814 if (!touch_scroll_in_progress_) | 846 if (!touch_scroll_in_progress_) |
| 815 return; | 847 return; |
| 816 touch_scroll_in_progress_ = false; | 848 touch_scroll_in_progress_ = false; |
| 817 if (send_scroll_end_event) | 849 if (send_scroll_end_event) |
| 818 Send(CreateGesture(ET_GESTURE_SCROLL_END, time, 0, 0)); | 850 Send(CreateGesture(ET_GESTURE_SCROLL_END, motion_event_id, time, 0, 0)); |
| 819 } | 851 } |
| 820 | 852 |
| 821 } // namespace ui | 853 } // namespace ui |
| OLD | NEW |