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

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

Issue 1287103004: Sync ui/events to chromium @ https://codereview.chromium.org/1210203002 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: rebased Created 5 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
« no previous file with comments | « ui/events/gestures/gesture_recognizer_impl.h ('k') | ui/events/gestures/motion_event_impl.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/gesture_detection/gesture_configuration.h"
19 #include "ui/events/gestures/gesture_types.h" 19 #include "ui/events/gestures/gesture_types.h"
20 20
21 namespace ui { 21 namespace ui {
22 22
23 namespace { 23 namespace {
24 24
25 template <typename T> 25 template <typename T>
26 void TransferConsumer(GestureConsumer* current_consumer, 26 void TransferConsumer(GestureConsumer* current_consumer,
27 GestureConsumer* new_consumer, 27 GestureConsumer* new_consumer,
28 std::map<GestureConsumer*, T>* map) { 28 std::map<GestureConsumer*, T>* map) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 76
77 // 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.
78 // Otherwise, returns NULL. 78 // Otherwise, returns NULL.
79 GestureConsumer* GestureRecognizerImpl::GetTouchLockedTarget( 79 GestureConsumer* GestureRecognizerImpl::GetTouchLockedTarget(
80 const TouchEvent& event) { 80 const TouchEvent& event) {
81 return touch_id_target_[event.touch_id()]; 81 return touch_id_target_[event.touch_id()];
82 } 82 }
83 83
84 GestureConsumer* GestureRecognizerImpl::GetTargetForGestureEvent( 84 GestureConsumer* GestureRecognizerImpl::GetTargetForGestureEvent(
85 const GestureEvent& event) { 85 const GestureEvent& event) {
86 GestureConsumer* target = NULL;
87 int touch_id = event.details().oldest_touch_id(); 86 int touch_id = event.details().oldest_touch_id();
88 target = touch_id_target_for_gestures_[touch_id]; 87 if (!touch_id_target_for_gestures_.count(touch_id)) {
89 return target; 88 NOTREACHED() << "Touch ID does not map to a valid GestureConsumer.";
89 return nullptr;
90 }
91
92 return touch_id_target_for_gestures_.at(touch_id);
90 } 93 }
91 94
92 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation( 95 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation(
93 const gfx::PointF& location, int source_device_id) { 96 const gfx::PointF& location, int source_device_id) {
94 const float max_distance = 97 const float max_distance =
95 GestureConfiguration::max_separation_for_gesture_touches_in_pixels(); 98 GestureConfiguration::GetInstance()
99 ->max_separation_for_gesture_touches_in_pixels();
96 100
97 gfx::PointF closest_point; 101 gfx::PointF closest_point;
98 int closest_touch_id = 0; 102 int closest_touch_id = 0;
99 double closest_distance_squared = std::numeric_limits<double>::infinity(); 103 double closest_distance_squared = std::numeric_limits<double>::infinity();
100 104
101 std::map<GestureConsumer*, GestureProviderImpl*>::iterator i; 105 std::map<GestureConsumer*, GestureProviderImpl*>::iterator i;
102 for (i = consumer_gesture_provider_.begin(); 106 for (i = consumer_gesture_provider_.begin();
103 i != consumer_gesture_provider_.end(); 107 i != consumer_gesture_provider_.end();
104 ++i) { 108 ++i) {
105 const MotionEventImpl& pointer_state = i->second->pointer_state(); 109 const MotionEventImpl& pointer_state = i->second->pointer_state();
(...skipping 10 matching lines...) Expand all
116 closest_distance_squared = distance_squared; 120 closest_distance_squared = distance_squared;
117 } 121 }
118 } 122 }
119 } 123 }
120 124
121 if (closest_distance_squared < max_distance * max_distance) 125 if (closest_distance_squared < max_distance * max_distance)
122 return touch_id_target_[closest_touch_id]; 126 return touch_id_target_[closest_touch_id];
123 return NULL; 127 return NULL;
124 } 128 }
125 129
130 void GestureRecognizerImpl::CancelActiveTouchesExcept(
131 GestureConsumer* not_cancelled) {
132 for (const auto& consumer_provider : consumer_gesture_provider_) {
133 if (consumer_provider.first == not_cancelled)
134 continue;
135 CancelActiveTouches(consumer_provider.first);
136 }
137 }
138
126 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer, 139 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer,
127 GestureConsumer* new_consumer) { 140 GestureConsumer* new_consumer) {
128 // Send cancel to all those save |new_consumer| and |current_consumer|. 141 DCHECK(current_consumer);
129 // Don't send a cancel to |current_consumer|, unless |new_consumer| is NULL. 142 DCHECK(new_consumer);
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
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
134 // for them at the end.
135 143
136 std::vector<GestureConsumer*> consumers; 144 CancelActiveTouchesExcept(current_consumer);
137 std::map<GestureConsumer*, GestureProviderImpl*>::iterator i; 145
138 for (i = consumer_gesture_provider_.begin(); 146 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
139 i != consumer_gesture_provider_.end(); 147 &touch_id_target_);
140 ++i) { 148 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
141 if (i->first && i->first != new_consumer && 149 &touch_id_target_for_gestures_);
142 (i->first != current_consumer || new_consumer == NULL)) { 150 TransferConsumer(current_consumer, new_consumer, &consumer_gesture_provider_);
143 consumers.push_back(i->first);
144 }
145 }
146 for (std::vector<GestureConsumer*>::iterator iter = consumers.begin();
147 iter != consumers.end();
148 ++iter) {
149 CancelActiveTouches(*iter);
150 }
151 // Transfer events from |current_consumer| to |new_consumer|.
152 if (current_consumer && new_consumer) {
153 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
154 &touch_id_target_);
155 TransferTouchIdToConsumerMap(current_consumer, new_consumer,
156 &touch_id_target_for_gestures_);
157 TransferConsumer(
158 current_consumer, new_consumer, &consumer_gesture_provider_);
159 }
160 } 151 }
161 152
162 bool GestureRecognizerImpl::GetLastTouchPointForTarget( 153 bool GestureRecognizerImpl::GetLastTouchPointForTarget(
163 GestureConsumer* consumer, 154 GestureConsumer* consumer,
164 gfx::PointF* point) { 155 gfx::PointF* point) {
165 if (consumer_gesture_provider_.count(consumer) == 0) 156 if (consumer_gesture_provider_.count(consumer) == 0)
166 return false; 157 return false;
167 const MotionEvent& pointer_state = 158 const MotionEvent& pointer_state =
168 consumer_gesture_provider_[consumer]->pointer_state(); 159 consumer_gesture_provider_[consumer]->pointer_state();
169 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY()); 160 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY());
170 return true; 161 return true;
171 } 162 }
172 163
173 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) { 164 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) {
174 bool cancelled_touch = false; 165 bool cancelled_touch = false;
175 if (consumer_gesture_provider_.count(consumer) == 0) 166 if (consumer_gesture_provider_.count(consumer) == 0)
176 return false; 167 return false;
177 const MotionEventImpl& pointer_state = 168 const MotionEventImpl& pointer_state =
178 consumer_gesture_provider_[consumer]->pointer_state(); 169 consumer_gesture_provider_[consumer]->pointer_state();
179 if (pointer_state.GetPointerCount() == 0) 170 if (pointer_state.GetPointerCount() == 0)
180 return false; 171 return false;
181 // Pointer_state is modified every time after DispatchCancelTouchEvent. 172 // pointer_state is modified every time after DispatchCancelTouchEvent.
182 scoped_ptr<MotionEvent> pointer_state_clone = pointer_state.Clone(); 173 scoped_ptr<MotionEvent> pointer_state_clone = pointer_state.Clone();
183 for (size_t i = 0; i < pointer_state_clone->GetPointerCount(); ++i) { 174 for (size_t i = 0; i < pointer_state_clone->GetPointerCount(); ++i) {
184 gfx::PointF point(pointer_state_clone->GetX(i), 175 gfx::PointF point(pointer_state_clone->GetX(i),
185 pointer_state_clone->GetY(i)); 176 pointer_state_clone->GetY(i));
186 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, 177 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED,
187 point, 178 point,
188 ui::EF_IS_SYNTHESIZED, 179 ui::EF_IS_SYNTHESIZED,
189 pointer_state_clone->GetPointerId(i), 180 pointer_state_clone->GetPointerId(i),
190 ui::EventTimeForNow(), 181 ui::EventTimeForNow(),
191 0.0f, 182 0.0f,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) { 219 void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) {
229 GestureConsumer* consumer = GetTargetForGestureEvent(*event); 220 GestureConsumer* consumer = GetTargetForGestureEvent(*event);
230 if (consumer) { 221 if (consumer) {
231 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer); 222 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer);
232 if (helper) 223 if (helper)
233 helper->DispatchGestureEvent(event); 224 helper->DispatchGestureEvent(event);
234 } 225 }
235 } 226 }
236 227
237 bool GestureRecognizerImpl::ProcessTouchEventPreDispatch( 228 bool GestureRecognizerImpl::ProcessTouchEventPreDispatch(
238 const TouchEvent& event, 229 TouchEvent* event,
239 GestureConsumer* consumer) { 230 GestureConsumer* consumer) {
240 SetupTargets(event, consumer); 231 SetupTargets(*event, consumer);
241 232
242 if (event.result() & ER_CONSUMED) 233 if (event->result() & ER_CONSUMED)
243 return false; 234 return false;
244 235
245 GestureProviderImpl* gesture_provider = 236 GestureProviderImpl* gesture_provider =
246 GetGestureProviderForConsumer(consumer); 237 GetGestureProviderForConsumer(consumer);
247 return gesture_provider->OnTouchEvent(event); 238 return gesture_provider->OnTouchEvent(event);
248 } 239 }
249 240
250 GestureRecognizer::Gestures* 241 GestureRecognizer::Gestures* GestureRecognizerImpl::AckTouchEvent(
251 GestureRecognizerImpl::ProcessTouchEventPostDispatch( 242 uint32 unique_event_id,
252 const TouchEvent& event,
253 ui::EventResult result, 243 ui::EventResult result,
254 GestureConsumer* consumer) { 244 GestureConsumer* consumer) {
255 GestureProviderImpl* gesture_provider = 245 GestureProviderImpl* gesture_provider =
256 GetGestureProviderForConsumer(consumer); 246 GetGestureProviderForConsumer(consumer);
257 gesture_provider->OnTouchEventAck(result != ER_UNHANDLED); 247 gesture_provider->OnTouchEventAck(unique_event_id, result != ER_UNHANDLED);
258 return gesture_provider->GetAndResetPendingGestures(); 248 return gesture_provider->GetAndResetPendingGestures();
259 } 249 }
260 250
261 GestureRecognizer::Gestures* GestureRecognizerImpl::ProcessTouchEventOnAsyncAck(
262 const TouchEvent& event,
263 ui::EventResult result,
264 GestureConsumer* consumer) {
265 if (result & ui::ER_CONSUMED)
266 return NULL;
267 GestureProviderImpl* gesture_provider =
268 GetGestureProviderForConsumer(consumer);
269 gesture_provider->OnTouchEventAck(result != ER_UNHANDLED);
270 return gesture_provider->GetAndResetPendingGestures();
271 }
272
273 bool GestureRecognizerImpl::CleanupStateForConsumer( 251 bool GestureRecognizerImpl::CleanupStateForConsumer(
274 GestureConsumer* consumer) { 252 GestureConsumer* consumer) {
275 bool state_cleaned_up = false; 253 bool state_cleaned_up = false;
276 254
277 if (consumer_gesture_provider_.count(consumer)) { 255 if (consumer_gesture_provider_.count(consumer)) {
278 state_cleaned_up = true; 256 state_cleaned_up = true;
279 delete consumer_gesture_provider_[consumer]; 257 delete consumer_gesture_provider_[consumer];
280 consumer_gesture_provider_.erase(consumer); 258 consumer_gesture_provider_.erase(consumer);
281 } 259 }
282 260
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 std::vector<GestureEventHelper*>::iterator it; 317 std::vector<GestureEventHelper*>::iterator it;
340 for (it = helpers.begin(); it != helpers.end(); ++it) 318 for (it = helpers.begin(); it != helpers.end(); ++it)
341 gesture_recognizer->AddGestureEventHelper(*it); 319 gesture_recognizer->AddGestureEventHelper(*it);
342 320
343 helpers.clear(); 321 helpers.clear();
344 g_gesture_recognizer_instance = 322 g_gesture_recognizer_instance =
345 static_cast<GestureRecognizerImpl*>(gesture_recognizer); 323 static_cast<GestureRecognizerImpl*>(gesture_recognizer);
346 } 324 }
347 325
348 } // namespace ui 326 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/gestures/gesture_recognizer_impl.h ('k') | ui/events/gestures/motion_event_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698