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

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: change after removing the old gesture Created 6 years, 3 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
« no previous file with comments | « ui/events/gestures/gesture_recognizer_impl.h ('k') | no next file » | 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/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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 125
126 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer, 126 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer,
127 GestureConsumer* new_consumer) { 127 GestureConsumer* new_consumer) {
128 // Send cancel to all those save |new_consumer| and |current_consumer|. 128 // Send cancel to all those save |new_consumer| and |current_consumer|.
129 // Don't send a cancel to |current_consumer|, unless |new_consumer| is NULL. 129 // Don't send a cancel to |current_consumer|, unless |new_consumer| is NULL.
130 // Dispatching a touch-cancel event can end up altering |touch_id_target_| 130 // Dispatching a touch-cancel event can end up altering |touch_id_target_|
131 // (e.g. when the target of the event is destroyed, causing it to be removed 131 // (e.g. when the target of the event is destroyed, causing it to be removed
132 // from |touch_id_target_| in |CleanupStateForConsumer()|). So create a list 132 // from |touch_id_target_| in |CleanupStateForConsumer()|). So create a list
133 // of the touch-ids that need to be cancelled, and dispatch the cancel events 133 // of the touch-ids that need to be cancelled, and dispatch the cancel events
134 // for them at the end. 134 // for them at the end.
135 std::vector<std::pair<int, GestureConsumer*> > ids; 135
136 for (TouchIdToConsumerMap::iterator i = touch_id_target_.begin(); 136 std::vector<GestureConsumer*> consumers;
137 i != touch_id_target_.end(); ++i) { 137 std::map<GestureConsumer*, GestureProviderAura*>::iterator i;
138 if (i->second && i->second != new_consumer && 138 for (i = consumer_gesture_provider_.begin();
139 (i->second != current_consumer || new_consumer == NULL) && 139 i != consumer_gesture_provider_.end();
140 i->second) { 140 ++i) {
141 ids.push_back(std::make_pair(i->first, i->second)); 141 if (i->first && i->first != new_consumer &&
142 (i->first != current_consumer || new_consumer == NULL)) {
143 consumers.push_back(i->first);
142 } 144 }
143 } 145 }
144 146 for (std::vector<GestureConsumer*>::iterator iter = consumers.begin();
145 CancelTouches(&ids); 147 iter != consumers.end();
146 148 ++iter) {
149 CancelActiveTouches(*iter);
150 }
147 // Transfer events from |current_consumer| to |new_consumer|. 151 // Transfer events from |current_consumer| to |new_consumer|.
148 if (current_consumer && new_consumer) { 152 if (current_consumer && new_consumer) {
149 TransferTouchIdToConsumerMap(current_consumer, new_consumer, 153 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
150 &touch_id_target_); 154 &touch_id_target_);
151 TransferTouchIdToConsumerMap(current_consumer, new_consumer, 155 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
152 &touch_id_target_for_gestures_); 156 &touch_id_target_for_gestures_);
153 TransferConsumer( 157 TransferConsumer(
154 current_consumer, new_consumer, &consumer_gesture_provider_); 158 current_consumer, new_consumer, &consumer_gesture_provider_);
155 } 159 }
156 } 160 }
157 161
158 bool GestureRecognizerImpl::GetLastTouchPointForTarget( 162 bool GestureRecognizerImpl::GetLastTouchPointForTarget(
159 GestureConsumer* consumer, 163 GestureConsumer* consumer,
160 gfx::PointF* point) { 164 gfx::PointF* point) {
161 if (consumer_gesture_provider_.count(consumer) == 0) 165 if (consumer_gesture_provider_.count(consumer) == 0)
162 return false; 166 return false;
163 const MotionEvent& pointer_state = 167 const MotionEvent& pointer_state =
164 consumer_gesture_provider_[consumer]->pointer_state(); 168 consumer_gesture_provider_[consumer]->pointer_state();
165 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY()); 169 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY());
166 return true; 170 return true;
167 } 171 }
168 172
169 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) { 173 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) {
170 std::vector<std::pair<int, GestureConsumer*> > ids; 174 bool cancelled_touch = false;
171 for (TouchIdToConsumerMap::const_iterator i = touch_id_target_.begin(); 175 if (consumer_gesture_provider_.count(consumer) == 0)
172 i != touch_id_target_.end(); ++i) { 176 return false;
173 if (i->second == consumer) 177 const MotionEventAura& pointer_state =
jdduke (slow) 2014/08/26 23:22:24 Could the referenced MotionEventAura be mutated by
tdresser 2014/08/27 13:07:09 I think there is a risk of the MotionEventAura bei
174 ids.push_back(std::make_pair(i->first, i->second)); 178 consumer_gesture_provider_[consumer]->pointer_state();
179 size_t count = pointer_state.GetPointerCount();
180 for (size_t i = 0; i < count; ++i) {
181 gfx::PointF point(pointer_state.GetX(i), pointer_state.GetY(i));
182 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED,
183 point,
184 ui::EF_IS_SYNTHESIZED,
185 pointer_state.GetPointerId(i),
186 ui::EventTimeForNow(),
187 0.0f,
188 0.0f,
189 0.0f,
190 0.0f);
191 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer);
192 if (helper)
193 helper->DispatchCancelTouchEvent(&touch_event);
194 cancelled_touch = true;
175 } 195 }
176 bool cancelled_touch = !ids.empty();
177 CancelTouches(&ids);
178 return cancelled_touch; 196 return cancelled_touch;
179 } 197 }
180 198
181 //////////////////////////////////////////////////////////////////////////////// 199 ////////////////////////////////////////////////////////////////////////////////
182 // GestureRecognizerImpl, private: 200 // GestureRecognizerImpl, private:
183 201
184 GestureProviderAura* GestureRecognizerImpl::GetGestureProviderForConsumer( 202 GestureProviderAura* GestureRecognizerImpl::GetGestureProviderForConsumer(
185 GestureConsumer* consumer) { 203 GestureConsumer* consumer) {
186 GestureProviderAura* gesture_provider = consumer_gesture_provider_[consumer]; 204 GestureProviderAura* gesture_provider = consumer_gesture_provider_[consumer];
187 if (!gesture_provider) { 205 if (!gesture_provider) {
188 gesture_provider = CreateGestureProvider(this); 206 gesture_provider = CreateGestureProvider(this);
189 consumer_gesture_provider_[consumer] = gesture_provider; 207 consumer_gesture_provider_[consumer] = gesture_provider;
190 } 208 }
191 return gesture_provider; 209 return gesture_provider;
192 } 210 }
193 211
194 void GestureRecognizerImpl::SetupTargets(const TouchEvent& event, 212 void GestureRecognizerImpl::SetupTargets(const TouchEvent& event,
195 GestureConsumer* target) { 213 GestureConsumer* target) {
196 if (event.type() == ui::ET_TOUCH_RELEASED || 214 if (event.type() == ui::ET_TOUCH_RELEASED ||
197 event.type() == ui::ET_TOUCH_CANCELLED) { 215 event.type() == ui::ET_TOUCH_CANCELLED) {
198 touch_id_target_.erase(event.touch_id()); 216 touch_id_target_.erase(event.touch_id());
199 } else if (event.type() == ui::ET_TOUCH_PRESSED) { 217 } else if (event.type() == ui::ET_TOUCH_PRESSED) {
200 touch_id_target_[event.touch_id()] = target; 218 touch_id_target_[event.touch_id()] = target;
201 if (target) 219 if (target)
202 touch_id_target_for_gestures_[event.touch_id()] = target; 220 touch_id_target_for_gestures_[event.touch_id()] = target;
203 } 221 }
204 } 222 }
205 223
206 void GestureRecognizerImpl::CancelTouches(
207 std::vector<std::pair<int, GestureConsumer*> >* touches) {
208 while (!touches->empty()) {
209 int touch_id = touches->begin()->first;
210 GestureConsumer* target = touches->begin()->second;
211 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, gfx::PointF(0, 0),
212 ui::EF_IS_SYNTHESIZED, touch_id,
213 ui::EventTimeForNow(), 0.0f, 0.0f, 0.0f, 0.0f);
214 GestureEventHelper* helper = FindDispatchHelperForConsumer(target);
215 if (helper)
216 helper->DispatchCancelTouchEvent(&touch_event);
217 touches->erase(touches->begin());
218 }
219 }
220
221 void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) { 224 void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) {
222 GestureConsumer* consumer = GetTargetForGestureEvent(*event); 225 GestureConsumer* consumer = GetTargetForGestureEvent(*event);
223 if (consumer) { 226 if (consumer) {
224 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer); 227 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer);
225 if (helper) 228 if (helper)
226 helper->DispatchGestureEvent(event); 229 helper->DispatchGestureEvent(event);
227 } 230 }
228 } 231 }
229 232
230 bool GestureRecognizerImpl::ProcessTouchEventPreDispatch( 233 bool GestureRecognizerImpl::ProcessTouchEventPreDispatch(
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 std::vector<GestureEventHelper*>::iterator it; 335 std::vector<GestureEventHelper*>::iterator it;
333 for (it = helpers.begin(); it != helpers.end(); ++it) 336 for (it = helpers.begin(); it != helpers.end(); ++it)
334 gesture_recognizer->AddGestureEventHelper(*it); 337 gesture_recognizer->AddGestureEventHelper(*it);
335 338
336 helpers.clear(); 339 helpers.clear();
337 g_gesture_recognizer_instance = 340 g_gesture_recognizer_instance =
338 static_cast<GestureRecognizerImpl*>(gesture_recognizer); 341 static_cast<GestureRecognizerImpl*>(gesture_recognizer);
339 } 342 }
340 343
341 } // namespace ui 344 } // namespace ui
OLDNEW
« no previous file with comments | « 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