OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 #import "sky_surface.h" | 5 #import "sky_surface.h" |
6 | 6 |
7 #import <QuartzCore/QuartzCore.h> | 7 #import <QuartzCore/QuartzCore.h> |
8 #import <OpenGLES/EAGL.h> | 8 #import <OpenGLES/EAGL.h> |
9 #import <OpenGLES/EAGLDrawable.h> | 9 #import <OpenGLES/EAGLDrawable.h> |
10 | 10 |
(...skipping 17 matching lines...) Expand all Loading... | |
28 return sky::EVENT_TYPE_POINTER_MOVE; | 28 return sky::EVENT_TYPE_POINTER_MOVE; |
29 case UITouchPhaseEnded: | 29 case UITouchPhaseEnded: |
30 return sky::EVENT_TYPE_POINTER_UP; | 30 return sky::EVENT_TYPE_POINTER_UP; |
31 case UITouchPhaseCancelled: | 31 case UITouchPhaseCancelled: |
32 return sky::EVENT_TYPE_POINTER_CANCEL; | 32 return sky::EVENT_TYPE_POINTER_CANCEL; |
33 } | 33 } |
34 | 34 |
35 return sky::EVENT_TYPE_UNKNOWN; | 35 return sky::EVENT_TYPE_UNKNOWN; |
36 } | 36 } |
37 | 37 |
38 static inline int64 InputEventTimestampFromNSTimeInterval( | |
39 NSTimeInterval interval) { | |
40 return base::TimeDelta::FromSecondsD(interval).InMilliseconds(); | |
41 } | |
42 | |
43 static sky::InputEventPtr BasicInputEventFromRecognizer( | |
44 sky::EventType type, | |
45 UIGestureRecognizer* recognizer) { | |
46 auto input = sky::InputEvent::New(); | |
47 input->type = type; | |
48 input->time_stamp = InputEventTimestampFromNSTimeInterval( | |
49 CACurrentMediaTime()); | |
50 | |
51 input->gesture_data = sky::GestureData::New(); | |
52 | |
53 CGPoint windowCoordinates = [recognizer locationInView:nil]; | |
54 const CGFloat scale = [UIScreen mainScreen].scale; | |
55 input->gesture_data->x = windowCoordinates.x * scale; | |
56 input->gesture_data->y = windowCoordinates.y * scale; | |
57 return input.Pass(); | |
kulakowski
2015/06/16 19:58:08
Pretty sure you can just return.
| |
58 } | |
59 | |
38 @implementation SkySurface { | 60 @implementation SkySurface { |
39 BOOL _platformViewInitialized; | 61 BOOL _platformViewInitialized; |
40 | 62 |
41 sky::ViewportObserverPtr _viewport_observer; | 63 sky::ViewportObserverPtr _viewport_observer; |
42 scoped_ptr<sky::shell::ShellView> _shell_view; | 64 scoped_ptr<sky::shell::ShellView> _shell_view; |
43 } | 65 } |
44 | 66 |
45 -(instancetype) initWithShellView:(sky::shell::ShellView *) shellView { | 67 -(instancetype) initWithShellView:(sky::shell::ShellView *) shellView { |
46 self = [super init]; | 68 self = [super init]; |
47 if (self) | 69 if (self) { |
48 _shell_view.reset(shellView); | 70 _shell_view.reset(shellView); |
71 [self installGestureRecognizers]; | |
72 } | |
49 return self; | 73 return self; |
50 } | 74 } |
51 | 75 |
52 - (gfx::AcceleratedWidget)acceleratedWidget { | 76 - (gfx::AcceleratedWidget)acceleratedWidget { |
53 return (gfx::AcceleratedWidget)self.layer; | 77 return (gfx::AcceleratedWidget)self.layer; |
54 } | 78 } |
55 | 79 |
56 - (void)layoutSubviews { | 80 - (void)layoutSubviews { |
57 [super layoutSubviews]; | 81 [super layoutSubviews]; |
58 | 82 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
116 | 140 |
117 #pragma mark - UIResponder overrides for raw touches | 141 #pragma mark - UIResponder overrides for raw touches |
118 | 142 |
119 - (void)dispatchTouches:(NSSet*)touches phase:(UITouchPhase)phase { | 143 - (void)dispatchTouches:(NSSet*)touches phase:(UITouchPhase)phase { |
120 auto eventType = EventTypeFromUITouchPhase(phase); | 144 auto eventType = EventTypeFromUITouchPhase(phase); |
121 const CGFloat scale = [UIScreen mainScreen].scale; | 145 const CGFloat scale = [UIScreen mainScreen].scale; |
122 | 146 |
123 for (UITouch* touch in touches) { | 147 for (UITouch* touch in touches) { |
124 auto input = sky::InputEvent::New(); | 148 auto input = sky::InputEvent::New(); |
125 input->type = eventType; | 149 input->type = eventType; |
126 | 150 input->time_stamp = InputEventTimestampFromNSTimeInterval(touch.timestamp); |
127 auto timedelta = base::TimeDelta::FromSecondsD(touch.timestamp); | |
128 input->time_stamp = timedelta.InMilliseconds(); | |
129 | 151 |
130 input->pointer_data = sky::PointerData::New(); | 152 input->pointer_data = sky::PointerData::New(); |
131 input->pointer_data->kind = sky::POINTER_KIND_TOUCH; | 153 input->pointer_data->kind = sky::POINTER_KIND_TOUCH; |
132 | 154 |
133 CGPoint windowCoordinates = [touch locationInView:nil]; | 155 CGPoint windowCoordinates = [touch locationInView:nil]; |
134 | 156 |
135 input->pointer_data->x = windowCoordinates.x * scale; | 157 input->pointer_data->x = windowCoordinates.x * scale; |
136 input->pointer_data->y = windowCoordinates.y * scale; | 158 input->pointer_data->y = windowCoordinates.y * scale; |
137 | 159 |
138 _viewport_observer->OnInputEvent(input.Pass()); | 160 _viewport_observer->OnInputEvent(input.Pass()); |
139 } | 161 } |
140 } | 162 } |
141 | 163 |
142 - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { | 164 - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { |
143 [self dispatchTouches:touches phase:UITouchPhaseBegan]; | 165 [self dispatchTouches:touches phase:UITouchPhaseBegan]; |
144 } | 166 } |
145 | 167 |
146 - (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { | 168 - (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { |
147 [self dispatchTouches:touches phase:UITouchPhaseMoved]; | 169 [self dispatchTouches:touches phase:UITouchPhaseMoved]; |
148 } | 170 } |
149 | 171 |
150 - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { | 172 - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { |
151 [self dispatchTouches:touches phase:UITouchPhaseEnded]; | 173 [self dispatchTouches:touches phase:UITouchPhaseEnded]; |
152 } | 174 } |
153 | 175 |
154 - (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event { | 176 - (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event { |
155 [self dispatchTouches:touches phase:UITouchPhaseCancelled]; | 177 [self dispatchTouches:touches phase:UITouchPhaseCancelled]; |
156 } | 178 } |
157 | 179 |
180 #pragma mark - Gesture Recognizers | |
181 | |
182 -(void) installGestureRecognizers { | |
183 // For: | |
184 // GESTURE_FLING_CANCEL | |
185 // GESTURE_FLING_START | |
186 UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] | |
187 initWithTarget:self action:@selector(onFling:)]; | |
188 [self addGestureRecognizer: swipe]; | |
189 [swipe release]; | |
190 | |
191 // For: | |
192 // GESTURE_LONG_PRESS | |
193 // GESTURE_SHOW_PRESS | |
194 UILongPressGestureRecognizer *longPress = | |
195 [[UILongPressGestureRecognizer alloc] | |
196 initWithTarget:self action:@selector(onLongPress:)]; | |
197 [self addGestureRecognizer: longPress]; | |
198 [longPress release]; | |
199 | |
200 // For: | |
201 // GESTURE_SCROLL_BEGIN | |
202 // GESTURE_SCROLL_END | |
203 // GESTURE_SCROLL_UPDATE | |
204 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] | |
205 initWithTarget:self action:@selector(onScroll:)]; | |
206 [self addGestureRecognizer: pan]; | |
207 [pan release]; | |
208 | |
209 // For: | |
210 // GESTURE_TAP | |
211 // GESTURE_TAP_DOWN | |
212 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] | |
213 initWithTarget:self action:@selector(onTap:)]; | |
214 [self addGestureRecognizer: tap]; | |
215 [tap release]; | |
216 } | |
217 | |
218 -(void) onFling:(UISwipeGestureRecognizer *) recognizer { | |
219 // Swipes are discrete gestures already. So there is no equivalent to a cancel | |
220 if (recognizer.state != UIGestureRecognizerStateEnded) { | |
221 return; | |
222 } | |
223 | |
224 auto input = BasicInputEventFromRecognizer( | |
225 sky::EVENT_TYPE_GESTURE_FLING_START, recognizer); | |
226 _viewport_observer->OnInputEvent(input.Pass()); | |
227 } | |
228 | |
229 -(void) onLongPress:(UILongPressGestureRecognizer *) recognizer { | |
230 if (recognizer.state != UIGestureRecognizerStateEnded) { | |
231 return; | |
232 } | |
233 | |
234 auto input = BasicInputEventFromRecognizer(sky::EVENT_TYPE_GESTURE_LONG_PRESS, | |
235 recognizer); | |
236 _viewport_observer->OnInputEvent(input.Pass()); | |
237 } | |
238 | |
239 -(void) onScroll:(UIPanGestureRecognizer *) recognizer { | |
240 sky::EventType type = sky::EVENT_TYPE_UNKNOWN; | |
241 switch (recognizer.state) { | |
242 case UIGestureRecognizerStateBegan: | |
243 type = sky::EVENT_TYPE_GESTURE_SCROLL_BEGIN; | |
244 break; | |
245 case UIGestureRecognizerStateChanged: | |
246 type = sky::EVENT_TYPE_GESTURE_SCROLL_UPDATE; | |
247 break; | |
248 case UIGestureRecognizerStateEnded: | |
249 case UIGestureRecognizerStateCancelled: | |
250 case UIGestureRecognizerStateFailed: | |
251 type = sky::EVENT_TYPE_GESTURE_SCROLL_END; | |
252 break; | |
253 default: | |
254 break; | |
255 } | |
256 | |
257 if (type == sky::EVENT_TYPE_UNKNOWN) { | |
258 return; | |
259 } | |
260 | |
261 auto input = BasicInputEventFromRecognizer(type, recognizer); | |
262 auto scale = [UIScreen mainScreen].scale; | |
263 auto translation = [recognizer translationInView: self]; | |
264 auto velocity = [recognizer velocityInView: self]; | |
265 | |
266 input->gesture_data->dx = translation.x * scale; | |
267 input->gesture_data->dy = translation.y * scale; | |
268 input->gesture_data->velocityX = velocity.x * scale; | |
269 input->gesture_data->velocityY = velocity.y * scale; | |
270 | |
271 _viewport_observer->OnInputEvent(input.Pass()); | |
272 } | |
273 | |
274 -(void) onTap:(UITapGestureRecognizer *) recognizer { | |
275 | |
276 if (recognizer.state != UIGestureRecognizerStateEnded) { | |
277 return; | |
278 } | |
279 | |
280 auto input = BasicInputEventFromRecognizer(sky::EVENT_TYPE_GESTURE_TAP, | |
281 recognizer); | |
282 _viewport_observer->OnInputEvent(input.Pass()); | |
283 } | |
284 | |
158 #pragma mark - Misc. | 285 #pragma mark - Misc. |
159 | 286 |
160 + (Class)layerClass { | 287 + (Class)layerClass { |
161 return [CAEAGLLayer class]; | 288 return [CAEAGLLayer class]; |
162 } | 289 } |
163 | 290 |
164 - (void)dealloc { | 291 - (void)dealloc { |
165 [self notifySurfaceDestruction]; | 292 [self notifySurfaceDestruction]; |
166 [super dealloc]; | 293 [super dealloc]; |
167 } | 294 } |
168 | 295 |
169 @end | 296 @end |
OLD | NEW |