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