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

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

Issue 458363002: Remove old Aura Gesture Detection Pipeline. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address sadrul's comment, and rebase. 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 | Annotate | Revision Log
« no previous file with comments | « ui/events/gestures/gesture_recognizer_impl.h ('k') | ui/events/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/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"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/time/time.h" 13 #include "base/time/time.h"
14 #include "ui/events/event.h" 14 #include "ui/events/event.h"
15 #include "ui/events/event_constants.h" 15 #include "ui/events/event_constants.h"
16 #include "ui/events/event_switches.h" 16 #include "ui/events/event_switches.h"
17 #include "ui/events/event_utils.h" 17 #include "ui/events/event_utils.h"
18 #include "ui/events/gestures/gesture_configuration.h" 18 #include "ui/events/gestures/gesture_configuration.h"
19 #include "ui/events/gestures/gesture_sequence.h"
20 #include "ui/events/gestures/gesture_types.h" 19 #include "ui/events/gestures/gesture_types.h"
21 #include "ui/events/gestures/unified_gesture_detector_enabled.h"
22 20
23 namespace ui { 21 namespace ui {
24 22
25 namespace { 23 namespace {
26 24
27 template <typename T> 25 template <typename T>
28 void TransferConsumer(GestureConsumer* current_consumer, 26 void TransferConsumer(GestureConsumer* current_consumer,
29 GestureConsumer* new_consumer, 27 GestureConsumer* new_consumer,
30 std::map<GestureConsumer*, T>* map) { 28 std::map<GestureConsumer*, T>* map) {
31 if (map->count(current_consumer)) { 29 if (map->count(current_consumer)) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 GestureProviderAura* CreateGestureProvider(GestureProviderAuraClient* client) { 61 GestureProviderAura* CreateGestureProvider(GestureProviderAuraClient* client) {
64 return new GestureProviderAura(client); 62 return new GestureProviderAura(client);
65 } 63 }
66 64
67 } // namespace 65 } // namespace
68 66
69 //////////////////////////////////////////////////////////////////////////////// 67 ////////////////////////////////////////////////////////////////////////////////
70 // GestureRecognizerImpl, public: 68 // GestureRecognizerImpl, public:
71 69
72 GestureRecognizerImpl::GestureRecognizerImpl() { 70 GestureRecognizerImpl::GestureRecognizerImpl() {
73 use_unified_gesture_detector_ = IsUnifiedGestureDetectorEnabled();
74 } 71 }
75 72
76 GestureRecognizerImpl::~GestureRecognizerImpl() { 73 GestureRecognizerImpl::~GestureRecognizerImpl() {
77 STLDeleteValues(&consumer_sequence_);
78 STLDeleteValues(&consumer_gesture_provider_); 74 STLDeleteValues(&consumer_gesture_provider_);
79 } 75 }
80 76
81 // Checks if this finger is already down, if so, returns the current target. 77 // Checks if this finger is already down, if so, returns the current target.
82 // Otherwise, returns NULL. 78 // Otherwise, returns NULL.
83 GestureConsumer* GestureRecognizerImpl::GetTouchLockedTarget( 79 GestureConsumer* GestureRecognizerImpl::GetTouchLockedTarget(
84 const TouchEvent& event) { 80 const TouchEvent& event) {
85 return touch_id_target_[event.touch_id()]; 81 return touch_id_target_[event.touch_id()];
86 } 82 }
87 83
88 GestureConsumer* GestureRecognizerImpl::GetTargetForGestureEvent( 84 GestureConsumer* GestureRecognizerImpl::GetTargetForGestureEvent(
89 const GestureEvent& event) { 85 const GestureEvent& event) {
90 GestureConsumer* target = NULL; 86 GestureConsumer* target = NULL;
91 int touch_id = event.details().oldest_touch_id(); 87 int touch_id = event.details().oldest_touch_id();
92 target = touch_id_target_for_gestures_[touch_id]; 88 target = touch_id_target_for_gestures_[touch_id];
93 return target; 89 return target;
94 } 90 }
95 91
96 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation( 92 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation(
97 const gfx::PointF& location, int source_device_id) { 93 const gfx::PointF& location, int source_device_id) {
98 const int max_distance = 94 const int max_distance =
99 GestureConfiguration::max_separation_for_gesture_touches_in_pixels(); 95 GestureConfiguration::max_separation_for_gesture_touches_in_pixels();
100 96
101 if (!use_unified_gesture_detector_) { 97 gfx::PointF closest_point;
102 const GesturePoint* closest_point = NULL; 98 int closest_touch_id;
103 int64 closest_distance_squared = 0; 99 float closest_distance_squared = std::numeric_limits<float>::infinity();
104 std::map<GestureConsumer*, GestureSequence*>::iterator i; 100
105 for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) { 101 std::map<GestureConsumer*, GestureProviderAura*>::iterator i;
106 const GesturePoint* points = i->second->points(); 102 for (i = consumer_gesture_provider_.begin();
107 for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) { 103 i != consumer_gesture_provider_.end();
108 if (!points[j].in_use() || 104 ++i) {
109 source_device_id != points[j].source_device_id()) { 105 const MotionEventAura& pointer_state = i->second->pointer_state();
110 continue; 106 for (size_t j = 0; j < pointer_state.GetPointerCount(); ++j) {
111 } 107 if (source_device_id != pointer_state.GetSourceDeviceId(j))
112 gfx::Vector2dF delta = points[j].last_touch_position() - location; 108 continue;
113 // Relative distance is all we need here, so LengthSquared() is 109 gfx::PointF point(pointer_state.GetX(j), pointer_state.GetY(j));
114 // appropriate, and cheaper than Length(). 110 // Relative distance is all we need here, so LengthSquared() is
115 int64 distance_squared = delta.LengthSquared(); 111 // appropriate, and cheaper than Length().
116 if (!closest_point || distance_squared < closest_distance_squared) { 112 float distance_squared = (point - location).LengthSquared();
117 closest_point = &points[j]; 113 if (distance_squared < closest_distance_squared) {
118 closest_distance_squared = distance_squared; 114 closest_point = point;
119 } 115 closest_touch_id = pointer_state.GetPointerId(j);
116 closest_distance_squared = distance_squared;
120 } 117 }
121 } 118 }
119 }
122 120
123 if (closest_distance_squared < max_distance * max_distance && closest_point) 121 if (closest_distance_squared < max_distance * max_distance)
124 return touch_id_target_[closest_point->touch_id()]; 122 return touch_id_target_[closest_touch_id];
125 else 123 return NULL;
126 return NULL;
127 } else {
128 gfx::PointF closest_point;
129 int closest_touch_id;
130 float closest_distance_squared = std::numeric_limits<float>::infinity();
131
132 std::map<GestureConsumer*, GestureProviderAura*>::iterator i;
133 for (i = consumer_gesture_provider_.begin();
134 i != consumer_gesture_provider_.end();
135 ++i) {
136 const MotionEventAura& pointer_state = i->second->pointer_state();
137 for (size_t j = 0; j < pointer_state.GetPointerCount(); ++j) {
138 if (source_device_id != pointer_state.GetSourceDeviceId(j))
139 continue;
140 gfx::PointF point(pointer_state.GetX(j), pointer_state.GetY(j));
141 // Relative distance is all we need here, so LengthSquared() is
142 // appropriate, and cheaper than Length().
143 float distance_squared = (point - location).LengthSquared();
144 if (distance_squared < closest_distance_squared) {
145 closest_point = point;
146 closest_touch_id = pointer_state.GetPointerId(j);
147 closest_distance_squared = distance_squared;
148 }
149 }
150 }
151
152 if (closest_distance_squared < max_distance * max_distance)
153 return touch_id_target_[closest_touch_id];
154 else
155 return NULL;
156 }
157 } 124 }
158 125
159 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer, 126 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer,
160 GestureConsumer* new_consumer) { 127 GestureConsumer* new_consumer) {
161 // Send cancel to all those save |new_consumer| and |current_consumer|. 128 // 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. 129 // 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_| 130 // 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 131 // (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 132 // 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 133 // of the touch-ids that need to be cancelled, and dispatch the cancel events
167 // for them at the end. 134 // for them at the end.
168 std::vector<std::pair<int, GestureConsumer*> > ids; 135 std::vector<std::pair<int, GestureConsumer*> > ids;
169 for (TouchIdToConsumerMap::iterator i = touch_id_target_.begin(); 136 for (TouchIdToConsumerMap::iterator i = touch_id_target_.begin();
170 i != touch_id_target_.end(); ++i) { 137 i != touch_id_target_.end(); ++i) {
171 if (i->second && i->second != new_consumer && 138 if (i->second && i->second != new_consumer &&
172 (i->second != current_consumer || new_consumer == NULL) && 139 (i->second != current_consumer || new_consumer == NULL) &&
173 i->second) { 140 i->second) {
174 ids.push_back(std::make_pair(i->first, i->second)); 141 ids.push_back(std::make_pair(i->first, i->second));
175 } 142 }
176 } 143 }
177 144
178 CancelTouches(&ids); 145 CancelTouches(&ids);
179 146
180 // Transfer events from |current_consumer| to |new_consumer|. 147 // Transfer events from |current_consumer| to |new_consumer|.
181 if (current_consumer && new_consumer) { 148 if (current_consumer && new_consumer) {
182 TransferTouchIdToConsumerMap(current_consumer, new_consumer, 149 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
183 &touch_id_target_); 150 &touch_id_target_);
184 TransferTouchIdToConsumerMap(current_consumer, new_consumer, 151 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
185 &touch_id_target_for_gestures_); 152 &touch_id_target_for_gestures_);
186 if (!use_unified_gesture_detector_) 153 TransferConsumer(
187 TransferConsumer(current_consumer, new_consumer, &consumer_sequence_); 154 current_consumer, new_consumer, &consumer_gesture_provider_);
188 else
189 TransferConsumer(
190 current_consumer, new_consumer, &consumer_gesture_provider_);
191 } 155 }
192 } 156 }
193 157
194 bool GestureRecognizerImpl::GetLastTouchPointForTarget( 158 bool GestureRecognizerImpl::GetLastTouchPointForTarget(
195 GestureConsumer* consumer, 159 GestureConsumer* consumer,
196 gfx::PointF* point) { 160 gfx::PointF* point) {
197 if (!use_unified_gesture_detector_) {
198 if (consumer_sequence_.count(consumer) == 0)
199 return false;
200 *point = consumer_sequence_[consumer]->last_touch_location();
201 return true;
202 } else {
203 if (consumer_gesture_provider_.count(consumer) == 0) 161 if (consumer_gesture_provider_.count(consumer) == 0)
204 return false; 162 return false;
205 const MotionEvent& pointer_state = 163 const MotionEvent& pointer_state =
206 consumer_gesture_provider_[consumer]->pointer_state(); 164 consumer_gesture_provider_[consumer]->pointer_state();
207 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY()); 165 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY());
208 return true; 166 return true;
209 }
210 } 167 }
211 168
212 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) { 169 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) {
213 std::vector<std::pair<int, GestureConsumer*> > ids; 170 std::vector<std::pair<int, GestureConsumer*> > ids;
214 for (TouchIdToConsumerMap::const_iterator i = touch_id_target_.begin(); 171 for (TouchIdToConsumerMap::const_iterator i = touch_id_target_.begin();
215 i != touch_id_target_.end(); ++i) { 172 i != touch_id_target_.end(); ++i) {
216 if (i->second == consumer) 173 if (i->second == consumer)
217 ids.push_back(std::make_pair(i->first, i->second)); 174 ids.push_back(std::make_pair(i->first, i->second));
218 } 175 }
219 bool cancelled_touch = !ids.empty(); 176 bool cancelled_touch = !ids.empty();
220 CancelTouches(&ids); 177 CancelTouches(&ids);
221 return cancelled_touch; 178 return cancelled_touch;
222 } 179 }
223 180
224 //////////////////////////////////////////////////////////////////////////////// 181 ////////////////////////////////////////////////////////////////////////////////
225 // GestureRecognizerImpl, protected:
226
227 GestureSequence* GestureRecognizerImpl::CreateSequence(
228 GestureSequenceDelegate* delegate) {
229 return new GestureSequence(delegate);
230 }
231
232 ////////////////////////////////////////////////////////////////////////////////
233 // GestureRecognizerImpl, private: 182 // GestureRecognizerImpl, private:
234 183
235 GestureSequence* GestureRecognizerImpl::GetGestureSequenceForConsumer(
236 GestureConsumer* consumer) {
237 GestureSequence* gesture_sequence = consumer_sequence_[consumer];
238 if (!gesture_sequence) {
239 gesture_sequence = CreateSequence(this);
240 consumer_sequence_[consumer] = gesture_sequence;
241 }
242 return gesture_sequence;
243 }
244
245 GestureProviderAura* GestureRecognizerImpl::GetGestureProviderForConsumer( 184 GestureProviderAura* GestureRecognizerImpl::GetGestureProviderForConsumer(
246 GestureConsumer* consumer) { 185 GestureConsumer* consumer) {
247 GestureProviderAura* gesture_provider = consumer_gesture_provider_[consumer]; 186 GestureProviderAura* gesture_provider = consumer_gesture_provider_[consumer];
248 if (!gesture_provider) { 187 if (!gesture_provider) {
249 gesture_provider = CreateGestureProvider(this); 188 gesture_provider = CreateGestureProvider(this);
250 consumer_gesture_provider_[consumer] = gesture_provider; 189 consumer_gesture_provider_[consumer] = gesture_provider;
251 } 190 }
252 return gesture_provider; 191 return gesture_provider;
253 } 192 }
254 193
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 if (helper) 225 if (helper)
287 helper->DispatchGestureEvent(event); 226 helper->DispatchGestureEvent(event);
288 } 227 }
289 } 228 }
290 229
291 bool GestureRecognizerImpl::ProcessTouchEventPreDispatch( 230 bool GestureRecognizerImpl::ProcessTouchEventPreDispatch(
292 const TouchEvent& event, 231 const TouchEvent& event,
293 GestureConsumer* consumer) { 232 GestureConsumer* consumer) {
294 SetupTargets(event, consumer); 233 SetupTargets(event, consumer);
295 234
296 // If we aren't using the unified GR, we definitely want to dispatch the
297 // event.
298 if (!ui::IsUnifiedGestureDetectorEnabled())
299 return true;
300
301 if (event.result() & ER_CONSUMED) 235 if (event.result() & ER_CONSUMED)
302 return false; 236 return false;
303 237
304 GestureProviderAura* gesture_provider = 238 GestureProviderAura* gesture_provider =
305 GetGestureProviderForConsumer(consumer); 239 GetGestureProviderForConsumer(consumer);
306 return gesture_provider->OnTouchEvent(event); 240 return gesture_provider->OnTouchEvent(event);
307 } 241 }
308 242
309 GestureRecognizer::Gestures* 243 GestureRecognizer::Gestures*
310 GestureRecognizerImpl::ProcessTouchEventPostDispatch( 244 GestureRecognizerImpl::ProcessTouchEventPostDispatch(
311 const TouchEvent& event, 245 const TouchEvent& event,
312 ui::EventResult result, 246 ui::EventResult result,
313 GestureConsumer* consumer) { 247 GestureConsumer* consumer) {
314 if (ui::IsUnifiedGestureDetectorEnabled()) { 248 GestureProviderAura* gesture_provider =
315 GestureProviderAura* gesture_provider = 249 GetGestureProviderForConsumer(consumer);
316 GetGestureProviderForConsumer(consumer); 250 gesture_provider->OnTouchEventAck(result != ER_UNHANDLED);
317 gesture_provider->OnTouchEventAck(result != ER_UNHANDLED); 251 return gesture_provider->GetAndResetPendingGestures();
318 return gesture_provider->GetAndResetPendingGestures();
319 } else {
320 GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(consumer);
321 return gesture_sequence->ProcessTouchEventForGesture(event, result);
322 }
323 } 252 }
324 253
325 GestureRecognizer::Gestures* GestureRecognizerImpl::ProcessTouchEventOnAsyncAck( 254 GestureRecognizer::Gestures* GestureRecognizerImpl::ProcessTouchEventOnAsyncAck(
326 const TouchEvent& event, 255 const TouchEvent& event,
327 ui::EventResult result, 256 ui::EventResult result,
328 GestureConsumer* consumer) { 257 GestureConsumer* consumer) {
329 if (ui::IsUnifiedGestureDetectorEnabled()) { 258 if (result & ui::ER_CONSUMED)
330 if (result & ui::ER_CONSUMED) 259 return NULL;
331 return NULL; 260 GestureProviderAura* gesture_provider =
332 GestureProviderAura* gesture_provider = 261 GetGestureProviderForConsumer(consumer);
333 GetGestureProviderForConsumer(consumer); 262 gesture_provider->OnTouchEventAck(result != ER_UNHANDLED);
334 gesture_provider->OnTouchEventAck(result != ER_UNHANDLED); 263 return gesture_provider->GetAndResetPendingGestures();
335 return gesture_provider->GetAndResetPendingGestures();
336 } else {
337 GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(consumer);
338 return gesture_sequence->ProcessTouchEventForGesture(event, result);
339 }
340 } 264 }
341 265
342 bool GestureRecognizerImpl::CleanupStateForConsumer( 266 bool GestureRecognizerImpl::CleanupStateForConsumer(
343 GestureConsumer* consumer) { 267 GestureConsumer* consumer) {
344 bool state_cleaned_up = false; 268 bool state_cleaned_up = false;
345 269
346 if (!use_unified_gesture_detector_) { 270 if (consumer_gesture_provider_.count(consumer)) {
347 if (consumer_sequence_.count(consumer)) { 271 state_cleaned_up = true;
348 state_cleaned_up = true; 272 delete consumer_gesture_provider_[consumer];
349 delete consumer_sequence_[consumer]; 273 consumer_gesture_provider_.erase(consumer);
350 consumer_sequence_.erase(consumer);
351 }
352 } else {
353 if (consumer_gesture_provider_.count(consumer)) {
354 state_cleaned_up = true;
355 delete consumer_gesture_provider_[consumer];
356 consumer_gesture_provider_.erase(consumer);
357 }
358 } 274 }
359 275
360 state_cleaned_up |= RemoveConsumerFromMap(consumer, &touch_id_target_); 276 state_cleaned_up |= RemoveConsumerFromMap(consumer, &touch_id_target_);
361 state_cleaned_up |= 277 state_cleaned_up |=
362 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_); 278 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_);
363 return state_cleaned_up; 279 return state_cleaned_up;
364 } 280 }
365 281
366 void GestureRecognizerImpl::AddGestureEventHelper(GestureEventHelper* helper) { 282 void GestureRecognizerImpl::AddGestureEventHelper(GestureEventHelper* helper) {
367 helpers_.push_back(helper); 283 helpers_.push_back(helper);
368 } 284 }
369 285
370 void GestureRecognizerImpl::RemoveGestureEventHelper( 286 void GestureRecognizerImpl::RemoveGestureEventHelper(
371 GestureEventHelper* helper) { 287 GestureEventHelper* helper) {
372 std::vector<GestureEventHelper*>::iterator it = std::find(helpers_.begin(), 288 std::vector<GestureEventHelper*>::iterator it = std::find(helpers_.begin(),
373 helpers_.end(), helper); 289 helpers_.end(), helper);
374 if (it != helpers_.end()) 290 if (it != helpers_.end())
375 helpers_.erase(it); 291 helpers_.erase(it);
376 } 292 }
377 293
378 void GestureRecognizerImpl::DispatchPostponedGestureEvent(GestureEvent* event) {
379 DispatchGestureEvent(event);
380 }
381
382 void GestureRecognizerImpl::OnGestureEvent(GestureEvent* event) { 294 void GestureRecognizerImpl::OnGestureEvent(GestureEvent* event) {
383 DispatchGestureEvent(event); 295 DispatchGestureEvent(event);
384 } 296 }
385 297
386 GestureEventHelper* GestureRecognizerImpl::FindDispatchHelperForConsumer( 298 GestureEventHelper* GestureRecognizerImpl::FindDispatchHelperForConsumer(
387 GestureConsumer* consumer) { 299 GestureConsumer* consumer) {
388 std::vector<GestureEventHelper*>::iterator it; 300 std::vector<GestureEventHelper*>::iterator it;
389 for (it = helpers_.begin(); it != helpers_.end(); ++it) { 301 for (it = helpers_.begin(); it != helpers_.end(); ++it) {
390 if ((*it)->CanDispatchToConsumer(consumer)) 302 if ((*it)->CanDispatchToConsumer(consumer))
391 return (*it); 303 return (*it);
(...skipping 28 matching lines...) Expand all
420 std::vector<GestureEventHelper*>::iterator it; 332 std::vector<GestureEventHelper*>::iterator it;
421 for (it = helpers.begin(); it != helpers.end(); ++it) 333 for (it = helpers.begin(); it != helpers.end(); ++it)
422 gesture_recognizer->AddGestureEventHelper(*it); 334 gesture_recognizer->AddGestureEventHelper(*it);
423 335
424 helpers.clear(); 336 helpers.clear();
425 g_gesture_recognizer_instance = 337 g_gesture_recognizer_instance =
426 static_cast<GestureRecognizerImpl*>(gesture_recognizer); 338 static_cast<GestureRecognizerImpl*>(gesture_recognizer);
427 } 339 }
428 340
429 } // namespace ui 341 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/gestures/gesture_recognizer_impl.h ('k') | ui/events/gestures/gesture_sequence.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698