Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1568)

Side by Side Diff: ui/base/gestures/gesture_recognizer_impl.cc

Issue 10964051: events: Clean up dispatching code for touch-events. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/base/gestures/gesture_recognizer_impl.h ('k') | ui/base/gestures/gesture_sequence.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « ui/base/gestures/gesture_recognizer_impl.h ('k') | ui/base/gestures/gesture_sequence.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698