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/event.h" | 10 #include "ui/base/events/event.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 | 49 |
50 virtual ~MirroredTouchEvent() { | 50 virtual ~MirroredTouchEvent() { |
51 } | 51 } |
52 | 52 |
53 private: | 53 private: |
54 DISALLOW_COPY_AND_ASSIGN(MirroredTouchEvent); | 54 DISALLOW_COPY_AND_ASSIGN(MirroredTouchEvent); |
55 }; | 55 }; |
56 | 56 |
57 class QueuedTouchEvent : public MirroredTouchEvent { | 57 class QueuedTouchEvent : public MirroredTouchEvent { |
58 public: | 58 public: |
59 QueuedTouchEvent(const TouchEvent* real, TouchStatus status) | 59 QueuedTouchEvent(const TouchEvent* real, EventResult result) |
60 : MirroredTouchEvent(real), | 60 : MirroredTouchEvent(real), |
61 status_(status) { | 61 result_(result) { |
62 } | 62 } |
63 | 63 |
64 virtual ~QueuedTouchEvent() { | 64 virtual ~QueuedTouchEvent() { |
65 } | 65 } |
66 | 66 |
67 TouchStatus status() const { return status_; } | 67 EventResult result() const { return result_; } |
68 | 68 |
69 private: | 69 private: |
70 TouchStatus status_; | 70 EventResult result_; |
71 | 71 |
72 DISALLOW_COPY_AND_ASSIGN(QueuedTouchEvent); | 72 DISALLOW_COPY_AND_ASSIGN(QueuedTouchEvent); |
73 }; | 73 }; |
74 | 74 |
75 // A mirrored event, except for the type, which is always ET_TOUCH_CANCELLED. | 75 // A mirrored event, except for the type, which is always ET_TOUCH_CANCELLED. |
76 class CancelledTouchEvent : public MirroredTouchEvent { | 76 class CancelledTouchEvent : public MirroredTouchEvent { |
77 public: | 77 public: |
78 explicit CancelledTouchEvent(const TouchEvent* src) | 78 explicit CancelledTouchEvent(const TouchEvent* src) |
79 : MirroredTouchEvent(src) { | 79 : MirroredTouchEvent(src) { |
80 set_type(ET_TOUCH_CANCELLED); | 80 set_type(ET_TOUCH_CANCELLED); |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 touch_id_target_[event.touch_id()] = NULL; | 251 touch_id_target_[event.touch_id()] = NULL; |
252 } else { | 252 } else { |
253 touch_id_target_[event.touch_id()] = target; | 253 touch_id_target_[event.touch_id()] = target; |
254 if (target) | 254 if (target) |
255 touch_id_target_for_gestures_[event.touch_id()] = target; | 255 touch_id_target_for_gestures_[event.touch_id()] = target; |
256 } | 256 } |
257 } | 257 } |
258 | 258 |
259 GestureSequence::Gestures* GestureRecognizerImpl::AdvanceTouchQueueByOne( | 259 GestureSequence::Gestures* GestureRecognizerImpl::AdvanceTouchQueueByOne( |
260 GestureConsumer* consumer, | 260 GestureConsumer* consumer, |
261 ui::TouchStatus status) { | 261 ui::EventResult result) { |
262 CHECK(event_queue_[consumer]); | 262 CHECK(event_queue_[consumer]); |
263 CHECK(!event_queue_[consumer]->empty()); | 263 CHECK(!event_queue_[consumer]->empty()); |
264 | 264 |
265 ScopedPop pop(event_queue_[consumer]); | 265 ScopedPop pop(event_queue_[consumer]); |
266 TouchEvent* event = event_queue_[consumer]->front(); | 266 TouchEvent* event = event_queue_[consumer]->front(); |
267 GestureSequence* sequence = GetGestureSequenceForConsumer(consumer); | 267 GestureSequence* sequence = GetGestureSequenceForConsumer(consumer); |
268 if (status != ui::TOUCH_STATUS_UNKNOWN && | 268 if (result != ER_UNHANDLED && |
269 event->type() == ui::ET_TOUCH_RELEASED) { | 269 event->type() == ET_TOUCH_RELEASED) { |
270 // A touch release was was processed (e.g. preventDefault()ed by a | 270 // A touch release was was processed (e.g. preventDefault()ed by a |
271 // web-page), but we still need to process a touch cancel. | 271 // web-page), but we still need to process a touch cancel. |
272 CancelledTouchEvent cancelled(event); | 272 CancelledTouchEvent cancelled(event); |
273 return sequence->ProcessTouchEventForGesture(cancelled, | 273 return sequence->ProcessTouchEventForGesture(cancelled, |
274 ui::TOUCH_STATUS_UNKNOWN); | 274 ER_UNHANDLED); |
275 } | 275 } |
276 return sequence->ProcessTouchEventForGesture(*event, status); | 276 return sequence->ProcessTouchEventForGesture(*event, result); |
277 } | 277 } |
278 | 278 |
279 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture( | 279 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture( |
280 const TouchEvent& event, | 280 const TouchEvent& event, |
281 ui::TouchStatus status, | 281 ui::EventResult result, |
282 GestureConsumer* target) { | 282 GestureConsumer* target) { |
283 if (event_queue_[target] && event_queue_[target]->size() > 0) { | 283 if (event_queue_[target] && event_queue_[target]->size() > 0) { |
284 // There are some queued touch-events for this target. Processing |event| | 284 // There are some queued touch-events for this target. Processing |event| |
285 // before those queued events will result in unexpected gestures. So | 285 // before those queued events will result in unexpected gestures. So |
286 // postpone the processing of the events until the queued events have been | 286 // postpone the processing of the events until the queued events have been |
287 // processed. | 287 // processed. |
288 event_queue_[target]->push(new QueuedTouchEvent(&event, status)); | 288 event_queue_[target]->push(new QueuedTouchEvent(&event, result)); |
289 return NULL; | 289 return NULL; |
290 } | 290 } |
291 | 291 |
292 SetupTargets(event, target); | 292 SetupTargets(event, target); |
293 | 293 |
294 GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(target); | 294 GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(target); |
295 return gesture_sequence->ProcessTouchEventForGesture(event, status); | 295 return gesture_sequence->ProcessTouchEventForGesture(event, result); |
296 } | 296 } |
297 | 297 |
298 void GestureRecognizerImpl::QueueTouchEventForGesture(GestureConsumer* consumer, | 298 void GestureRecognizerImpl::QueueTouchEventForGesture(GestureConsumer* consumer, |
299 const TouchEvent& event) { | 299 const TouchEvent& event) { |
300 if (!event_queue_[consumer]) | 300 if (!event_queue_[consumer]) |
301 event_queue_[consumer] = new std::queue<TouchEvent*>(); | 301 event_queue_[consumer] = new std::queue<TouchEvent*>(); |
302 event_queue_[consumer]->push( | 302 event_queue_[consumer]->push( |
303 new QueuedTouchEvent(&event, TOUCH_STATUS_QUEUED)); | 303 new QueuedTouchEvent(&event, ER_ASYNC)); |
304 | 304 |
305 SetupTargets(event, consumer); | 305 SetupTargets(event, consumer); |
306 } | 306 } |
307 | 307 |
308 GestureSequence::Gestures* GestureRecognizerImpl::AdvanceTouchQueue( | 308 GestureSequence::Gestures* GestureRecognizerImpl::AdvanceTouchQueue( |
309 GestureConsumer* consumer, | 309 GestureConsumer* consumer, |
310 bool processed) { | 310 bool processed) { |
311 if (!event_queue_[consumer] || event_queue_[consumer]->empty()) { | 311 if (!event_queue_[consumer] || event_queue_[consumer]->empty()) { |
312 LOG(ERROR) << "Trying to advance an empty gesture queue for " << consumer; | 312 LOG(ERROR) << "Trying to advance an empty gesture queue for " << consumer; |
313 return NULL; | 313 return NULL; |
314 } | 314 } |
315 | 315 |
316 scoped_ptr<GestureSequence::Gestures> gestures( | 316 scoped_ptr<GestureSequence::Gestures> gestures( |
317 AdvanceTouchQueueByOne(consumer, processed ? TOUCH_STATUS_CONTINUE : | 317 AdvanceTouchQueueByOne(consumer, processed ? ER_HANDLED : |
318 TOUCH_STATUS_UNKNOWN)); | 318 ER_UNHANDLED)); |
319 | 319 |
320 // Are there any queued touch-events that should be auto-dequeued? | 320 // Are there any queued touch-events that should be auto-dequeued? |
321 while (!event_queue_[consumer]->empty()) { | 321 while (!event_queue_[consumer]->empty()) { |
322 QueuedTouchEvent* event = | 322 QueuedTouchEvent* event = |
323 static_cast<QueuedTouchEvent*>(event_queue_[consumer]->front()); | 323 static_cast<QueuedTouchEvent*>(event_queue_[consumer]->front()); |
324 if (event->status() == TOUCH_STATUS_QUEUED) | 324 if (event->result() == ER_ASYNC) |
325 break; | 325 break; |
326 | 326 |
327 scoped_ptr<GestureSequence::Gestures> current_gestures( | 327 scoped_ptr<GestureSequence::Gestures> current_gestures( |
328 AdvanceTouchQueueByOne(consumer, event->status())); | 328 AdvanceTouchQueueByOne(consumer, event->result())); |
329 if (current_gestures.get()) { | 329 if (current_gestures.get()) { |
330 if (!gestures.get()) { | 330 if (!gestures.get()) { |
331 gestures.reset(current_gestures.release()); | 331 gestures.reset(current_gestures.release()); |
332 } else { | 332 } else { |
333 gestures->insert(gestures->end(), current_gestures->begin(), | 333 gestures->insert(gestures->end(), current_gestures->begin(), |
334 current_gestures->end()); | 334 current_gestures->end()); |
335 // The gestures in |current_gestures| are now owned by |gestures|. Make | 335 // The gestures in |current_gestures| are now owned by |gestures|. Make |
336 // sure they don't get freed with |current_gestures|. | 336 // sure they don't get freed with |current_gestures|. |
337 current_gestures->weak_clear(); | 337 current_gestures->weak_clear(); |
338 } | 338 } |
(...skipping 17 matching lines...) Expand all Loading... |
356 RemoveConsumerFromMap(consumer, &touch_id_target_); | 356 RemoveConsumerFromMap(consumer, &touch_id_target_); |
357 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_); | 357 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_); |
358 } | 358 } |
359 | 359 |
360 // GestureRecognizer, static | 360 // GestureRecognizer, static |
361 GestureRecognizer* GestureRecognizer::Create(GestureEventHelper* helper) { | 361 GestureRecognizer* GestureRecognizer::Create(GestureEventHelper* helper) { |
362 return new GestureRecognizerImpl(helper); | 362 return new GestureRecognizerImpl(helper); |
363 } | 363 } |
364 | 364 |
365 } // namespace ui | 365 } // namespace ui |
OLD | NEW |