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 |