| Index: ui/events/gestures/gesture_recognizer_impl.cc
|
| diff --git a/ui/events/gestures/gesture_recognizer_impl.cc b/ui/events/gestures/gesture_recognizer_impl.cc
|
| index d2316d4d0ca9555d489906dda27a9027e4b067cb..7e044639028cc9b77c405409ba7c68b6edf1f0ba 100644
|
| --- a/ui/events/gestures/gesture_recognizer_impl.cc
|
| +++ b/ui/events/gestures/gesture_recognizer_impl.cc
|
| @@ -4,16 +4,11 @@
|
|
|
| #include "ui/events/gestures/gesture_recognizer_impl.h"
|
|
|
| -#include <limits>
|
| -
|
| -#include "base/command_line.h"
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| #include "base/time/time.h"
|
| #include "ui/events/event.h"
|
| #include "ui/events/event_constants.h"
|
| -#include "ui/events/event_switches.h"
|
| #include "ui/events/event_utils.h"
|
| #include "ui/events/gestures/gesture_configuration.h"
|
| #include "ui/events/gestures/gesture_sequence.h"
|
| @@ -59,23 +54,16 @@
|
| }
|
| }
|
|
|
| -GestureProviderAura* CreateGestureProvider(GestureProviderAuraClient* client) {
|
| - return new GestureProviderAura(client);
|
| -}
|
| -
|
| } // namespace
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // GestureRecognizerImpl, public:
|
|
|
| -GestureRecognizerImpl::GestureRecognizerImpl()
|
| - : use_unified_gesture_detector_(CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kUseUnifiedGestureDetector)) {
|
| +GestureRecognizerImpl::GestureRecognizerImpl() {
|
| }
|
|
|
| GestureRecognizerImpl::~GestureRecognizerImpl() {
|
| STLDeleteValues(&consumer_sequence_);
|
| - STLDeleteValues(&consumer_gesture_provider_);
|
| }
|
|
|
| // Checks if this finger is already down, if so, returns the current target.
|
| @@ -95,65 +83,34 @@
|
|
|
| GestureConsumer* GestureRecognizerImpl::GetTargetForLocation(
|
| const gfx::PointF& location, int source_device_id) {
|
| + const GesturePoint* closest_point = NULL;
|
| + int64 closest_distance_squared = 0;
|
| + std::map<GestureConsumer*, GestureSequence*>::iterator i;
|
| + for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) {
|
| + const GesturePoint* points = i->second->points();
|
| + for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) {
|
| + if (!points[j].in_use() ||
|
| + source_device_id != points[j].source_device_id()) {
|
| + continue;
|
| + }
|
| + gfx::Vector2dF delta = points[j].last_touch_position() - location;
|
| + // Relative distance is all we need here, so LengthSquared() is
|
| + // appropriate, and cheaper than Length().
|
| + int64 distance_squared = delta.LengthSquared();
|
| + if (!closest_point || distance_squared < closest_distance_squared) {
|
| + closest_point = &points[j];
|
| + closest_distance_squared = distance_squared;
|
| + }
|
| + }
|
| + }
|
| +
|
| const int max_distance =
|
| GestureConfiguration::max_separation_for_gesture_touches_in_pixels();
|
|
|
| - if (!use_unified_gesture_detector_) {
|
| - const GesturePoint* closest_point = NULL;
|
| - int64 closest_distance_squared = 0;
|
| - std::map<GestureConsumer*, GestureSequence*>::iterator i;
|
| - for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) {
|
| - const GesturePoint* points = i->second->points();
|
| - for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) {
|
| - if (!points[j].in_use() ||
|
| - source_device_id != points[j].source_device_id()) {
|
| - continue;
|
| - }
|
| - gfx::Vector2dF delta = points[j].last_touch_position() - location;
|
| - // Relative distance is all we need here, so LengthSquared() is
|
| - // appropriate, and cheaper than Length().
|
| - int64 distance_squared = delta.LengthSquared();
|
| - if (!closest_point || distance_squared < closest_distance_squared) {
|
| - closest_point = &points[j];
|
| - closest_distance_squared = distance_squared;
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (closest_distance_squared < max_distance * max_distance && closest_point)
|
| - return touch_id_target_[closest_point->touch_id()];
|
| - else
|
| - return NULL;
|
| - } else {
|
| - gfx::PointF closest_point;
|
| - int closest_touch_id;
|
| - float closest_distance_squared = std::numeric_limits<float>::infinity();
|
| -
|
| - std::map<GestureConsumer*, GestureProviderAura*>::iterator i;
|
| - for (i = consumer_gesture_provider_.begin();
|
| - i != consumer_gesture_provider_.end();
|
| - ++i) {
|
| - const MotionEventAura& pointer_state = i->second->pointer_state();
|
| - for (size_t j = 0; j < pointer_state.GetPointerCount(); ++j) {
|
| - if (source_device_id != pointer_state.GetSourceDeviceId(j))
|
| - continue;
|
| - gfx::PointF point(pointer_state.GetX(j), pointer_state.GetY(j));
|
| - // Relative distance is all we need here, so LengthSquared() is
|
| - // appropriate, and cheaper than Length().
|
| - float distance_squared = (point - location).LengthSquared();
|
| - if (distance_squared < closest_distance_squared) {
|
| - closest_point = point;
|
| - closest_touch_id = pointer_state.GetPointerId(j);
|
| - closest_distance_squared = distance_squared;
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (closest_distance_squared < max_distance * max_distance)
|
| - return touch_id_target_[closest_touch_id];
|
| - else
|
| - return NULL;
|
| - }
|
| + if (closest_distance_squared < max_distance * max_distance && closest_point)
|
| + return touch_id_target_[closest_point->touch_id()];
|
| + else
|
| + return NULL;
|
| }
|
|
|
| void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer,
|
| @@ -183,30 +140,18 @@
|
| &touch_id_target_);
|
| TransferTouchIdToConsumerMap(current_consumer, new_consumer,
|
| &touch_id_target_for_gestures_);
|
| - if (!use_unified_gesture_detector_)
|
| - TransferConsumer(current_consumer, new_consumer, &consumer_sequence_);
|
| - else
|
| - TransferConsumer(
|
| - current_consumer, new_consumer, &consumer_gesture_provider_);
|
| + TransferConsumer(current_consumer, new_consumer, &consumer_sequence_);
|
| }
|
| }
|
|
|
| bool GestureRecognizerImpl::GetLastTouchPointForTarget(
|
| GestureConsumer* consumer,
|
| gfx::PointF* point) {
|
| - if (!use_unified_gesture_detector_) {
|
| - if (consumer_sequence_.count(consumer) == 0)
|
| - return false;
|
| - *point = consumer_sequence_[consumer]->last_touch_location();
|
| - return true;
|
| - } else {
|
| - if (consumer_gesture_provider_.count(consumer) == 0)
|
| - return false;
|
| - const MotionEvent& pointer_state =
|
| - consumer_gesture_provider_[consumer]->pointer_state();
|
| - *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY());
|
| - return true;
|
| - }
|
| + if (consumer_sequence_.count(consumer) == 0)
|
| + return false;
|
| +
|
| + *point = consumer_sequence_[consumer]->last_touch_location();
|
| + return true;
|
| }
|
|
|
| bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) {
|
| @@ -240,16 +185,6 @@
|
| consumer_sequence_[consumer] = gesture_sequence;
|
| }
|
| return gesture_sequence;
|
| -}
|
| -
|
| -GestureProviderAura* GestureRecognizerImpl::GetGestureProviderForConsumer(
|
| - GestureConsumer* consumer) {
|
| - GestureProviderAura* gesture_provider = consumer_gesture_provider_[consumer];
|
| - if (!gesture_provider) {
|
| - gesture_provider = CreateGestureProvider(this);
|
| - consumer_gesture_provider_[consumer] = gesture_provider;
|
| - }
|
| - return gesture_provider;
|
| }
|
|
|
| void GestureRecognizerImpl::SetupTargets(const TouchEvent& event,
|
| @@ -279,55 +214,22 @@
|
| }
|
| }
|
|
|
| -void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) {
|
| - GestureConsumer* consumer = GetTargetForGestureEvent(*event);
|
| - if (consumer) {
|
| - GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer);
|
| - if (helper)
|
| - helper->DispatchGestureEvent(event);
|
| - }
|
| -}
|
| -
|
| GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture(
|
| const TouchEvent& event,
|
| ui::EventResult result,
|
| GestureConsumer* target) {
|
| SetupTargets(event, target);
|
| -
|
| - if (!use_unified_gesture_detector_) {
|
| - GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(target);
|
| - return gesture_sequence->ProcessTouchEventForGesture(event, result);
|
| - } else {
|
| - GestureProviderAura* gesture_provider =
|
| - GetGestureProviderForConsumer(target);
|
| - // TODO(tdresser) - detect gestures eagerly.
|
| - if (!(result & ER_CONSUMED)) {
|
| - if (gesture_provider->OnTouchEvent(event))
|
| - gesture_provider->OnTouchEventAck(result != ER_UNHANDLED);
|
| - }
|
| - return NULL;
|
| - }
|
| + GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(target);
|
| + return gesture_sequence->ProcessTouchEventForGesture(event, result);
|
| }
|
|
|
| bool GestureRecognizerImpl::CleanupStateForConsumer(
|
| GestureConsumer* consumer) {
|
| bool state_cleaned_up = false;
|
| -
|
| - if (!use_unified_gesture_detector_) {
|
| - if (consumer_sequence_.count(consumer)) {
|
| - state_cleaned_up = true;
|
| - delete consumer_sequence_[consumer];
|
| - consumer_sequence_.erase(consumer);
|
| - }
|
| - } 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]);
|
| - consumer_gesture_provider_.erase(consumer);
|
| - }
|
| + if (consumer_sequence_.count(consumer)) {
|
| + state_cleaned_up = true;
|
| + delete consumer_sequence_[consumer];
|
| + consumer_sequence_.erase(consumer);
|
| }
|
|
|
| state_cleaned_up |= RemoveConsumerFromMap(consumer, &touch_id_target_);
|
| @@ -349,11 +251,12 @@
|
| }
|
|
|
| void GestureRecognizerImpl::DispatchPostponedGestureEvent(GestureEvent* event) {
|
| - DispatchGestureEvent(event);
|
| -}
|
| -
|
| -void GestureRecognizerImpl::OnGestureEvent(GestureEvent* event) {
|
| - DispatchGestureEvent(event);
|
| + GestureConsumer* consumer = GetTargetForGestureEvent(*event);
|
| + if (consumer) {
|
| + GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer);
|
| + if (helper)
|
| + helper->DispatchPostponedGestureEvent(event);
|
| + }
|
| }
|
|
|
| GestureEventHelper* GestureRecognizerImpl::FindDispatchHelperForConsumer(
|
|
|