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

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

Issue 469523003: Add the actual location coordinates to the touch cancel event (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: canceling the touch points from GestureConsumer Created 6 years, 4 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
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/events/gestures/gesture_recognizer_impl.h" 5 #include "ui/events/gestures/gesture_recognizer_impl.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 158
159 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer, 159 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer,
160 GestureConsumer* new_consumer) { 160 GestureConsumer* new_consumer) {
161 // Send cancel to all those save |new_consumer| and |current_consumer|. 161 // Send cancel to all those save |new_consumer| and |current_consumer|.
162 // Don't send a cancel to |current_consumer|, unless |new_consumer| is NULL. 162 // Don't send a cancel to |current_consumer|, unless |new_consumer| is NULL.
163 // Dispatching a touch-cancel event can end up altering |touch_id_target_| 163 // Dispatching a touch-cancel event can end up altering |touch_id_target_|
164 // (e.g. when the target of the event is destroyed, causing it to be removed 164 // (e.g. when the target of the event is destroyed, causing it to be removed
165 // from |touch_id_target_| in |CleanupStateForConsumer()|). So create a list 165 // from |touch_id_target_| in |CleanupStateForConsumer()|). So create a list
166 // of the touch-ids that need to be cancelled, and dispatch the cancel events 166 // of the touch-ids that need to be cancelled, and dispatch the cancel events
167 // for them at the end. 167 // for them at the end.
168 std::vector<std::pair<int, GestureConsumer*> > ids; 168 std::set<GestureConsumer*> consumers;
tdresser 2014/08/15 14:22:05 Just use a vector, set has a lot more overhead.
lanwei 2014/08/27 03:54:03 Done.
169 for (TouchIdToConsumerMap::iterator i = touch_id_target_.begin(); 169 for (TouchIdToConsumerMap::iterator i = touch_id_target_.begin();
170 i != touch_id_target_.end(); ++i) { 170 i != touch_id_target_.end(); ++i) {
171 if (i->second && i->second != new_consumer && 171 if (i->second && i->second != new_consumer &&
172 (i->second != current_consumer || new_consumer == NULL) && 172 (i->second != current_consumer || new_consumer == NULL)) {
173 i->second) { 173 consumers.insert(i->second);
174 ids.push_back(std::make_pair(i->first, i->second));
175 } 174 }
176 } 175 }
177 176 for (std::set<GestureConsumer*>::iterator iter = consumers.begin();
178 CancelTouches(&ids); 177 iter != consumers.end(); ++iter) {
179 178 CancelActiveTouches(*iter);
179 }
180 // Transfer events from |current_consumer| to |new_consumer|. 180 // Transfer events from |current_consumer| to |new_consumer|.
181 if (current_consumer && new_consumer) { 181 if (current_consumer && new_consumer) {
182 TransferTouchIdToConsumerMap(current_consumer, new_consumer, 182 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
183 &touch_id_target_); 183 &touch_id_target_);
184 TransferTouchIdToConsumerMap(current_consumer, new_consumer, 184 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
185 &touch_id_target_for_gestures_); 185 &touch_id_target_for_gestures_);
186 if (!use_unified_gesture_detector_) 186 if (!use_unified_gesture_detector_)
187 TransferConsumer(current_consumer, new_consumer, &consumer_sequence_); 187 TransferConsumer(current_consumer, new_consumer, &consumer_sequence_);
188 else 188 else
189 TransferConsumer( 189 TransferConsumer(
(...skipping 13 matching lines...) Expand all
203 if (consumer_gesture_provider_.count(consumer) == 0) 203 if (consumer_gesture_provider_.count(consumer) == 0)
204 return false; 204 return false;
205 const MotionEvent& pointer_state = 205 const MotionEvent& pointer_state =
206 consumer_gesture_provider_[consumer]->pointer_state(); 206 consumer_gesture_provider_[consumer]->pointer_state();
207 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY()); 207 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY());
208 return true; 208 return true;
209 } 209 }
210 } 210 }
211 211
212 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) { 212 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) {
213 std::vector<std::pair<int, GestureConsumer*> > ids; 213 bool cancelled_touch = false;
214 for (TouchIdToConsumerMap::const_iterator i = touch_id_target_.begin(); 214 if (use_unified_gesture_detector_) {
215 i != touch_id_target_.end(); ++i) { 215 if(consumer_gesture_provider_.count(consumer) == 0)
216 if (i->second == consumer) 216 return false;
217 ids.push_back(std::make_pair(i->first, i->second)); 217 const MotionEventAura& pointer_state =
218 consumer_gesture_provider_[consumer]->pointer_state();
219 size_t count = pointer_state.GetPointerCount();
220 for (size_t i = 0; i < count; ++i) {
221 gfx::PointF point(pointer_state.GetX(i), pointer_state.GetY(i));
222 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, point,
223 ui::EF_IS_SYNTHESIZED,
224 pointer_state.GetPointerId(i),
225 ui::EventTimeForNow(),
226 0.0f, 0.0f, 0.0f, 0.0f);
227 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer);
228 if (helper)
229 helper->DispatchCancelTouchEvent(&touch_event);
230 cancelled_touch = true;
231 }
218 } 232 }
219 bool cancelled_touch = !ids.empty();
220 CancelTouches(&ids);
221 return cancelled_touch; 233 return cancelled_touch;
222 } 234 }
223 235
224 //////////////////////////////////////////////////////////////////////////////// 236 ////////////////////////////////////////////////////////////////////////////////
225 // GestureRecognizerImpl, protected: 237 // GestureRecognizerImpl, protected:
226 238
227 GestureSequence* GestureRecognizerImpl::CreateSequence( 239 GestureSequence* GestureRecognizerImpl::CreateSequence(
228 GestureSequenceDelegate* delegate) { 240 GestureSequenceDelegate* delegate) {
229 return new GestureSequence(delegate); 241 return new GestureSequence(delegate);
230 } 242 }
(...skipping 26 matching lines...) Expand all
257 if (event.type() == ui::ET_TOUCH_RELEASED || 269 if (event.type() == ui::ET_TOUCH_RELEASED ||
258 event.type() == ui::ET_TOUCH_CANCELLED) { 270 event.type() == ui::ET_TOUCH_CANCELLED) {
259 touch_id_target_.erase(event.touch_id()); 271 touch_id_target_.erase(event.touch_id());
260 } else if (event.type() == ui::ET_TOUCH_PRESSED) { 272 } else if (event.type() == ui::ET_TOUCH_PRESSED) {
261 touch_id_target_[event.touch_id()] = target; 273 touch_id_target_[event.touch_id()] = target;
262 if (target) 274 if (target)
263 touch_id_target_for_gestures_[event.touch_id()] = target; 275 touch_id_target_for_gestures_[event.touch_id()] = target;
264 } 276 }
265 } 277 }
266 278
267 void GestureRecognizerImpl::CancelTouches(
268 std::vector<std::pair<int, GestureConsumer*> >* touches) {
269 while (!touches->empty()) {
270 int touch_id = touches->begin()->first;
271 GestureConsumer* target = touches->begin()->second;
272 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, gfx::PointF(0, 0),
273 ui::EF_IS_SYNTHESIZED, touch_id,
274 ui::EventTimeForNow(), 0.0f, 0.0f, 0.0f, 0.0f);
275 GestureEventHelper* helper = FindDispatchHelperForConsumer(target);
276 if (helper)
277 helper->DispatchCancelTouchEvent(&touch_event);
278 touches->erase(touches->begin());
279 }
280 }
281
282 void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) { 279 void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) {
283 GestureConsumer* consumer = GetTargetForGestureEvent(*event); 280 GestureConsumer* consumer = GetTargetForGestureEvent(*event);
284 if (consumer) { 281 if (consumer) {
285 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer); 282 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer);
286 if (helper) 283 if (helper)
287 helper->DispatchGestureEvent(event); 284 helper->DispatchGestureEvent(event);
288 } 285 }
289 } 286 }
290 287
291 bool GestureRecognizerImpl::ProcessTouchEventPreDispatch( 288 bool GestureRecognizerImpl::ProcessTouchEventPreDispatch(
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 std::vector<GestureEventHelper*>::iterator it; 417 std::vector<GestureEventHelper*>::iterator it;
421 for (it = helpers.begin(); it != helpers.end(); ++it) 418 for (it = helpers.begin(); it != helpers.end(); ++it)
422 gesture_recognizer->AddGestureEventHelper(*it); 419 gesture_recognizer->AddGestureEventHelper(*it);
423 420
424 helpers.clear(); 421 helpers.clear();
425 g_gesture_recognizer_instance = 422 g_gesture_recognizer_instance =
426 static_cast<GestureRecognizerImpl*>(gesture_recognizer); 423 static_cast<GestureRecognizerImpl*>(gesture_recognizer);
427 } 424 }
428 425
429 } // namespace ui 426 } // namespace ui
OLDNEW
« ui/events/gestures/gesture_recognizer_impl.h ('K') | « ui/events/gestures/gesture_recognizer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698