Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/base/gestures/gesture_recognizer_impl.h" | 5 #include "ui/base/gestures/gesture_recognizer_impl.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/time.h" | 9 #include "base/time.h" |
| 10 #include "ui/base/events.h" | 10 #include "ui/base/events.h" |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 130 template <typename T> | 130 template <typename T> |
| 131 void TransferConsumer(GestureConsumer* current_consumer, | 131 void TransferConsumer(GestureConsumer* current_consumer, |
| 132 GestureConsumer* new_consumer, | 132 GestureConsumer* new_consumer, |
| 133 std::map<GestureConsumer*, T>* map) { | 133 std::map<GestureConsumer*, T>* map) { |
| 134 if (map->count(current_consumer)) { | 134 if (map->count(current_consumer)) { |
| 135 (*map)[new_consumer] = (*map)[current_consumer]; | 135 (*map)[new_consumer] = (*map)[current_consumer]; |
| 136 map->erase(current_consumer); | 136 map->erase(current_consumer); |
| 137 } | 137 } |
| 138 } | 138 } |
| 139 | 139 |
| 140 template <typename T> | |
| 141 void TransferConsumer(GestureConsumer* current_consumer, | |
| 142 GestureConsumer* new_consumer, | |
| 143 std::map<GestureConsumer*, scoped_ptr<T>>* map) { | |
| 144 if (map->count(current_consumer)) { | |
| 145 (*map)[new_consumer].swap((*map)[current_consumer]); | |
| 146 map->erase(current_consumer); | |
|
girard
2012/08/02 17:14:20
Partial template specialization (from generic Tran
| |
| 147 } | |
| 148 } | |
| 149 | |
| 140 void RemoveConsumerFromMap(GestureConsumer* consumer, | 150 void RemoveConsumerFromMap(GestureConsumer* consumer, |
| 141 GestureRecognizerImpl::TouchIdToConsumerMap* map) { | 151 GestureRecognizerImpl::TouchIdToConsumerMap* map) { |
| 142 for (GestureRecognizerImpl::TouchIdToConsumerMap::iterator i = map->begin(); | 152 for (GestureRecognizerImpl::TouchIdToConsumerMap::iterator i = map->begin(); |
| 143 i != map->end();) { | 153 i != map->end();) { |
| 144 if (i->second == consumer) | 154 if (i->second == consumer) |
| 145 map->erase(i++); | 155 map->erase(i++); |
| 146 else | 156 else |
| 147 ++i; | 157 ++i; |
| 148 } | 158 } |
| 149 } | 159 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 184 GestureConsumer* target = NULL; | 194 GestureConsumer* target = NULL; |
| 185 int touch_id = event->GetLowestTouchId(); | 195 int touch_id = event->GetLowestTouchId(); |
| 186 target = touch_id_target_for_gestures_[touch_id]; | 196 target = touch_id_target_for_gestures_[touch_id]; |
| 187 return target; | 197 return target; |
| 188 } | 198 } |
| 189 | 199 |
| 190 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation( | 200 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation( |
| 191 const gfx::Point& location) { | 201 const gfx::Point& location) { |
| 192 const GesturePoint* closest_point = NULL; | 202 const GesturePoint* closest_point = NULL; |
| 193 int closest_distance_squared = 0; | 203 int closest_distance_squared = 0; |
| 194 std::map<GestureConsumer*, GestureSequence*>::iterator i; | 204 std::map<GestureConsumer*, scoped_ptr<GestureSequence>>::iterator i; |
| 195 for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) { | 205 for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) { |
| 196 const GesturePoint* points = i->second->points(); | 206 const GesturePoint* points = i->second->points(); |
| 197 for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) { | 207 for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) { |
| 198 if (!points[j].in_use()) | 208 if (!points[j].in_use()) |
| 199 continue; | 209 continue; |
| 200 gfx::Point delta = | 210 gfx::Point delta = |
| 201 points[j].last_touch_position().Subtract(location); | 211 points[j].last_touch_position().Subtract(location); |
| 202 int distance = delta.x() * delta.x() + delta.y() * delta.y(); | 212 int distance = delta.x() * delta.x() + delta.y() * delta.y(); |
| 203 if (!closest_point || distance < closest_distance_squared) { | 213 if (!closest_point || distance < closest_distance_squared) { |
| 204 closest_point = &points[j]; | 214 closest_point = &points[j]; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 261 GestureSequence* GestureRecognizerImpl::CreateSequence( | 271 GestureSequence* GestureRecognizerImpl::CreateSequence( |
| 262 GestureEventHelper* helper) { | 272 GestureEventHelper* helper) { |
| 263 return new GestureSequence(helper); | 273 return new GestureSequence(helper); |
| 264 } | 274 } |
| 265 | 275 |
| 266 //////////////////////////////////////////////////////////////////////////////// | 276 //////////////////////////////////////////////////////////////////////////////// |
| 267 // GestureRecognizerImpl, private: | 277 // GestureRecognizerImpl, private: |
| 268 | 278 |
| 269 GestureSequence* GestureRecognizerImpl::GetGestureSequenceForConsumer( | 279 GestureSequence* GestureRecognizerImpl::GetGestureSequenceForConsumer( |
| 270 GestureConsumer* consumer) { | 280 GestureConsumer* consumer) { |
| 271 GestureSequence* gesture_sequence = consumer_sequence_[consumer]; | 281 GestureSequence* gesture_sequence = consumer_sequence_[consumer].get(); |
| 272 if (!gesture_sequence) { | 282 if (!gesture_sequence) { |
| 273 gesture_sequence = CreateSequence(helper_); | 283 gesture_sequence = CreateSequence(helper_); |
| 274 consumer_sequence_[consumer] = gesture_sequence; | 284 consumer_sequence_[consumer].reset(gesture_sequence); |
| 275 } | 285 } |
| 276 return gesture_sequence; | 286 return gesture_sequence; |
| 277 } | 287 } |
| 278 | 288 |
| 279 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture( | 289 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture( |
| 280 const TouchEvent& event, | 290 const TouchEvent& event, |
| 281 ui::TouchStatus status, | 291 ui::TouchStatus status, |
| 282 GestureConsumer* target) { | 292 GestureConsumer* target) { |
| 283 if (event.GetEventType() == ui::ET_TOUCH_RELEASED || | 293 if (event.GetEventType() == ui::ET_TOUCH_RELEASED || |
| 284 event.GetEventType() == ui::ET_TOUCH_CANCELLED) { | 294 event.GetEventType() == ui::ET_TOUCH_CANCELLED) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 320 return sequence->ProcessTouchEventForGesture(cancelled, | 330 return sequence->ProcessTouchEventForGesture(cancelled, |
| 321 ui::TOUCH_STATUS_UNKNOWN); | 331 ui::TOUCH_STATUS_UNKNOWN); |
| 322 } | 332 } |
| 323 | 333 |
| 324 return sequence->ProcessTouchEventForGesture( | 334 return sequence->ProcessTouchEventForGesture( |
| 325 *event, | 335 *event, |
| 326 processed ? ui::TOUCH_STATUS_CONTINUE : ui::TOUCH_STATUS_UNKNOWN); | 336 processed ? ui::TOUCH_STATUS_CONTINUE : ui::TOUCH_STATUS_UNKNOWN); |
| 327 } | 337 } |
| 328 | 338 |
| 329 void GestureRecognizerImpl::FlushTouchQueue(GestureConsumer* consumer) { | 339 void GestureRecognizerImpl::FlushTouchQueue(GestureConsumer* consumer) { |
| 330 if (consumer_sequence_.count(consumer)) { | 340 if (consumer_sequence_.count(consumer)) |
| 331 delete consumer_sequence_[consumer]; | |
| 332 consumer_sequence_.erase(consumer); | 341 consumer_sequence_.erase(consumer); |
| 333 } | |
| 334 | 342 |
| 335 if (event_queue_.count(consumer)) { | 343 if (event_queue_.count(consumer)) { |
| 336 delete event_queue_[consumer]; | 344 delete event_queue_[consumer]; |
| 337 event_queue_.erase(consumer); | 345 event_queue_.erase(consumer); |
|
sadrul
2012/08/02 18:29:55
Perhaps we need to do the same for event_queue_ to
girard
2012/08/02 19:33:54
That makes sense. I've updated the CL (second pat
| |
| 338 } | 346 } |
| 339 | 347 |
| 340 RemoveConsumerFromMap(consumer, &touch_id_target_); | 348 RemoveConsumerFromMap(consumer, &touch_id_target_); |
| 341 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_); | 349 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_); |
| 342 } | 350 } |
| 343 | 351 |
| 344 // GestureRecognizer, static | 352 // GestureRecognizer, static |
| 345 GestureRecognizer* GestureRecognizer::Create(GestureEventHelper* helper) { | 353 GestureRecognizer* GestureRecognizer::Create(GestureEventHelper* helper) { |
| 346 return new GestureRecognizerImpl(helper); | 354 return new GestureRecognizerImpl(helper); |
| 347 } | 355 } |
| 348 | 356 |
| 349 } // namespace ui | 357 } // namespace ui |
| OLD | NEW |