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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 69 GestureEventDetails tap_details(type, 1, 0); | 69 GestureEventDetails tap_details(type, 1, 0); |
| 70 tap_details.set_bounding_box( | 70 tap_details.set_bounding_box( |
| 71 gfx::RectF(event.GetTouchMajor(), event.GetTouchMajor())); | 71 gfx::RectF(event.GetTouchMajor(), event.GetTouchMajor())); |
| 72 return tap_details; | 72 return tap_details; |
| 73 } | 73 } |
| 74 | 74 |
| 75 } // namespace | 75 } // namespace |
| 76 | 76 |
| 77 // GestureProvider:::Config | 77 // GestureProvider:::Config |
| 78 | 78 |
| 79 GestureProvider::Config::Config() : disable_click_delay(false) {} | 79 GestureProvider::Config::Config() |
| 80 : disable_click_delay(false), send_aura_specific_gestures(false) {} | |
| 80 | 81 |
| 81 GestureProvider::Config::~Config() {} | 82 GestureProvider::Config::~Config() {} |
| 82 | 83 |
| 83 // GestureProvider::ScaleGestureListener | 84 // GestureProvider::ScaleGestureListener |
| 84 | 85 |
| 85 class GestureProvider::ScaleGestureListenerImpl | 86 class GestureProvider::ScaleGestureListenerImpl |
| 86 : public ScaleGestureDetector::ScaleGestureListener { | 87 : public ScaleGestureDetector::ScaleGestureListener { |
| 87 public: | 88 public: |
| 88 ScaleGestureListenerImpl(const ScaleGestureDetector::Config& config, | 89 ScaleGestureListenerImpl(const ScaleGestureDetector::Config& config, |
| 89 GestureProvider* provider) | 90 GestureProvider* provider) |
| (...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 597 }; | 598 }; |
| 598 | 599 |
| 599 // GestureProvider | 600 // GestureProvider |
| 600 | 601 |
| 601 GestureProvider::GestureProvider(const Config& config, | 602 GestureProvider::GestureProvider(const Config& config, |
| 602 GestureProviderClient* client) | 603 GestureProviderClient* client) |
| 603 : client_(client), | 604 : client_(client), |
| 604 needs_show_press_event_(false), | 605 needs_show_press_event_(false), |
| 605 needs_tap_ending_event_(false), | 606 needs_tap_ending_event_(false), |
| 606 touch_scroll_in_progress_(false), | 607 touch_scroll_in_progress_(false), |
| 607 pinch_in_progress_(false) { | 608 pinch_in_progress_(false), |
| 609 send_aura_specific_gestures_(false) { | |
| 608 DCHECK(client); | 610 DCHECK(client); |
| 609 InitGestureDetectors(config); | 611 InitGestureDetectors(config); |
| 610 } | 612 } |
| 611 | 613 |
| 612 GestureProvider::~GestureProvider() {} | 614 GestureProvider::~GestureProvider() {} |
| 613 | 615 |
| 614 bool GestureProvider::OnTouchEvent(const MotionEvent& event) { | 616 bool GestureProvider::OnTouchEvent(const MotionEvent& event) { |
| 615 TRACE_EVENT1("input", "GestureProvider::OnTouchEvent", | 617 TRACE_EVENT1("input", "GestureProvider::OnTouchEvent", |
| 616 "action", GetMotionEventActionName(event.GetAction())); | 618 "action", GetMotionEventActionName(event.GetAction())); |
| 617 if (!CanHandle(event)) | 619 if (!CanHandle(event)) |
| 618 return false; | 620 return false; |
| 619 | 621 |
| 622 if (send_aura_specific_gestures_) | |
| 623 SendGestureBeginOrEndIfNecessary(event); | |
|
jdduke (slow)
2014/04/03 20:17:16
But don't we want the GestureEnd to come after eve
tdresser
2014/04/03 21:14:41
Done.
| |
| 624 | |
| 620 const bool was_touch_scrolling_ = touch_scroll_in_progress_; | 625 const bool was_touch_scrolling_ = touch_scroll_in_progress_; |
| 621 const bool in_scale_gesture = | 626 const bool in_scale_gesture = |
| 622 scale_gesture_listener_->IsScaleGestureDetectionInProgress(); | 627 scale_gesture_listener_->IsScaleGestureDetectionInProgress(); |
| 623 | 628 |
| 624 if (event.GetAction() == MotionEvent::ACTION_DOWN) { | 629 if (event.GetAction() == MotionEvent::ACTION_DOWN) { |
| 625 current_down_event_ = event.Clone(); | 630 current_down_event_ = event.Clone(); |
| 626 touch_scroll_in_progress_ = false; | 631 touch_scroll_in_progress_ = false; |
| 627 needs_show_press_event_ = true; | 632 needs_show_press_event_ = true; |
| 628 current_longpress_time_ = base::TimeTicks(); | 633 current_longpress_time_ = base::TimeTicks(); |
| 629 SendTapCancelIfNecessary(event); | 634 SendTapCancelIfNecessary(event); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 689 void GestureProvider::InitGestureDetectors(const Config& config) { | 694 void GestureProvider::InitGestureDetectors(const Config& config) { |
| 690 TRACE_EVENT0("input", "GestureProvider::InitGestureDetectors"); | 695 TRACE_EVENT0("input", "GestureProvider::InitGestureDetectors"); |
| 691 gesture_listener_.reset( | 696 gesture_listener_.reset( |
| 692 new GestureListenerImpl(config.gesture_detector_config, | 697 new GestureListenerImpl(config.gesture_detector_config, |
| 693 config.snap_scroll_controller_config, | 698 config.snap_scroll_controller_config, |
| 694 config.disable_click_delay, | 699 config.disable_click_delay, |
| 695 this)); | 700 this)); |
| 696 | 701 |
| 697 scale_gesture_listener_.reset( | 702 scale_gesture_listener_.reset( |
| 698 new ScaleGestureListenerImpl(config.scale_gesture_detector_config, this)); | 703 new ScaleGestureListenerImpl(config.scale_gesture_detector_config, this)); |
| 704 send_aura_specific_gestures_ = config.send_aura_specific_gestures; | |
| 699 } | 705 } |
| 700 | 706 |
| 701 bool GestureProvider::CanHandle(const MotionEvent& event) const { | 707 bool GestureProvider::CanHandle(const MotionEvent& event) const { |
| 702 return event.GetAction() == MotionEvent::ACTION_DOWN || current_down_event_; | 708 return event.GetAction() == MotionEvent::ACTION_DOWN || current_down_event_; |
| 703 } | 709 } |
| 704 | 710 |
| 705 void GestureProvider::Fling(base::TimeTicks time, | 711 void GestureProvider::Fling(base::TimeTicks time, |
| 706 float x, | 712 float x, |
| 707 float y, | 713 float y, |
| 708 float velocity_x, | 714 float velocity_x, |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 727 ET_SCROLL_FLING_START, velocity_x, velocity_y); | 733 ET_SCROLL_FLING_START, velocity_x, velocity_y); |
| 728 Send(CreateGesture(ET_SCROLL_FLING_START, time, x, y, fling_details)); | 734 Send(CreateGesture(ET_SCROLL_FLING_START, time, x, y, fling_details)); |
| 729 } | 735 } |
| 730 | 736 |
| 731 void GestureProvider::Send(const GestureEventData& gesture) { | 737 void GestureProvider::Send(const GestureEventData& gesture) { |
| 732 DCHECK(!gesture.time.is_null()); | 738 DCHECK(!gesture.time.is_null()); |
| 733 // The only valid events that should be sent without an active touch sequence | 739 // 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 | 740 // are SHOW_PRESS and TAP, potentially triggered by the double-tap |
| 735 // delay timing out. | 741 // delay timing out. |
| 736 DCHECK(current_down_event_ || gesture.type == ET_GESTURE_TAP || | 742 DCHECK(current_down_event_ || gesture.type == ET_GESTURE_TAP || |
| 737 gesture.type == ET_GESTURE_SHOW_PRESS); | 743 gesture.type == ET_GESTURE_SHOW_PRESS || |
| 744 gesture.type == ET_GESTURE_BEGIN); | |
| 738 | 745 |
| 739 switch (gesture.type) { | 746 switch (gesture.type) { |
| 740 case ET_GESTURE_TAP_DOWN: | 747 case ET_GESTURE_TAP_DOWN: |
| 741 needs_tap_ending_event_ = true; | 748 needs_tap_ending_event_ = true; |
| 742 break; | 749 break; |
| 743 case ET_GESTURE_TAP_UNCONFIRMED: | 750 case ET_GESTURE_TAP_UNCONFIRMED: |
| 744 needs_show_press_event_ = false; | 751 needs_show_press_event_ = false; |
| 745 break; | 752 break; |
| 746 case ET_GESTURE_TAP: | 753 case ET_GESTURE_TAP: |
| 747 if (needs_show_press_event_) | 754 if (needs_show_press_event_) |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 811 | 818 |
| 812 void GestureProvider::EndTouchScrollIfNecessary(base::TimeTicks time, | 819 void GestureProvider::EndTouchScrollIfNecessary(base::TimeTicks time, |
| 813 bool send_scroll_end_event) { | 820 bool send_scroll_end_event) { |
| 814 if (!touch_scroll_in_progress_) | 821 if (!touch_scroll_in_progress_) |
| 815 return; | 822 return; |
| 816 touch_scroll_in_progress_ = false; | 823 touch_scroll_in_progress_ = false; |
| 817 if (send_scroll_end_event) | 824 if (send_scroll_end_event) |
| 818 Send(CreateGesture(ET_GESTURE_SCROLL_END, time, 0, 0)); | 825 Send(CreateGesture(ET_GESTURE_SCROLL_END, time, 0, 0)); |
| 819 } | 826 } |
| 820 | 827 |
| 828 void GestureProvider::SendGestureBeginOrEndIfNecessary( | |
| 829 const MotionEvent& event) { | |
| 830 switch(event.GetAction()) { | |
|
jdduke (slow)
2014/04/03 20:17:16
Might as well move the check for the condition her
tdresser
2014/04/03 21:14:41
Done.
| |
| 831 case MotionEvent::ACTION_DOWN: | |
| 832 case MotionEvent::ACTION_POINTER_DOWN: | |
| 833 Send(CreateGesture(ET_GESTURE_BEGIN, event)); | |
| 834 break; | |
| 835 case MotionEvent::ACTION_UP: | |
| 836 case MotionEvent::ACTION_POINTER_UP: | |
| 837 case MotionEvent::ACTION_CANCEL: | |
| 838 Send(CreateGesture(ET_GESTURE_END, event)); | |
| 839 break; | |
| 840 case MotionEvent::ACTION_MOVE: | |
| 841 break; | |
| 842 } | |
| 843 } | |
| 844 | |
| 821 } // namespace ui | 845 } // namespace ui |
| OLD | NEW |