fbneo/projectfiles/xcode/Emulator/AppDelegate.m

210 lines
5.7 KiB
Objective-C

// Copyright (c) Akop Karapetyan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import "AppDelegate.h"
#import <IOKit/pwr_mgt/IOPMLib.h>
#import "FBEmulatorController.h"
#import "FBLogViewerController.h"
#import "FBPreferencesController.h"
#import "FBLauncherController.h"
#import "FBAboutController.h"
@interface AppDelegate ()
- (NSString *) appSupportPath;
@end
static AppDelegate *sharedInstance = nil;
@implementation AppDelegate
{
FBLogViewerController *logViewer;
FBPreferencesController *prefs;
FBEmulatorController *emulator;
FBLauncherController *launcher;
FBAboutController *about;
IOPMAssertionID sleepAssertId;
}
- (void) awakeFromNib
{
sleepAssertId = kIOPMNullAssertionID;
sharedInstance = self;
_audio = [FBAudio new];
_input = [FBInput new];
_supportedFormats = [NSSet setWithArray:@[ @"zip", @"7z" ]];
_runloop = [FBMainThread new];
_video = [FBVideo new];
}
+ (AppDelegate *) sharedInstance
{
return sharedInstance;
}
#pragma mark - NSApplicationDelegate
- (void) applicationWillFinishLaunching:(NSNotification *) notification
{
NSString *path = [NSBundle.mainBundle pathForResource:@"Defaults"
ofType:@"plist"];
[NSUserDefaults.standardUserDefaults registerDefaults:[NSDictionary dictionaryWithContentsOfFile:path]];
_supportPath = self.appSupportPath;
_romPath = [_supportPath stringByAppendingPathComponent:@"ROMs"];
_nvramPath = [_supportPath stringByAppendingPathComponent:@"NVRAM"];
_dipSwitchPath = [_supportPath stringByAppendingPathComponent:@"DIPSwitches"];
_inputMapPath = [_supportPath stringByAppendingPathComponent:@"InputMaps"];
NSArray *paths = @[
_romPath,
_nvramPath,
_dipSwitchPath,
_inputMapPath,
];
for (NSString *path in paths)
if (![NSFileManager.defaultManager fileExistsAtPath:path])
[NSFileManager.defaultManager createDirectoryAtPath:path
withIntermediateDirectories:YES
attributes:nil
error:NULL];
}
- (void) applicationDidFinishLaunching:(NSNotification *) aNotification {
NSLog(@"applicationDidFinishLaunching");
emulator = [FBEmulatorController new];
[emulator window]; // Trigger awakeFromNib
launcher = [FBLauncherController new];
[launcher showWindow:self];
[_runloop start];
}
- (void) applicationWillTerminate:(NSNotification *) aNotification {
NSLog(@"applicationWillTerminate");
[_runloop cancel];
// Give the emulation thread some time to finish
NSDate *start = [NSDate date];
while (!_runloop.isFinished && start.timeIntervalSinceNow > -2)
[NSThread sleepForTimeInterval:0.25];
}
- (BOOL) application:(NSApplication *) sender
openFile:(NSString *) filename
{
NSLog(@"application:openFile:");
[self loadPath:filename];
return YES;
}
#pragma mark - Actions
- (void) openDocument:(id) sender
{
NSOpenPanel* panel = [NSOpenPanel openPanel];
panel.title = NSLocalizedString(@"Open", nil);
panel.canChooseFiles = YES;
panel.canChooseDirectories = NO;
panel.allowsMultipleSelection = NO;
panel.allowedFileTypes = _supportedFormats.allObjects;
[panel beginWithCompletionHandler:^(NSInteger result){
if (result == NSModalResponseOK)
[self loadPath:panel.URLs.firstObject.path];
}];
}
- (void) displayLogViewer:(id) sender
{
if (!logViewer)
logViewer = [FBLogViewerController new];
[logViewer showWindow:self];
}
- (void) displayPreferences:(id) sender
{
if (!prefs)
prefs = [FBPreferencesController new];
[prefs showWindow:self];
}
- (void) displayLauncher:(id) sender
{
if (!launcher)
launcher = [FBLauncherController new];
[launcher showWindow:self];
}
- (void) displayAbout:(id) sender
{
if (!about)
about = [FBAboutController new];
[about showWindow:self];
}
#pragma mark - Public
- (void) loadPath:(NSString *) path
{
[_runloop load:path];
[NSDocumentController.sharedDocumentController noteNewRecentDocumentURL:[NSURL fileURLWithPath:path]];
[emulator showWindow:self];
}
- (void) suppressScreenSaver
{
if (sleepAssertId == kIOPMNullAssertionID) {
IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep,
kIOPMAssertionLevelOn,
(__bridge CFStringRef) @"FBNeo",
&sleepAssertId);
#if DEBUG
NSLog(@"suppressScreenSaver");
#endif
}
}
- (void) restoreScreenSaver
{
if (sleepAssertId != kIOPMNullAssertionID) {
IOPMAssertionRelease(sleepAssertId);
sleepAssertId = kIOPMNullAssertionID;
#if DEBUG
NSLog(@"restoreScreenSaver");
#endif
}
}
#pragma mark - Private
- (NSString *) appSupportPath
{
NSURL *url = [NSFileManager.defaultManager URLsForDirectory:NSApplicationSupportDirectory
inDomains:NSUserDomainMask].lastObject;
return [url URLByAppendingPathComponent:NSBundle.mainBundle.infoDictionary[(NSString *)kCFBundleNameKey]].path;
}
@end