skia2/tools/sk_app/mac/main_mac.mm
Jim Van Verth 87bda3dabe Fix Mac viewer on command line launch.
If you launch the Mac viewer from the command line, it will sit there
until you click on the thumbnail in the dock, and only then will bring
up the window. This fixes that so it will open the window immediately.

Change-Id: I5628dc6c59833f808a61dedde457774114dd0e94
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/222783
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2019-06-21 15:45:22 +00:00

114 lines
3.0 KiB
Plaintext

/*
* Copyright 2019 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#import <Cocoa/Cocoa.h>
#include "tools/sk_app/Application.h"
#include "tools/sk_app/mac/Window_mac.h"
@interface AppDelegate : NSObject<NSApplicationDelegate, NSWindowDelegate>
@property (nonatomic, assign) BOOL done;
@end
@implementation AppDelegate : NSObject
@synthesize done = _done;
- (id)init {
self = [super init];
_done = FALSE;
return self;
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
_done = TRUE;
return NSTerminateCancel;
}
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
[NSApp stop:nil];
}
@end
///////////////////////////////////////////////////////////////////////////////////////////
using sk_app::Application;
using sk_app::Window_mac;
int main(int argc, char * argv[]) {
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070
// we only run on systems that support at least Core Profile 3.2
return EXIT_FAILURE;
#endif
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
[NSApplication sharedApplication];
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
//Create the application menu.
NSMenu* menuBar=[[NSMenu alloc] initWithTitle:@"AMainMenu"];
[NSApp setMainMenu:menuBar];
NSMenuItem* item;
NSMenu* subMenu;
item=[[NSMenuItem alloc] initWithTitle:@"Apple" action:NULL keyEquivalent:@""];
[menuBar addItem:item];
subMenu=[[NSMenu alloc] initWithTitle:@"Apple"];
[menuBar setSubmenu:subMenu forItem:item];
[item release];
item=[[NSMenuItem alloc] initWithTitle:@"Quit" action:@selector(terminate:) keyEquivalent:@"q"];
[subMenu addItem:item];
[item release];
[subMenu release];
// Set AppDelegate to catch certain global events
AppDelegate* appDelegate = [[AppDelegate alloc] init];
[NSApp setDelegate:appDelegate];
Application* app = Application::Create(argc, argv, nullptr);
// This will run until the application finishes launching, then lets us take over
[NSApp run];
// Now we process the events
while (![appDelegate done]) {
NSEvent* event;
do {
event = [NSApp nextEventMatchingMask:NSAnyEventMask
untilDate:[NSDate distantPast]
inMode:NSDefaultRunLoopMode
dequeue:YES];
[NSApp sendEvent:event];
} while (event != nil);
[pool drain];
pool = [[NSAutoreleasePool alloc] init];
// Rather than depending on a Mac event to drive this, we treat our window
// invalidation flag as a separate event stream. Window::onPaint() will clear
// the invalidation flag, effectively removing it from the stream.
Window_mac::PaintWindows();
app->onIdle();
}
delete app;
[NSApp setDelegate:nil];
[appDelegate release];
[menuBar release];
[pool release];
return EXIT_SUCCESS;
}