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 3 // found in the LICENSE file. 4 5 #ifndef UI_EVENTS_GESTURES_GESTURE_RECOGNIZER_IMPL_H_ 6 #define UI_EVENTS_GESTURES_GESTURE_RECOGNIZER_IMPL_H_ 7 8 #include <stdint.h> 9 10 #include <map> 11 #include <memory> 12 #include <vector> 13 14 #include "base/macros.h" 15 #include "ui/events/event_constants.h" 16 #include "ui/events/events_export.h" 17 #include "ui/events/gestures/gesture_provider_aura.h" 18 #include "ui/events/gestures/gesture_recognizer.h" 19 #include "ui/events/types/event_type.h" 20 #include "ui/gfx/geometry/point.h" 21 22 namespace ui { 23 class GestureConsumer; 24 class GestureEvent; 25 class GestureEventHelper; 26 class TouchEvent; 27 28 // TODO(tdresser): Once the unified gesture recognition process sticks 29 // (crbug.com/332418), GestureRecognizerImpl can be cleaned up 30 // significantly. 31 class EVENTS_EXPORT GestureRecognizerImpl : public GestureRecognizer, 32 public GestureProviderAuraClient { 33 public: 34 typedef std::map<int, GestureConsumer*> TouchIdToConsumerMap; 35 36 GestureRecognizerImpl(); 37 ~GestureRecognizerImpl() override; 38 helpers()39 std::vector<GestureEventHelper*>& helpers() { return helpers_; } 40 41 // Returns a list of events of type |type|, one for each pointer down on 42 // |consumer|. Event locations are pulled from the active pointers. 43 std::vector<std::unique_ptr<TouchEvent>> GetEventPerPointForConsumer( 44 GestureConsumer* consumer, 45 EventType type); 46 47 // Overridden from GestureRecognizer 48 GestureConsumer* GetTouchLockedTarget(const TouchEvent& event) override; 49 GestureConsumer* GetTargetForLocation(const gfx::PointF& location, 50 int source_device_id) override; 51 void CancelActiveTouchesExcept(GestureConsumer* not_cancelled) override; 52 void CancelActiveTouchesOn( 53 const std::vector<GestureConsumer*>& consumers) override; 54 void TransferEventsTo( 55 GestureConsumer* current_consumer, 56 GestureConsumer* new_consumer, 57 TransferTouchesBehavior transfer_touches_behavior) override; 58 std::vector<std::unique_ptr<ui::TouchEvent>> ExtractTouches( 59 GestureConsumer* consumer) override; 60 void TransferTouches(GestureConsumer* consumer, 61 const std::vector<std::unique_ptr<ui::TouchEvent>>& 62 touch_events) override; 63 bool GetLastTouchPointForTarget(GestureConsumer* consumer, 64 gfx::PointF* point) override; 65 bool CancelActiveTouches(GestureConsumer* consumer) override; 66 67 protected: 68 virtual GestureProviderAura* GetGestureProviderForConsumer( 69 GestureConsumer* c); 70 71 // Overridden from GestureRecognizer 72 bool ProcessTouchEventPreDispatch(TouchEvent* event, 73 GestureConsumer* consumer) override; 74 75 private: 76 // Sets up the target consumer for gestures based on the touch-event. 77 void SetupTargets(const TouchEvent& event, GestureConsumer* consumer); 78 79 void DispatchGestureEvent(GestureConsumer* raw_input_consumer, 80 GestureEvent* event); 81 82 Gestures AckTouchEvent(uint32_t unique_event_id, 83 ui::EventResult result, 84 bool is_source_touch_event_set_blocking, 85 GestureConsumer* consumer) override; 86 87 void CancelActiveTouchesExceptImpl(GestureConsumer* not_cancelled); 88 bool CancelActiveTouchesImpl(GestureConsumer* consumer); 89 90 bool CleanupStateForConsumer(GestureConsumer* consumer) override; 91 void AddGestureEventHelper(GestureEventHelper* helper) override; 92 void RemoveGestureEventHelper(GestureEventHelper* helper) override; 93 94 // Overridden from GestureProviderAuraClient 95 void OnGestureEvent(GestureConsumer* raw_input_consumer, 96 GestureEvent* event) override; 97 98 // Convenience method to find the GestureEventHelper that can dispatch events 99 // to a specific |consumer|. 100 GestureEventHelper* FindDispatchHelperForConsumer(GestureConsumer* consumer); 101 std::map<GestureConsumer*, std::unique_ptr<GestureProviderAura>> 102 consumer_gesture_provider_; 103 104 // Maps an event via its |unique_event_id| to the corresponding gesture 105 // provider. This avoids any invalid reference while routing ACKs for events 106 // that may arise post |TransferEventsTo()| function call. 107 // See http://crbug.com/698843 for more info. 108 std::map<uint32_t, GestureProviderAura*> event_to_gesture_provider_; 109 110 // |touch_id_target_| maps a touch-id to its target window. 111 // touch-ids are removed from |touch_id_target_| on 112 // ET_TOUCH_RELEASE and ET_TOUCH_CANCEL. 113 TouchIdToConsumerMap touch_id_target_; 114 115 std::vector<GestureEventHelper*> helpers_; 116 117 DISALLOW_COPY_AND_ASSIGN(GestureRecognizerImpl); 118 }; 119 120 } // namespace ui 121 122 #endif // UI_EVENTS_GESTURES_GESTURE_RECOGNIZER_IMPL_H_ 123