blob: c62661985ea010d2c3e0d2b38ab9dbd3ff56cd6a [file] [log] [blame]
/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkTypes.h"
#include "tools/sk_app/Application.h"
#include "tools/sk_app/ios/Window_ios.h"
#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>
#if __has_feature(objc_arc)
#error "File should not be compiled with ARC."
#endif
namespace {
static int gArgc;
static char** gArgv;
}
////////////////////////////////////////////////////////////////////
@interface AppDelegate : UIResponder<UIApplicationDelegate>
@end
@implementation AppDelegate {
CADisplayLink* fDisplayLink; // Owned by the run loop.
std::unique_ptr<sk_app::Application> fApp;
}
#pragma mark - UIApplicationDelegate
- (void)applicationWillResignActive:(UIApplication *)sender {
sk_app::Window_ios* mainWindow = sk_app::Window_ios::MainWindow();
if (mainWindow) {
mainWindow->onActivate(false);
}
}
- (void)applicationDidBecomeActive:(UIApplication *)sender {
sk_app::Window_ios* mainWindow = sk_app::Window_ios::MainWindow();
if (mainWindow) {
mainWindow->onActivate(true);
}
}
- (void)applicationWillTerminate:(UIApplication *)sender {
// Display link retains us, so we break the cycle now.
// Note: dealloc is never called.
[fDisplayLink invalidate];
fDisplayLink = nil;
fApp.reset();
}
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
fApp = std::unique_ptr<sk_app::Application>(sk_app::Application::Create(gArgc, gArgv, nullptr));
auto mainWindow = sk_app::Window_ios::MainWindow();
mainWindow->onActivate(application.applicationState == UIApplicationStateActive);
fDisplayLink = [CADisplayLink displayLinkWithTarget:self
selector:@selector(displayLinkFired)];
[fDisplayLink addToRunLoop:NSRunLoop.mainRunLoop forMode:NSRunLoopCommonModes];
return YES;
}
- (void)displayLinkFired {
// TODO: Hook into CAMetalLayer's drawing event loop or our own run loop observer.
// Need to handle animated slides/redraw mode, so we need something that will wake up the
// run loop.
sk_app::Window_ios::PaintWindow();
fApp->onIdle();
}
@end
///////////////////////////////////////////////////////////////////
int main(int argc, char **argv) {
gArgc = argc;
gArgv = argv;
return UIApplicationMain(argc, argv, nil, @"AppDelegate");
}