diff options
author | tdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-02 18:02:51 +0000 |
---|---|---|
committer | tdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-02 18:02:51 +0000 |
commit | d476bfa9ea0986f1395ae6987b2f3092bfd036eb (patch) | |
tree | 196fcb7b185de4927e6996717e65e29d11740e26 /ui/events/gestures | |
parent | 89670af7c862905ba4b1e76717fa140f7c65a95c (diff) | |
download | chromium_src-d476bfa9ea0986f1395ae6987b2f3092bfd036eb.zip chromium_src-d476bfa9ea0986f1395ae6987b2f3092bfd036eb.tar.gz chromium_src-d476bfa9ea0986f1395ae6987b2f3092bfd036eb.tar.bz2 |
Prepare for Unified Gesture Recognizer landing in Aura
This is the final cleanup before the unified gesture recognizer is turned on.
Tests are passing with the unified GR flag on and with the flag off.
BUG=332418
Test=GestureRecognizerTest.*, GestureProviderTest.*
Review URL: https://codereview.chromium.org/306483003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@274277 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/events/gestures')
-rw-r--r-- | ui/events/gestures/gesture_provider_aura.cc | 49 | ||||
-rw-r--r-- | ui/events/gestures/gesture_provider_aura.h | 3 | ||||
-rw-r--r-- | ui/events/gestures/gesture_recognizer_impl.cc | 11 |
3 files changed, 44 insertions, 19 deletions
diff --git a/ui/events/gestures/gesture_provider_aura.cc b/ui/events/gestures/gesture_provider_aura.cc index 0db2e04..edff9e3 100644 --- a/ui/events/gestures/gesture_provider_aura.cc +++ b/ui/events/gestures/gesture_provider_aura.cc @@ -4,6 +4,7 @@ #include "ui/events/gestures/gesture_provider_aura.h" +#include "base/auto_reset.h" #include "base/logging.h" #include "ui/events/event.h" #include "ui/events/gesture_detection/gesture_config_helper.h" @@ -14,7 +15,8 @@ namespace ui { GestureProviderAura::GestureProviderAura(GestureProviderAuraClient* client) : client_(client), - filtered_gesture_provider_(ui::DefaultGestureProviderConfig(), this) { + filtered_gesture_provider_(ui::DefaultGestureProviderConfig(), this), + handling_event_(false) { filtered_gesture_provider_.SetDoubleTapSupportForPlatformEnabled(false); } @@ -48,6 +50,9 @@ bool GestureProviderAura::OnTouchEvent(const TouchEvent& event) { } void GestureProviderAura::OnTouchEventAck(bool event_consumed) { + DCHECK(pending_gestures_.empty()); + DCHECK(!handling_event_); + base::AutoReset<bool> handling_event(&handling_event_, true); filtered_gesture_provider_.OnTouchEventAck(event_consumed); } @@ -69,18 +74,36 @@ void GestureProviderAura::OnGestureEvent( previous_tap_.reset(); } - ui::GestureEvent event(gesture.type, - gesture.x, - gesture.y, - last_touch_event_flags_, - gesture.time - base::TimeTicks(), - details, - // ui::GestureEvent stores a bitfield indicating the - // ids of active touch points. This is currently only - // used when one finger is down, and will eventually - // be cleaned up. See crbug.com/366707. - 1 << gesture.motion_event_id); - client_->OnGestureEvent(&event); + scoped_ptr<ui::GestureEvent> event( + new ui::GestureEvent(gesture.type, + gesture.x, + gesture.y, + last_touch_event_flags_, + gesture.time - base::TimeTicks(), + details, + // ui::GestureEvent stores a bitfield indicating the + // ids of active touch points. This is currently only + // used when one finger is down, and will eventually + // be cleaned up. See crbug.com/366707. + 1 << gesture.motion_event_id)); + + if (!handling_event_) { + // Dispatching event caused by timer. + client_->OnGestureEvent(event.get()); + } else { + // Memory managed by ScopedVector pending_gestures_. + pending_gestures_.push_back(event.release()); + } +} + +ScopedVector<GestureEvent>* GestureProviderAura::GetAndResetPendingGestures() { + if (pending_gestures_.empty()) + return NULL; + // Caller is responsible for deleting old_pending_gestures. + ScopedVector<GestureEvent>* old_pending_gestures = + new ScopedVector<GestureEvent>(); + old_pending_gestures->swap(pending_gestures_); + return old_pending_gestures; } bool GestureProviderAura::IsConsideredDoubleTap( diff --git a/ui/events/gestures/gesture_provider_aura.h b/ui/events/gestures/gesture_provider_aura.h index 5722be6..8a4b290 100644 --- a/ui/events/gestures/gesture_provider_aura.h +++ b/ui/events/gestures/gesture_provider_aura.h @@ -31,6 +31,7 @@ class EVENTS_EXPORT GestureProviderAura : public GestureProviderClient { bool OnTouchEvent(const TouchEvent& event); void OnTouchEventAck(bool event_consumed); const MotionEventAura& pointer_state() { return pointer_state_; } + ScopedVector<GestureEvent>* GetAndResetPendingGestures(); // GestureProviderClient implementation virtual void OnGestureEvent(const GestureEventData& gesture) OVERRIDE; @@ -46,6 +47,8 @@ class EVENTS_EXPORT GestureProviderAura : public GestureProviderClient { FilteredGestureProvider filtered_gesture_provider_; int last_touch_event_flags_; + bool handling_event_; + ScopedVector<GestureEvent> pending_gestures_; DISALLOW_COPY_AND_ASSIGN(GestureProviderAura); }; diff --git a/ui/events/gestures/gesture_recognizer_impl.cc b/ui/events/gestures/gesture_recognizer_impl.cc index c27af4aa..6ec5ccf 100644 --- a/ui/events/gestures/gesture_recognizer_impl.cc +++ b/ui/events/gestures/gesture_recognizer_impl.cc @@ -308,7 +308,7 @@ void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) { } } -GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture( +ScopedVector<GestureEvent>* GestureRecognizerImpl::ProcessTouchEventForGesture( const TouchEvent& event, ui::EventResult result, GestureConsumer* target) { @@ -322,8 +322,10 @@ GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture( GetGestureProviderForConsumer(target); // TODO(tdresser) - detect gestures eagerly. if (!(result & ER_CONSUMED)) { - if (gesture_provider->OnTouchEvent(event)) + if (gesture_provider->OnTouchEvent(event)) { gesture_provider->OnTouchEventAck(result != ER_UNHANDLED); + return gesture_provider->GetAndResetPendingGestures(); + } } return NULL; } @@ -342,10 +344,7 @@ bool GestureRecognizerImpl::CleanupStateForConsumer( } else { if (consumer_gesture_provider_.count(consumer)) { state_cleaned_up = true; - // Don't immediately delete the GestureProvider, as we could be in the - // middle of dispatching a set of gestures. - base::MessageLoop::current()->DeleteSoon( - FROM_HERE, consumer_gesture_provider_[consumer]); + delete consumer_gesture_provider_[consumer]; consumer_gesture_provider_.erase(consumer); } } |