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

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

Issue 251543003: Unified Gesture Recognizer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address jdduke comments. Created 6 years, 7 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
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>
8
9 #include "base/command_line.h"
7 #include "base/logging.h" 10 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_loop.h"
9 #include "base/time/time.h" 13 #include "base/time/time.h"
10 #include "ui/events/event.h" 14 #include "ui/events/event.h"
11 #include "ui/events/event_constants.h" 15 #include "ui/events/event_constants.h"
16 #include "ui/events/event_switches.h"
12 #include "ui/events/event_utils.h" 17 #include "ui/events/event_utils.h"
13 #include "ui/events/gestures/gesture_configuration.h" 18 #include "ui/events/gestures/gesture_configuration.h"
14 #include "ui/events/gestures/gesture_sequence.h" 19 #include "ui/events/gestures/gesture_sequence.h"
15 #include "ui/events/gestures/gesture_types.h" 20 #include "ui/events/gestures/gesture_types.h"
16 21
17 namespace ui { 22 namespace ui {
18 23
19 namespace { 24 namespace {
20 25
21 template <typename T> 26 template <typename T>
(...skipping 25 matching lines...) Expand all
47 GestureConsumer* old_consumer, 52 GestureConsumer* old_consumer,
48 GestureConsumer* new_consumer, 53 GestureConsumer* new_consumer,
49 GestureRecognizerImpl::TouchIdToConsumerMap* map) { 54 GestureRecognizerImpl::TouchIdToConsumerMap* map) {
50 for (GestureRecognizerImpl::TouchIdToConsumerMap::iterator i = map->begin(); 55 for (GestureRecognizerImpl::TouchIdToConsumerMap::iterator i = map->begin();
51 i != map->end(); ++i) { 56 i != map->end(); ++i) {
52 if (i->second == old_consumer) 57 if (i->second == old_consumer)
53 i->second = new_consumer; 58 i->second = new_consumer;
54 } 59 }
55 } 60 }
56 61
62 GestureProviderAura* CreateGestureProvider(GestureProviderAuraClient* client) {
63 return new GestureProviderAura(client);
64 }
65
66 void DeleteGestureProvider(GestureProviderAura* provider) {
67 delete provider;
68 }
69
57 } // namespace 70 } // namespace
58 71
59 //////////////////////////////////////////////////////////////////////////////// 72 ////////////////////////////////////////////////////////////////////////////////
60 // GestureRecognizerImpl, public: 73 // GestureRecognizerImpl, public:
61 74
62 GestureRecognizerImpl::GestureRecognizerImpl() { 75 GestureRecognizerImpl::GestureRecognizerImpl()
76 : use_unified_gesture_detector_(CommandLine::ForCurrentProcess()->HasSwitch(
77 switches::kUseUnifiedGestureDetector)) {
63 } 78 }
64 79
65 GestureRecognizerImpl::~GestureRecognizerImpl() { 80 GestureRecognizerImpl::~GestureRecognizerImpl() {
66 STLDeleteValues(&consumer_sequence_); 81 STLDeleteValues(&consumer_sequence_);
82 STLDeleteValues(&consumer_gesture_provider_);
67 } 83 }
68 84
69 // Checks if this finger is already down, if so, returns the current target. 85 // Checks if this finger is already down, if so, returns the current target.
70 // Otherwise, returns NULL. 86 // Otherwise, returns NULL.
71 GestureConsumer* GestureRecognizerImpl::GetTouchLockedTarget( 87 GestureConsumer* GestureRecognizerImpl::GetTouchLockedTarget(
72 const TouchEvent& event) { 88 const TouchEvent& event) {
73 return touch_id_target_[event.touch_id()]; 89 return touch_id_target_[event.touch_id()];
74 } 90 }
75 91
76 GestureConsumer* GestureRecognizerImpl::GetTargetForGestureEvent( 92 GestureConsumer* GestureRecognizerImpl::GetTargetForGestureEvent(
77 const GestureEvent& event) { 93 const GestureEvent& event) {
78 GestureConsumer* target = NULL; 94 GestureConsumer* target = NULL;
79 int touch_id = event.GetLowestTouchId(); 95 int touch_id = event.GetLowestTouchId();
80 target = touch_id_target_for_gestures_[touch_id]; 96 target = touch_id_target_for_gestures_[touch_id];
81 return target; 97 return target;
82 } 98 }
83 99
84 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation( 100 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation(
85 const gfx::PointF& location, int source_device_id) { 101 const gfx::PointF& location, int source_device_id) {
86 const GesturePoint* closest_point = NULL;
87 int64 closest_distance_squared = 0;
88 std::map<GestureConsumer*, GestureSequence*>::iterator i;
89 for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) {
90 const GesturePoint* points = i->second->points();
91 for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) {
92 if (!points[j].in_use() ||
93 source_device_id != points[j].source_device_id()) {
94 continue;
95 }
96 gfx::Vector2dF delta = points[j].last_touch_position() - location;
97 // Relative distance is all we need here, so LengthSquared() is
98 // appropriate, and cheaper than Length().
99 int64 distance_squared = delta.LengthSquared();
100 if (!closest_point || distance_squared < closest_distance_squared) {
101 closest_point = &points[j];
102 closest_distance_squared = distance_squared;
103 }
104 }
105 }
106
107 const int max_distance = 102 const int max_distance =
108 GestureConfiguration::max_separation_for_gesture_touches_in_pixels(); 103 GestureConfiguration::max_separation_for_gesture_touches_in_pixels();
109 104
110 if (closest_distance_squared < max_distance * max_distance && closest_point) 105 if (!use_unified_gesture_detector_) {
111 return touch_id_target_[closest_point->touch_id()]; 106 const GesturePoint* closest_point = NULL;
112 else 107 int64 closest_distance_squared = 0;
113 return NULL; 108 std::map<GestureConsumer*, GestureSequence*>::iterator i;
109 for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) {
110 const GesturePoint* points = i->second->points();
111 for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) {
112 if (!points[j].in_use() ||
113 source_device_id != points[j].source_device_id()) {
114 continue;
115 }
116 gfx::Vector2dF delta = points[j].last_touch_position() - location;
117 // Relative distance is all we need here, so LengthSquared() is
118 // appropriate, and cheaper than Length().
119 int64 distance_squared = delta.LengthSquared();
120 if (!closest_point || distance_squared < closest_distance_squared) {
121 closest_point = &points[j];
122 closest_distance_squared = distance_squared;
123 }
124 }
125 }
126
127 if (closest_distance_squared < max_distance * max_distance && closest_point)
128 return touch_id_target_[closest_point->touch_id()];
129 else
130 return NULL;
131 } else {
132 gfx::PointF closest_point;
133 int closest_touch_id;
134 float closest_distance_squared = std::numeric_limits<float>::infinity();
135
136 std::map<GestureConsumer*, GestureProviderAura*>::iterator i;
137 for (i = consumer_gesture_provider_.begin();
138 i != consumer_gesture_provider_.end();
139 ++i) {
140 const MotionEventAura& pointer_state = i->second->get_pointer_state();
141 for (size_t j = 0; j < pointer_state.GetPointerCount(); ++j) {
142 if (source_device_id != pointer_state.GetSourceDeviceId(j))
143 continue;
144 gfx::PointF point(pointer_state.GetX(j), pointer_state.GetY(j));
145 // Relative distance is all we need here, so LengthSquared() is
146 // appropriate, and cheaper than Length().
147 float distance_squared = (point - location).LengthSquared();
148 if (distance_squared < closest_distance_squared) {
149 closest_point = point;
150 closest_touch_id = pointer_state.GetPointerId(j);
151 closest_distance_squared = distance_squared;
152 }
153 }
154 }
155
156 if (closest_distance_squared < max_distance * max_distance)
157 return touch_id_target_[closest_touch_id];
158 else
159 return NULL;
160 }
114 } 161 }
115 162
116 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer, 163 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer,
117 GestureConsumer* new_consumer) { 164 GestureConsumer* new_consumer) {
118 // Send cancel to all those save |new_consumer| and |current_consumer|. 165 // Send cancel to all those save |new_consumer| and |current_consumer|.
119 // Don't send a cancel to |current_consumer|, unless |new_consumer| is NULL. 166 // Don't send a cancel to |current_consumer|, unless |new_consumer| is NULL.
120 // Dispatching a touch-cancel event can end up altering |touch_id_target_| 167 // Dispatching a touch-cancel event can end up altering |touch_id_target_|
121 // (e.g. when the target of the event is destroyed, causing it to be removed 168 // (e.g. when the target of the event is destroyed, causing it to be removed
122 // from |touch_id_target_| in |CleanupStateForConsumer()|). So create a list 169 // from |touch_id_target_| in |CleanupStateForConsumer()|). So create a list
123 // of the touch-ids that need to be cancelled, and dispatch the cancel events 170 // of the touch-ids that need to be cancelled, and dispatch the cancel events
124 // for them at the end. 171 // for them at the end.
125 std::vector<std::pair<int, GestureConsumer*> > ids; 172 std::vector<std::pair<int, GestureConsumer*> > ids;
126 for (TouchIdToConsumerMap::iterator i = touch_id_target_.begin(); 173 for (TouchIdToConsumerMap::iterator i = touch_id_target_.begin();
127 i != touch_id_target_.end(); ++i) { 174 i != touch_id_target_.end(); ++i) {
128 if (i->second && i->second != new_consumer && 175 if (i->second && i->second != new_consumer &&
129 (i->second != current_consumer || new_consumer == NULL) && 176 (i->second != current_consumer || new_consumer == NULL) &&
130 i->second) { 177 i->second) {
131 ids.push_back(std::make_pair(i->first, i->second)); 178 ids.push_back(std::make_pair(i->first, i->second));
132 } 179 }
133 } 180 }
134 181
135 CancelTouches(&ids); 182 CancelTouches(&ids);
136 183
137 // Transfer events from |current_consumer| to |new_consumer|. 184 // Transfer events from |current_consumer| to |new_consumer|.
138 if (current_consumer && new_consumer) { 185 if (current_consumer && new_consumer) {
139 TransferTouchIdToConsumerMap(current_consumer, new_consumer, 186 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
140 &touch_id_target_); 187 &touch_id_target_);
141 TransferTouchIdToConsumerMap(current_consumer, new_consumer, 188 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
142 &touch_id_target_for_gestures_); 189 &touch_id_target_for_gestures_);
143 TransferConsumer(current_consumer, new_consumer, &consumer_sequence_); 190 if (!use_unified_gesture_detector_)
191 TransferConsumer(current_consumer, new_consumer, &consumer_sequence_);
192 else
193 TransferConsumer(
194 current_consumer, new_consumer, &consumer_gesture_provider_);
144 } 195 }
145 } 196 }
146 197
147 bool GestureRecognizerImpl::GetLastTouchPointForTarget( 198 bool GestureRecognizerImpl::GetLastTouchPointForTarget(
148 GestureConsumer* consumer, 199 GestureConsumer* consumer,
149 gfx::PointF* point) { 200 gfx::PointF* point) {
150 if (consumer_sequence_.count(consumer) == 0) 201 if (!use_unified_gesture_detector_) {
151 return false; 202 if (consumer_sequence_.count(consumer) == 0)
152 203 return false;
153 *point = consumer_sequence_[consumer]->last_touch_location(); 204 *point = consumer_sequence_[consumer]->last_touch_location();
154 return true; 205 return true;
206 } else {
207 if (consumer_gesture_provider_.count(consumer) == 0)
208 return false;
209 const MotionEvent& pointer_state =
210 consumer_gesture_provider_[consumer]->get_pointer_state();
211 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY());
212 return true;
213 }
155 } 214 }
156 215
157 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) { 216 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) {
158 std::vector<std::pair<int, GestureConsumer*> > ids; 217 std::vector<std::pair<int, GestureConsumer*> > ids;
159 for (TouchIdToConsumerMap::const_iterator i = touch_id_target_.begin(); 218 for (TouchIdToConsumerMap::const_iterator i = touch_id_target_.begin();
160 i != touch_id_target_.end(); ++i) { 219 i != touch_id_target_.end(); ++i) {
161 if (i->second == consumer) 220 if (i->second == consumer)
162 ids.push_back(std::make_pair(i->first, i->second)); 221 ids.push_back(std::make_pair(i->first, i->second));
163 } 222 }
164 bool cancelled_touch = !ids.empty(); 223 bool cancelled_touch = !ids.empty();
(...skipping 15 matching lines...) Expand all
180 GestureSequence* GestureRecognizerImpl::GetGestureSequenceForConsumer( 239 GestureSequence* GestureRecognizerImpl::GetGestureSequenceForConsumer(
181 GestureConsumer* consumer) { 240 GestureConsumer* consumer) {
182 GestureSequence* gesture_sequence = consumer_sequence_[consumer]; 241 GestureSequence* gesture_sequence = consumer_sequence_[consumer];
183 if (!gesture_sequence) { 242 if (!gesture_sequence) {
184 gesture_sequence = CreateSequence(this); 243 gesture_sequence = CreateSequence(this);
185 consumer_sequence_[consumer] = gesture_sequence; 244 consumer_sequence_[consumer] = gesture_sequence;
186 } 245 }
187 return gesture_sequence; 246 return gesture_sequence;
188 } 247 }
189 248
249 GestureProviderAura* GestureRecognizerImpl::GetGestureProviderForConsumer(
250 GestureConsumer* consumer) {
251 GestureProviderAura* gesture_provider = consumer_gesture_provider_[consumer];
252 if (!gesture_provider) {
253 gesture_provider = CreateGestureProvider(this);
254 consumer_gesture_provider_[consumer] = gesture_provider;
255 }
256 return gesture_provider;
257 }
258
190 void GestureRecognizerImpl::SetupTargets(const TouchEvent& event, 259 void GestureRecognizerImpl::SetupTargets(const TouchEvent& event,
191 GestureConsumer* target) { 260 GestureConsumer* target) {
192 if (event.type() == ui::ET_TOUCH_RELEASED || 261 if (event.type() == ui::ET_TOUCH_RELEASED ||
193 event.type() == ui::ET_TOUCH_CANCELLED) { 262 event.type() == ui::ET_TOUCH_CANCELLED) {
194 touch_id_target_.erase(event.touch_id()); 263 touch_id_target_.erase(event.touch_id());
195 } else if (event.type() == ui::ET_TOUCH_PRESSED) { 264 } else if (event.type() == ui::ET_TOUCH_PRESSED) {
196 touch_id_target_[event.touch_id()] = target; 265 touch_id_target_[event.touch_id()] = target;
197 if (target) 266 if (target)
198 touch_id_target_for_gestures_[event.touch_id()] = target; 267 touch_id_target_for_gestures_[event.touch_id()] = target;
199 } 268 }
200 } 269 }
201 270
202 void GestureRecognizerImpl::CancelTouches( 271 void GestureRecognizerImpl::CancelTouches(
203 std::vector<std::pair<int, GestureConsumer*> >* touches) { 272 std::vector<std::pair<int, GestureConsumer*> >* touches) {
204 while (!touches->empty()) { 273 while (!touches->empty()) {
205 int touch_id = touches->begin()->first; 274 int touch_id = touches->begin()->first;
206 GestureConsumer* target = touches->begin()->second; 275 GestureConsumer* target = touches->begin()->second;
207 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, gfx::PointF(0, 0), 276 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, gfx::PointF(0, 0),
208 ui::EF_IS_SYNTHESIZED, touch_id, 277 ui::EF_IS_SYNTHESIZED, touch_id,
209 ui::EventTimeForNow(), 0.0f, 0.0f, 0.0f, 0.0f); 278 ui::EventTimeForNow(), 0.0f, 0.0f, 0.0f, 0.0f);
210 GestureEventHelper* helper = FindDispatchHelperForConsumer(target); 279 GestureEventHelper* helper = FindDispatchHelperForConsumer(target);
211 if (helper) 280 if (helper)
212 helper->DispatchCancelTouchEvent(&touch_event); 281 helper->DispatchCancelTouchEvent(&touch_event);
213 touches->erase(touches->begin()); 282 touches->erase(touches->begin());
214 } 283 }
215 } 284 }
216 285
286 void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) {
287 GestureConsumer* consumer = GetTargetForGestureEvent(*event);
288 if (consumer) {
289 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer);
290 if (helper)
291 helper->DispatchGestureEvent(event);
292 }
293 }
294
217 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture( 295 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture(
218 const TouchEvent& event, 296 const TouchEvent& event,
219 ui::EventResult result, 297 ui::EventResult result,
220 GestureConsumer* target) { 298 GestureConsumer* target) {
221 SetupTargets(event, target); 299 SetupTargets(event, target);
222 GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(target); 300
223 return gesture_sequence->ProcessTouchEventForGesture(event, result); 301 if (!use_unified_gesture_detector_) {
302 GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(target);
303 return gesture_sequence->ProcessTouchEventForGesture(event, result);
304 } else {
305 GestureProviderAura* gesture_provider =
306 GetGestureProviderForConsumer(target);
307 // TODO(tdresser) - detect gestures eagerly.
308 if (!(result & ER_CONSUMED)) {
309 if (gesture_provider->OnTouchEvent(event))
310 gesture_provider->OnTouchEventAck(result != ER_UNHANDLED);
311 }
312 return NULL;
313 }
224 } 314 }
225 315
226 bool GestureRecognizerImpl::CleanupStateForConsumer( 316 bool GestureRecognizerImpl::CleanupStateForConsumer(
227 GestureConsumer* consumer) { 317 GestureConsumer* consumer) {
228 bool state_cleaned_up = false; 318 bool state_cleaned_up = false;
229 if (consumer_sequence_.count(consumer)) { 319
230 state_cleaned_up = true; 320 if (!use_unified_gesture_detector_) {
231 delete consumer_sequence_[consumer]; 321 if (consumer_sequence_.count(consumer)) {
232 consumer_sequence_.erase(consumer); 322 state_cleaned_up = true;
323 delete consumer_sequence_[consumer];
324 consumer_sequence_.erase(consumer);
325 }
326 } else {
327 if (consumer_gesture_provider_.count(consumer)) {
328 state_cleaned_up = true;
329 // Don't immediately delete the GestureProvider, as we could be in the
330 // middle of dispatching a set of gestures.
331 base::MessageLoop::current()->PostTask(
332 FROM_HERE,
333 base::Bind(&DeleteGestureProvider,
334 consumer_gesture_provider_[consumer]));
335 consumer_gesture_provider_.erase(consumer);
336 }
233 } 337 }
234 338
235 state_cleaned_up |= RemoveConsumerFromMap(consumer, &touch_id_target_); 339 state_cleaned_up |= RemoveConsumerFromMap(consumer, &touch_id_target_);
236 state_cleaned_up |= 340 state_cleaned_up |=
237 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_); 341 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_);
238 return state_cleaned_up; 342 return state_cleaned_up;
239 } 343 }
240 344
241 void GestureRecognizerImpl::AddGestureEventHelper(GestureEventHelper* helper) { 345 void GestureRecognizerImpl::AddGestureEventHelper(GestureEventHelper* helper) {
242 helpers_.push_back(helper); 346 helpers_.push_back(helper);
243 } 347 }
244 348
245 void GestureRecognizerImpl::RemoveGestureEventHelper( 349 void GestureRecognizerImpl::RemoveGestureEventHelper(
246 GestureEventHelper* helper) { 350 GestureEventHelper* helper) {
247 std::vector<GestureEventHelper*>::iterator it = std::find(helpers_.begin(), 351 std::vector<GestureEventHelper*>::iterator it = std::find(helpers_.begin(),
248 helpers_.end(), helper); 352 helpers_.end(), helper);
249 if (it != helpers_.end()) 353 if (it != helpers_.end())
250 helpers_.erase(it); 354 helpers_.erase(it);
251 } 355 }
252 356
253 void GestureRecognizerImpl::DispatchPostponedGestureEvent(GestureEvent* event) { 357 void GestureRecognizerImpl::DispatchPostponedGestureEvent(GestureEvent* event) {
254 GestureConsumer* consumer = GetTargetForGestureEvent(*event); 358 DispatchGestureEvent(event);
255 if (consumer) { 359 }
256 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer); 360
257 if (helper) 361 void GestureRecognizerImpl::OnGestureEvent(scoped_ptr<GestureEvent> event) {
258 helper->DispatchPostponedGestureEvent(event); 362 scoped_ptr<GestureEvent> gesture_event = event.Pass();
jdduke (slow) 2014/05/05 16:57:09 Nit: No need to Pass() here, we can just use |even
tdresser 2014/05/05 17:45:14 |DispatchGestureEvent()| doesn't do the cleanup. I
jdduke (slow) 2014/05/05 17:52:48 OK, but why do we need to pass to a local scoped_p
tdresser 2014/05/05 18:11:18 Yup, that's true. Fixed.
259 } 363 DispatchGestureEvent(gesture_event.get());
260 } 364 }
261 365
262 GestureEventHelper* GestureRecognizerImpl::FindDispatchHelperForConsumer( 366 GestureEventHelper* GestureRecognizerImpl::FindDispatchHelperForConsumer(
263 GestureConsumer* consumer) { 367 GestureConsumer* consumer) {
264 std::vector<GestureEventHelper*>::iterator it; 368 std::vector<GestureEventHelper*>::iterator it;
265 for (it = helpers_.begin(); it != helpers_.end(); ++it) { 369 for (it = helpers_.begin(); it != helpers_.end(); ++it) {
266 if ((*it)->CanDispatchToConsumer(consumer)) 370 if ((*it)->CanDispatchToConsumer(consumer))
267 return (*it); 371 return (*it);
268 } 372 }
269 return NULL; 373 return NULL;
(...skipping 26 matching lines...) Expand all
296 std::vector<GestureEventHelper*>::iterator it; 400 std::vector<GestureEventHelper*>::iterator it;
297 for (it = helpers.begin(); it != helpers.end(); ++it) 401 for (it = helpers.begin(); it != helpers.end(); ++it)
298 gesture_recognizer->AddGestureEventHelper(*it); 402 gesture_recognizer->AddGestureEventHelper(*it);
299 403
300 helpers.clear(); 404 helpers.clear();
301 g_gesture_recognizer_instance = 405 g_gesture_recognizer_instance =
302 static_cast<GestureRecognizerImpl*>(gesture_recognizer); 406 static_cast<GestureRecognizerImpl*>(gesture_recognizer);
303 } 407 }
304 408
305 } // namespace ui 409 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698