• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2* Copyright 2019 Google Inc.
3*
4* Use of this source code is governed by a BSD-style license that can be
5* found in the LICENSE file.
6*/
7
8#import <Cocoa/Cocoa.h>
9
10#include "tools/sk_app/Application.h"
11#include "tools/sk_app/mac/Window_mac.h"
12
13@interface AppDelegate : NSObject<NSApplicationDelegate, NSWindowDelegate>
14
15@property (nonatomic, assign) BOOL done;
16
17@end
18
19@implementation AppDelegate : NSObject
20
21@synthesize done = _done;
22
23- (id)init {
24    self = [super init];
25    _done = FALSE;
26    return self;
27}
28
29- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
30    _done = TRUE;
31    return NSTerminateCancel;
32}
33
34- (void)applicationDidFinishLaunching:(NSNotification *)notification {
35    [NSApp stop:nil];
36}
37
38@end
39
40///////////////////////////////////////////////////////////////////////////////////////////
41
42using sk_app::Application;
43using sk_app::Window_mac;
44
45int main(int argc, char * argv[]) {
46#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070
47    // we only run on systems that support at least Core Profile 3.2
48    return EXIT_FAILURE;
49#endif
50
51    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
52    [NSApplication sharedApplication];
53
54    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
55
56    //Create the application menu.
57    NSMenu* menuBar=[[NSMenu alloc] initWithTitle:@"AMainMenu"];
58    [NSApp setMainMenu:menuBar];
59
60    NSMenuItem* item;
61    NSMenu* subMenu;
62
63    item=[[NSMenuItem alloc] initWithTitle:@"Apple" action:nil keyEquivalent:@""];
64    [menuBar addItem:item];
65    subMenu=[[NSMenu alloc] initWithTitle:@"Apple"];
66    [menuBar setSubmenu:subMenu forItem:item];
67    [item release];
68    item=[[NSMenuItem alloc] initWithTitle:@"Quit" action:@selector(terminate:) keyEquivalent:@"q"];
69    [subMenu addItem:item];
70    [item release];
71    [subMenu release];
72
73    // Set AppDelegate to catch certain global events
74    AppDelegate* appDelegate = [[AppDelegate alloc] init];
75    [NSApp setDelegate:appDelegate];
76
77    Application* app = Application::Create(argc, argv, nullptr);
78
79    // This will run until the application finishes launching, then lets us take over
80    [NSApp run];
81
82    // Now we process the events
83    while (![appDelegate done]) {
84        NSEvent* event;
85        do {
86            event = [NSApp nextEventMatchingMask:NSAnyEventMask
87                                       untilDate:[NSDate distantPast]
88                                          inMode:NSDefaultRunLoopMode
89                                         dequeue:YES];
90            [NSApp sendEvent:event];
91        } while (event != nil);
92
93        [pool drain];
94        pool = [[NSAutoreleasePool alloc] init];
95
96        // Rather than depending on a Mac event to drive this, we treat our window
97        // invalidation flag as a separate event stream. Window::onPaint() will clear
98        // the invalidation flag, effectively removing it from the stream.
99        Window_mac::PaintWindows();
100
101        app->onIdle();
102    }
103
104    delete app;
105
106    [NSApp setDelegate:nil];
107    [appDelegate release];
108
109    [menuBar release];
110    [pool release];
111
112    return EXIT_SUCCESS;
113}
114