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 2f23b794cb1ce059096aea212ef7ad83a362e2c0..4fd74f215d9caa6a32cb60bd71ad5617f6414384 100644 |
--- a/ui/events/gestures/gesture_recognizer_impl.cc |
+++ b/ui/events/gestures/gesture_recognizer_impl.cc |
@@ -15,7 +15,7 @@ |
#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/gesture_detection/gesture_configuration.h" |
#include "ui/events/gestures/gesture_types.h" |
namespace ui { |
@@ -83,16 +83,20 @@ GestureConsumer* GestureRecognizerImpl::GetTouchLockedTarget( |
GestureConsumer* GestureRecognizerImpl::GetTargetForGestureEvent( |
const GestureEvent& event) { |
- GestureConsumer* target = NULL; |
int touch_id = event.details().oldest_touch_id(); |
- target = touch_id_target_for_gestures_[touch_id]; |
- return target; |
+ if (!touch_id_target_for_gestures_.count(touch_id)) { |
+ NOTREACHED() << "Touch ID does not map to a valid GestureConsumer."; |
+ return nullptr; |
+ } |
+ |
+ return touch_id_target_for_gestures_.at(touch_id); |
} |
GestureConsumer* GestureRecognizerImpl::GetTargetForLocation( |
const gfx::PointF& location, int source_device_id) { |
const float max_distance = |
- GestureConfiguration::max_separation_for_gesture_touches_in_pixels(); |
+ GestureConfiguration::GetInstance() |
+ ->max_separation_for_gesture_touches_in_pixels(); |
gfx::PointF closest_point; |
int closest_touch_id = 0; |
@@ -123,40 +127,27 @@ GestureConsumer* GestureRecognizerImpl::GetTargetForLocation( |
return NULL; |
} |
+void GestureRecognizerImpl::CancelActiveTouchesExcept( |
+ GestureConsumer* not_cancelled) { |
+ for (const auto& consumer_provider : consumer_gesture_provider_) { |
+ if (consumer_provider.first == not_cancelled) |
+ continue; |
+ CancelActiveTouches(consumer_provider.first); |
+ } |
+} |
+ |
void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer, |
GestureConsumer* new_consumer) { |
- // Send cancel to all those save |new_consumer| and |current_consumer|. |
- // Don't send a cancel to |current_consumer|, unless |new_consumer| is NULL. |
- // Dispatching a touch-cancel event can end up altering |touch_id_target_| |
- // (e.g. when the target of the event is destroyed, causing it to be removed |
- // from |touch_id_target_| in |CleanupStateForConsumer()|). So create a list |
- // of the touch-ids that need to be cancelled, and dispatch the cancel events |
- // for them at the end. |
- |
- std::vector<GestureConsumer*> consumers; |
- std::map<GestureConsumer*, GestureProviderImpl*>::iterator i; |
- for (i = consumer_gesture_provider_.begin(); |
- i != consumer_gesture_provider_.end(); |
- ++i) { |
- if (i->first && i->first != new_consumer && |
- (i->first != current_consumer || new_consumer == NULL)) { |
- consumers.push_back(i->first); |
- } |
- } |
- for (std::vector<GestureConsumer*>::iterator iter = consumers.begin(); |
- iter != consumers.end(); |
- ++iter) { |
- CancelActiveTouches(*iter); |
- } |
- // Transfer events from |current_consumer| to |new_consumer|. |
- if (current_consumer && new_consumer) { |
- TransferTouchIdToConsumerMap(current_consumer, new_consumer, |
- &touch_id_target_); |
- TransferTouchIdToConsumerMap(current_consumer, new_consumer, |
- &touch_id_target_for_gestures_); |
- TransferConsumer( |
- current_consumer, new_consumer, &consumer_gesture_provider_); |
- } |
+ DCHECK(current_consumer); |
+ DCHECK(new_consumer); |
+ |
+ CancelActiveTouchesExcept(current_consumer); |
+ |
+ TransferTouchIdToConsumerMap(current_consumer, new_consumer, |
+ &touch_id_target_); |
+ TransferTouchIdToConsumerMap(current_consumer, new_consumer, |
+ &touch_id_target_for_gestures_); |
+ TransferConsumer(current_consumer, new_consumer, &consumer_gesture_provider_); |
} |
bool GestureRecognizerImpl::GetLastTouchPointForTarget( |
@@ -178,7 +169,7 @@ bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) { |
consumer_gesture_provider_[consumer]->pointer_state(); |
if (pointer_state.GetPointerCount() == 0) |
return false; |
- // Pointer_state is modified every time after DispatchCancelTouchEvent. |
+ // pointer_state is modified every time after DispatchCancelTouchEvent. |
scoped_ptr<MotionEvent> pointer_state_clone = pointer_state.Clone(); |
for (size_t i = 0; i < pointer_state_clone->GetPointerCount(); ++i) { |
gfx::PointF point(pointer_state_clone->GetX(i), |
@@ -235,11 +226,11 @@ void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) { |
} |
bool GestureRecognizerImpl::ProcessTouchEventPreDispatch( |
- const TouchEvent& event, |
+ TouchEvent* event, |
GestureConsumer* consumer) { |
- SetupTargets(event, consumer); |
+ SetupTargets(*event, consumer); |
- if (event.result() & ER_CONSUMED) |
+ if (event->result() & ER_CONSUMED) |
return false; |
GestureProviderImpl* gesture_provider = |
@@ -247,26 +238,13 @@ bool GestureRecognizerImpl::ProcessTouchEventPreDispatch( |
return gesture_provider->OnTouchEvent(event); |
} |
-GestureRecognizer::Gestures* |
-GestureRecognizerImpl::ProcessTouchEventPostDispatch( |
- const TouchEvent& event, |
- ui::EventResult result, |
- GestureConsumer* consumer) { |
- GestureProviderImpl* gesture_provider = |
- GetGestureProviderForConsumer(consumer); |
- gesture_provider->OnTouchEventAck(result != ER_UNHANDLED); |
- return gesture_provider->GetAndResetPendingGestures(); |
-} |
- |
-GestureRecognizer::Gestures* GestureRecognizerImpl::ProcessTouchEventOnAsyncAck( |
- const TouchEvent& event, |
+GestureRecognizer::Gestures* GestureRecognizerImpl::AckTouchEvent( |
+ uint32 unique_event_id, |
ui::EventResult result, |
GestureConsumer* consumer) { |
- if (result & ui::ER_CONSUMED) |
- return NULL; |
GestureProviderImpl* gesture_provider = |
GetGestureProviderForConsumer(consumer); |
- gesture_provider->OnTouchEventAck(result != ER_UNHANDLED); |
+ gesture_provider->OnTouchEventAck(unique_event_id, result != ER_UNHANDLED); |
return gesture_provider->GetAndResetPendingGestures(); |
} |