Index: sky/shell/ios/sky_surface.mm |
diff --git a/sky/shell/ios/sky_surface.mm b/sky/shell/ios/sky_surface.mm |
index c04a30351cbf8ee51725aa99d30d639c208980a8..ee797e768607c5830299d3899c33a46cd3bd6293 100644 |
--- a/sky/shell/ios/sky_surface.mm |
+++ b/sky/shell/ios/sky_surface.mm |
@@ -35,6 +35,28 @@ static inline sky::EventType EventTypeFromUITouchPhase(UITouchPhase phase) { |
return sky::EVENT_TYPE_UNKNOWN; |
} |
+static inline int64 InputEventTimestampFromNSTimeInterval( |
+ NSTimeInterval interval) { |
+ return base::TimeDelta::FromSecondsD(interval).InMilliseconds(); |
+} |
+ |
+static sky::InputEventPtr BasicInputEventFromRecognizer( |
+ sky::EventType type, |
+ UIGestureRecognizer* recognizer) { |
+ auto input = sky::InputEvent::New(); |
+ input->type = type; |
+ input->time_stamp = InputEventTimestampFromNSTimeInterval( |
+ CACurrentMediaTime()); |
+ |
+ input->gesture_data = sky::GestureData::New(); |
+ |
+ CGPoint windowCoordinates = [recognizer locationInView:nil]; |
+ const CGFloat scale = [UIScreen mainScreen].scale; |
+ input->gesture_data->x = windowCoordinates.x * scale; |
+ input->gesture_data->y = windowCoordinates.y * scale; |
+ return input.Pass(); |
kulakowski
2015/06/16 19:58:08
Pretty sure you can just return.
|
+} |
+ |
@implementation SkySurface { |
BOOL _platformViewInitialized; |
@@ -44,8 +66,10 @@ static inline sky::EventType EventTypeFromUITouchPhase(UITouchPhase phase) { |
-(instancetype) initWithShellView:(sky::shell::ShellView *) shellView { |
self = [super init]; |
- if (self) |
+ if (self) { |
_shell_view.reset(shellView); |
+ [self installGestureRecognizers]; |
+ } |
return self; |
} |
@@ -123,9 +147,7 @@ static inline sky::EventType EventTypeFromUITouchPhase(UITouchPhase phase) { |
for (UITouch* touch in touches) { |
auto input = sky::InputEvent::New(); |
input->type = eventType; |
- |
- auto timedelta = base::TimeDelta::FromSecondsD(touch.timestamp); |
- input->time_stamp = timedelta.InMilliseconds(); |
+ input->time_stamp = InputEventTimestampFromNSTimeInterval(touch.timestamp); |
input->pointer_data = sky::PointerData::New(); |
input->pointer_data->kind = sky::POINTER_KIND_TOUCH; |
@@ -155,6 +177,111 @@ static inline sky::EventType EventTypeFromUITouchPhase(UITouchPhase phase) { |
[self dispatchTouches:touches phase:UITouchPhaseCancelled]; |
} |
+#pragma mark - Gesture Recognizers |
+ |
+-(void) installGestureRecognizers { |
+ // For: |
+ // GESTURE_FLING_CANCEL |
+ // GESTURE_FLING_START |
+ UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] |
+ initWithTarget:self action:@selector(onFling:)]; |
+ [self addGestureRecognizer: swipe]; |
+ [swipe release]; |
+ |
+ // For: |
+ // GESTURE_LONG_PRESS |
+ // GESTURE_SHOW_PRESS |
+ UILongPressGestureRecognizer *longPress = |
+ [[UILongPressGestureRecognizer alloc] |
+ initWithTarget:self action:@selector(onLongPress:)]; |
+ [self addGestureRecognizer: longPress]; |
+ [longPress release]; |
+ |
+ // For: |
+ // GESTURE_SCROLL_BEGIN |
+ // GESTURE_SCROLL_END |
+ // GESTURE_SCROLL_UPDATE |
+ UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] |
+ initWithTarget:self action:@selector(onScroll:)]; |
+ [self addGestureRecognizer: pan]; |
+ [pan release]; |
+ |
+ // For: |
+ // GESTURE_TAP |
+ // GESTURE_TAP_DOWN |
+ UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] |
+ initWithTarget:self action:@selector(onTap:)]; |
+ [self addGestureRecognizer: tap]; |
+ [tap release]; |
+} |
+ |
+-(void) onFling:(UISwipeGestureRecognizer *) recognizer { |
+ // Swipes are discrete gestures already. So there is no equivalent to a cancel |
+ if (recognizer.state != UIGestureRecognizerStateEnded) { |
+ return; |
+ } |
+ |
+ auto input = BasicInputEventFromRecognizer( |
+ sky::EVENT_TYPE_GESTURE_FLING_START, recognizer); |
+ _viewport_observer->OnInputEvent(input.Pass()); |
+} |
+ |
+-(void) onLongPress:(UILongPressGestureRecognizer *) recognizer { |
+ if (recognizer.state != UIGestureRecognizerStateEnded) { |
+ return; |
+ } |
+ |
+ auto input = BasicInputEventFromRecognizer(sky::EVENT_TYPE_GESTURE_LONG_PRESS, |
+ recognizer); |
+ _viewport_observer->OnInputEvent(input.Pass()); |
+} |
+ |
+-(void) onScroll:(UIPanGestureRecognizer *) recognizer { |
+ sky::EventType type = sky::EVENT_TYPE_UNKNOWN; |
+ switch (recognizer.state) { |
+ case UIGestureRecognizerStateBegan: |
+ type = sky::EVENT_TYPE_GESTURE_SCROLL_BEGIN; |
+ break; |
+ case UIGestureRecognizerStateChanged: |
+ type = sky::EVENT_TYPE_GESTURE_SCROLL_UPDATE; |
+ break; |
+ case UIGestureRecognizerStateEnded: |
+ case UIGestureRecognizerStateCancelled: |
+ case UIGestureRecognizerStateFailed: |
+ type = sky::EVENT_TYPE_GESTURE_SCROLL_END; |
+ break; |
+ default: |
+ break; |
+ } |
+ |
+ if (type == sky::EVENT_TYPE_UNKNOWN) { |
+ return; |
+ } |
+ |
+ auto input = BasicInputEventFromRecognizer(type, recognizer); |
+ auto scale = [UIScreen mainScreen].scale; |
+ auto translation = [recognizer translationInView: self]; |
+ auto velocity = [recognizer velocityInView: self]; |
+ |
+ input->gesture_data->dx = translation.x * scale; |
+ input->gesture_data->dy = translation.y * scale; |
+ input->gesture_data->velocityX = velocity.x * scale; |
+ input->gesture_data->velocityY = velocity.y * scale; |
+ |
+ _viewport_observer->OnInputEvent(input.Pass()); |
+} |
+ |
+-(void) onTap:(UITapGestureRecognizer *) recognizer { |
+ |
+ if (recognizer.state != UIGestureRecognizerStateEnded) { |
+ return; |
+ } |
+ |
+ auto input = BasicInputEventFromRecognizer(sky::EVENT_TYPE_GESTURE_TAP, |
+ recognizer); |
+ _viewport_observer->OnInputEvent(input.Pass()); |
+} |
+ |
#pragma mark - Misc. |
+ (Class)layerClass { |