| OLD | NEW |
| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 | 122 |
| 123 void GestureRecognizerImpl::CancelActiveTouchesExcept( | 123 void GestureRecognizerImpl::CancelActiveTouchesExcept( |
| 124 GestureConsumer* not_cancelled) { | 124 GestureConsumer* not_cancelled) { |
| 125 for (const auto& consumer_provider : consumer_gesture_provider_) { | 125 for (const auto& consumer_provider : consumer_gesture_provider_) { |
| 126 if (consumer_provider.first == not_cancelled) | 126 if (consumer_provider.first == not_cancelled) |
| 127 continue; | 127 continue; |
| 128 CancelActiveTouches(consumer_provider.first); | 128 CancelActiveTouches(consumer_provider.first); |
| 129 } | 129 } |
| 130 } | 130 } |
| 131 | 131 |
| 132 void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer, | 132 void GestureRecognizerImpl::BeginDragAndDrop(GestureConsumer* current_consumer, |
| 133 GestureConsumer* new_consumer) { | 133 GestureConsumer* new_consumer) { |
| 134 // This method transfers the gesture stream from |current_consumer| to |
| 135 // |new_consumer|, while ensuring that both retain a touch event stream which |
| 136 // is reasonably valid. In order to do this we |
| 137 // - record what pointers are currently down on |current_consumer| |
| 138 // - cancel touches on consumers other than |current_consumer| |
| 139 // - move the gesture provider from |current_consumer| to |new_consumer| |
| 140 // - synchronize the state of the new gesture provider associated with |
| 141 // current_consumer with with the touch state of the consumer itself via |
| 142 // OnTouchEnter. |
| 143 // - synthesize touch cancels on |current_consumer|. |
| 144 // - retarget the pointers that were previously targeted to |
| 145 // |current_consumer| to |new_consumer|. |
| 146 // NOTE: This currently doesn't synthesize touch press events on |
| 147 // |new_consumer|, so the event stream it sees is still invalid. |
| 148 DCHECK(current_consumer); |
| 149 DCHECK(new_consumer); |
| 150 GestureEventHelper* helper = FindDispatchHelperForConsumer(current_consumer); |
| 151 |
| 152 std::vector<int> touchids_targeted_at_current; |
| 153 |
| 154 for (const auto& touch_id_target: touch_id_target_) { |
| 155 if (touch_id_target.second == current_consumer) |
| 156 touchids_targeted_at_current.push_back(touch_id_target.first); |
| 157 } |
| 158 |
| 159 CancelActiveTouchesExcept(current_consumer); |
| 160 |
| 161 std::vector<std::unique_ptr<TouchEvent>> cancelling_touches = |
| 162 GetEventPerPointForConsumer(current_consumer, ET_TOUCH_CANCELLED); |
| 163 |
| 164 TransferConsumer(current_consumer, new_consumer, &consumer_gesture_provider_); |
| 165 |
| 166 // We're now in a situation where current_consumer has no gesture recognizer, |
| 167 // but has some pointers down which need cancelling. In order to ensure that |
| 168 // the GR sees a valid event stream, inform it of these pointers via |
| 169 // OnTouchEnter, and then synthesize a touch cancel per pointer. |
| 170 if (helper) { |
| 171 GestureProviderAura* gesture_provider = |
| 172 GetGestureProviderForConsumer(current_consumer); |
| 173 |
| 174 for (std::unique_ptr<TouchEvent>& event : cancelling_touches) { |
| 175 gesture_provider->OnTouchEnter(event->touch_id(), event->x(), event->y()); |
| 176 helper->DispatchSyntheticTouchEvent(event.get()); |
| 177 } |
| 178 } |
| 179 |
| 180 for (int touch_id : touchids_targeted_at_current) |
| 181 touch_id_target_[touch_id] = new_consumer; |
| 182 } |
| 183 |
| 184 |
| 185 void GestureRecognizerImpl::BeginTabDrag(GestureConsumer* current_consumer, |
| 186 GestureConsumer* new_consumer) { |
| 187 // Tab Drag requires that the touches on |current_consumer| not be |
| 188 // cancelled. We transfer the gesture provider from |current_consumer| to |
| 189 // |new_consumer| without bothering to make the event stream valid for either |
| 190 // consumer. |
| 134 DCHECK(current_consumer); | 191 DCHECK(current_consumer); |
| 135 DCHECK(new_consumer); | 192 DCHECK(new_consumer); |
| 136 | 193 |
| 137 CancelActiveTouchesExcept(current_consumer); | 194 CancelActiveTouchesExcept(current_consumer); |
| 138 | 195 |
| 139 TransferTouchIdToConsumerMap(current_consumer, new_consumer, | 196 TransferTouchIdToConsumerMap(current_consumer, new_consumer, |
| 140 &touch_id_target_); | 197 &touch_id_target_); |
| 141 TransferConsumer(current_consumer, new_consumer, &consumer_gesture_provider_); | 198 TransferConsumer(current_consumer, new_consumer, &consumer_gesture_provider_); |
| 142 } | 199 } |
| 143 | 200 |
| 144 bool GestureRecognizerImpl::GetLastTouchPointForTarget( | 201 bool GestureRecognizerImpl::GetLastTouchPointForTarget( |
| 145 GestureConsumer* consumer, | 202 GestureConsumer* consumer, |
| 146 gfx::PointF* point) { | 203 gfx::PointF* point) { |
| 147 if (consumer_gesture_provider_.count(consumer) == 0) | 204 if (consumer_gesture_provider_.count(consumer) == 0) |
| 148 return false; | 205 return false; |
| 149 const MotionEvent& pointer_state = | 206 const MotionEvent& pointer_state = |
| 150 consumer_gesture_provider_[consumer]->pointer_state(); | 207 consumer_gesture_provider_[consumer]->pointer_state(); |
| 151 if (!pointer_state.GetPointerCount()) | 208 if (!pointer_state.GetPointerCount()) |
| 152 return false; | 209 return false; |
| 153 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY()); | 210 *point = gfx::PointF(pointer_state.GetX(), pointer_state.GetY()); |
| 154 return true; | 211 return true; |
| 155 } | 212 } |
| 156 | 213 |
| 157 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) { | 214 std::vector<std::unique_ptr<TouchEvent>> |
| 158 bool cancelled_touch = false; | 215 GestureRecognizerImpl::GetEventPerPointForConsumer(GestureConsumer* consumer, |
| 216 EventType type) { |
| 217 std::vector<std::unique_ptr<TouchEvent>> cancelling_touches; |
| 159 if (consumer_gesture_provider_.count(consumer) == 0) | 218 if (consumer_gesture_provider_.count(consumer) == 0) |
| 160 return false; | 219 return cancelling_touches; |
| 161 const MotionEventAura& pointer_state = | 220 const MotionEventAura& pointer_state = |
| 162 consumer_gesture_provider_[consumer]->pointer_state(); | 221 consumer_gesture_provider_[consumer]->pointer_state(); |
| 163 if (pointer_state.GetPointerCount() == 0) | 222 if (pointer_state.GetPointerCount() == 0) |
| 223 return cancelling_touches; |
| 224 for (size_t i = 0; i < pointer_state.GetPointerCount(); ++i) { |
| 225 std::unique_ptr<TouchEvent> touch_event(new TouchEvent( |
| 226 type, gfx::Point(), EF_IS_SYNTHESIZED, pointer_state.GetPointerId(i), |
| 227 EventTimeForNow(), 0.0f, 0.0f, 0.0f, 0.0f)); |
| 228 gfx::PointF point(pointer_state.GetX(i), pointer_state.GetY(i)); |
| 229 touch_event->set_location_f(point); |
| 230 touch_event->set_root_location_f(point); |
| 231 cancelling_touches.push_back(std::move(touch_event)); |
| 232 } |
| 233 return cancelling_touches; |
| 234 } |
| 235 |
| 236 bool GestureRecognizerImpl::CancelActiveTouches(GestureConsumer* consumer) { |
| 237 GestureEventHelper* helper = |
| 238 FindDispatchHelperForConsumer(consumer); |
| 239 |
| 240 if (!helper) |
| 164 return false; | 241 return false; |
| 165 // pointer_state is modified every time after DispatchCancelTouchEvent. | 242 |
| 166 std::unique_ptr<MotionEvent> pointer_state_clone = pointer_state.Clone(); | 243 std::vector<std::unique_ptr<TouchEvent>> cancelling_touches = |
| 167 for (size_t i = 0; i < pointer_state_clone->GetPointerCount(); ++i) { | 244 GetEventPerPointForConsumer(consumer, ET_TOUCH_CANCELLED); |
| 168 TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, gfx::Point(), | 245 for (const std::unique_ptr<TouchEvent>& cancelling_touch : cancelling_touches) |
| 169 ui::EF_IS_SYNTHESIZED, | 246 helper->DispatchSyntheticTouchEvent(cancelling_touch.get()); |
| 170 pointer_state_clone->GetPointerId(i), | 247 return cancelling_touches.size() > 0U; |
| 171 ui::EventTimeForNow(), 0.0f, 0.0f, 0.0f, 0.0f); | |
| 172 gfx::PointF point(pointer_state_clone->GetX(i), | |
| 173 pointer_state_clone->GetY(i)); | |
| 174 touch_event.set_location_f(point); | |
| 175 touch_event.set_root_location_f(point); | |
| 176 GestureEventHelper* helper = FindDispatchHelperForConsumer(consumer); | |
| 177 if (helper) | |
| 178 helper->DispatchCancelTouchEvent(consumer, &touch_event); | |
| 179 cancelled_touch = true; | |
| 180 } | |
| 181 return cancelled_touch; | |
| 182 } | 248 } |
| 183 | 249 |
| 184 //////////////////////////////////////////////////////////////////////////////// | 250 //////////////////////////////////////////////////////////////////////////////// |
| 185 // GestureRecognizerImpl, private: | 251 // GestureRecognizerImpl, private: |
| 186 | 252 |
| 187 GestureProviderAura* GestureRecognizerImpl::GetGestureProviderForConsumer( | 253 GestureProviderAura* GestureRecognizerImpl::GetGestureProviderForConsumer( |
| 188 GestureConsumer* consumer) { | 254 GestureConsumer* consumer) { |
| 189 GestureProviderAura* gesture_provider = consumer_gesture_provider_[consumer]; | 255 GestureProviderAura* gesture_provider = consumer_gesture_provider_[consumer]; |
| 190 if (!gesture_provider) { | 256 if (!gesture_provider) { |
| 191 gesture_provider = CreateGestureProvider(consumer, this); | 257 gesture_provider = CreateGestureProvider(consumer, this); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 std::vector<GestureEventHelper*>::iterator it; | 372 std::vector<GestureEventHelper*>::iterator it; |
| 307 for (it = helpers.begin(); it != helpers.end(); ++it) | 373 for (it = helpers.begin(); it != helpers.end(); ++it) |
| 308 gesture_recognizer->AddGestureEventHelper(*it); | 374 gesture_recognizer->AddGestureEventHelper(*it); |
| 309 | 375 |
| 310 helpers.clear(); | 376 helpers.clear(); |
| 311 g_gesture_recognizer_instance = | 377 g_gesture_recognizer_instance = |
| 312 static_cast<GestureRecognizerImpl*>(gesture_recognizer); | 378 static_cast<GestureRecognizerImpl*>(gesture_recognizer); |
| 313 } | 379 } |
| 314 | 380 |
| 315 } // namespace ui | 381 } // namespace ui |
| OLD | NEW |