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

Side by Side Diff: ui/events/gestures/gesture_sequence.h

Issue 458363002: Remove old Aura Gesture Detection Pipeline. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address sadrul's comment, and rebase. Created 6 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 | Annotate | Revision Log
« no previous file with comments | « ui/events/gestures/gesture_recognizer_impl.cc ('k') | ui/events/gestures/gesture_sequence.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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_SEQUENCE_H_
6 #define UI_EVENTS_GESTURES_GESTURE_SEQUENCE_H_
7
8 #include "base/timer/timer.h"
9 #include "ui/events/event_constants.h"
10 #include "ui/events/gesture_event_details.h"
11 #include "ui/events/gestures/gesture_point.h"
12 #include "ui/events/gestures/gesture_recognizer.h"
13 #include "ui/gfx/rect.h"
14
15 namespace ui {
16 class TouchEvent;
17 class GestureEvent;
18
19 // Gesture state.
20 enum GestureState {
21 GS_NO_GESTURE,
22 GS_PENDING_SYNTHETIC_CLICK,
23 // One finger is down: tap could occur, but scroll cannot until the number of
24 // active touch points changes.
25 GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL,
26 // One finger is down: no gestures can occur until the number of active touch
27 // points changes.
28 GS_SYNTHETIC_CLICK_ABORTED,
29 GS_SCROLL,
30 GS_PINCH,
31 GS_PENDING_TWO_FINGER_TAP,
32 GS_PENDING_TWO_FINGER_TAP_NO_PINCH,
33 GS_PENDING_PINCH,
34 GS_PENDING_PINCH_NO_PINCH,
35 };
36
37 enum ScrollType {
38 ST_FREE,
39 ST_HORIZONTAL,
40 ST_VERTICAL,
41 };
42
43 enum IsFirstScroll {
44 FS_FIRST_SCROLL,
45 FS_NOT_FIRST_SCROLL,
46 };
47
48 // Delegates dispatch of gesture events for which the GestureSequence does not
49 // have enough context to dispatch itself.
50 class EVENTS_EXPORT GestureSequenceDelegate {
51 public:
52 virtual void DispatchPostponedGestureEvent(GestureEvent* event) = 0;
53
54 protected:
55 virtual ~GestureSequenceDelegate() {}
56 };
57
58 // A GestureSequence recognizes gestures from touch sequences.
59 class EVENTS_EXPORT GestureSequence {
60 public:
61 // Maximum number of points in a single gesture.
62 static const int kMaxGesturePoints = 12;
63
64 explicit GestureSequence(GestureSequenceDelegate* delegate);
65 virtual ~GestureSequence();
66
67 typedef GestureRecognizer::Gestures Gestures;
68
69 // Invoked for each touch event that could contribute to the current gesture.
70 // Returns list of zero or more GestureEvents identified after processing
71 // TouchEvent.
72 // Caller would be responsible for freeing up Gestures.
73 virtual Gestures* ProcessTouchEventForGesture(const TouchEvent& event,
74 EventResult status);
75 const GesturePoint* points() const { return points_; }
76 int point_count() const { return point_count_; }
77
78 const gfx::PointF& last_touch_location() const {
79 return last_touch_location_;
80 }
81
82 protected:
83 virtual base::OneShotTimer<GestureSequence>* CreateTimer();
84 base::OneShotTimer<GestureSequence>* GetLongPressTimer();
85 base::OneShotTimer<GestureSequence>* GetShowPressTimer();
86
87 private:
88 // Recreates the axis-aligned bounding box that contains all the touch-points
89 // at their most recent position.
90 void RecreateBoundingBox();
91
92 void ResetVelocities();
93
94 GesturePoint& GesturePointForEvent(const TouchEvent& event);
95
96 // Do a linear scan through points_ to find the GesturePoint
97 // with id |point_id|.
98 GesturePoint* GetPointByPointId(int point_id);
99
100 bool IsSecondTouchDownCloseEnoughForTwoFingerTap();
101
102 // Creates a gesture event with the specified parameters. The function
103 // includes some common information (e.g. number of touch-points in the
104 // gesture etc.) in the gesture event as well.
105 GestureEvent* CreateGestureEvent(const GestureEventDetails& details,
106 const gfx::PointF& location,
107 int flags,
108 base::Time timestamp,
109 int oldest_touch_id);
110
111 // Functions to be called to add GestureEvents, after successful recognition.
112
113 // Tap gestures.
114 void AppendTapDownGestureEvent(const GesturePoint& point, Gestures* gestures);
115 void PrependTapCancelGestureEvent(const GesturePoint& point,
116 Gestures* gestures);
117 void AppendBeginGestureEvent(const GesturePoint& point, Gestures* gestures);
118 void AppendEndGestureEvent(const GesturePoint& point, Gestures* gestures);
119 void AppendClickGestureEvent(const GesturePoint& point,
120 int tap_count,
121 Gestures* gestures);
122 void AppendDoubleClickGestureEvent(const GesturePoint& point,
123 Gestures* gestures);
124 void AppendLongPressGestureEvent();
125 void AppendShowPressGestureEvent();
126 void AppendLongTapGestureEvent(const GesturePoint& point,
127 Gestures* gestures);
128
129 // Scroll gestures.
130 void AppendScrollGestureBegin(const GesturePoint& point,
131 const gfx::PointF& location,
132 Gestures* gestures);
133 void AppendScrollGestureEnd(const GesturePoint& point,
134 const gfx::PointF& location,
135 Gestures* gestures,
136 float x_velocity,
137 float y_velocity);
138 void AppendScrollGestureUpdate(GesturePoint& point,
139 Gestures* gestures,
140 IsFirstScroll is_first_scroll);
141
142 // Pinch gestures.
143 void AppendPinchGestureBegin(const GesturePoint& p1,
144 const GesturePoint& p2,
145 Gestures* gestures);
146 void AppendPinchGestureEnd(const GesturePoint& p1,
147 const GesturePoint& p2,
148 float scale,
149 Gestures* gestures);
150 void AppendPinchGestureUpdate(const GesturePoint& point,
151 float scale,
152 Gestures* gestures);
153 void AppendSwipeGesture(const GesturePoint& point,
154 int swipe_x,
155 int swipe_y,
156 Gestures* gestures);
157 void AppendTwoFingerTapGestureEvent(Gestures* gestures);
158
159 void set_state(const GestureState state) { state_ = state; }
160
161 // Various GestureTransitionFunctions for a signature.
162 // There is, 1:many mapping from GestureTransitionFunction to Signature
163 // But a Signature have only one GestureTransitionFunction.
164 bool Click(const TouchEvent& event,
165 const GesturePoint& point,
166 Gestures* gestures);
167 bool ScrollStart(const TouchEvent& event,
168 GesturePoint& point,
169 Gestures* gestures);
170 void BreakRailScroll(const TouchEvent& event,
171 GesturePoint& point,
172 Gestures* gestures);
173 bool ScrollUpdate(const TouchEvent& event,
174 GesturePoint& point,
175 Gestures* gestures,
176 IsFirstScroll is_first_scroll);
177 bool TouchDown(const TouchEvent& event,
178 const GesturePoint& point,
179 Gestures* gestures);
180 bool TwoFingerTouchDown(const TouchEvent& event,
181 const GesturePoint& point,
182 Gestures* gestures);
183 bool TwoFingerTouchMove(const TouchEvent& event,
184 const GesturePoint& point,
185 Gestures* gestures);
186 bool TwoFingerTouchReleased(const TouchEvent& event,
187 const GesturePoint& point,
188 Gestures* gestures);
189 bool ScrollEnd(const TouchEvent& event,
190 GesturePoint& point,
191 Gestures* gestures);
192 bool PinchStart(const TouchEvent& event,
193 const GesturePoint& point,
194 Gestures* gestures);
195 bool PinchUpdate(const TouchEvent& event,
196 GesturePoint& point,
197 Gestures* gestures);
198 bool PinchEnd(const TouchEvent& event,
199 const GesturePoint& point,
200 Gestures* gestures);
201 bool MaybeSwipe(const TouchEvent& event,
202 const GesturePoint& point,
203 Gestures* gestures);
204
205 void TwoFingerTapOrPinch(const TouchEvent& event,
206 const GesturePoint& point,
207 Gestures* gestures);
208
209 void StopTimersIfRequired(const TouchEvent& event);
210
211 void StartRailFreeScroll(const GesturePoint& point, Gestures* gestures);
212
213 // Current state of gesture recognizer.
214 GestureState state_;
215
216 // ui::EventFlags.
217 int flags_;
218
219 // We maintain the smallest axis-aligned rectangle that contains all the
220 // current touch-points. This box is updated after every touch-event.
221 gfx::RectF bounding_box_;
222
223 // The center of the bounding box used in the latest multi-finger scroll
224 // update gesture.
225 gfx::PointF latest_multi_scroll_update_location_;
226
227 // The last scroll update prediction offset. This is removed from the scroll
228 // distance on the next update since the page has already been scrolled this
229 // distance.
230 gfx::Vector2dF last_scroll_prediction_offset_;
231
232 // For pinch, the 'distance' represents the diagonal distance of
233 // |bounding_box_|.
234
235 // The distance between the two points at PINCH_START.
236 float pinch_distance_start_;
237
238 // This distance is updated after each PINCH_UPDATE.
239 float pinch_distance_current_;
240
241 // This is the time when second touch down was received. Used for determining
242 // if a two finger double tap has happened.
243 base::TimeDelta second_touch_time_;
244
245 ScrollType scroll_type_;
246 scoped_ptr<base::OneShotTimer<GestureSequence> > long_press_timer_;
247 scoped_ptr<base::OneShotTimer<GestureSequence> > show_press_timer_;
248
249 GesturePoint points_[kMaxGesturePoints];
250 int point_count_;
251
252 // Location of the last touch event.
253 gfx::PointF last_touch_location_;
254
255 GestureSequenceDelegate* delegate_;
256
257 DISALLOW_COPY_AND_ASSIGN(GestureSequence);
258 };
259
260 } // namespace ui
261
262 #endif // UI_EVENTS_GESTURES_GESTURE_SEQUENCE_H_
OLDNEW
« no previous file with comments | « ui/events/gestures/gesture_recognizer_impl.cc ('k') | ui/events/gestures/gesture_sequence.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698