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

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

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

Powered by Google App Engine
This is Rietveld 408576698