mirror of
https://github.com/libretro/bsnes-libretro.git
synced 2024-11-30 12:30:51 +00:00
143 lines
6.3 KiB
Objective-C
143 lines
6.3 KiB
Objective-C
#import "AppDelegate.h"
|
|
#include "GBButtons.h"
|
|
#include "GBView.h"
|
|
#include <Core/gb.h>
|
|
#import <Carbon/Carbon.h>
|
|
#import <JoyKit/JoyKit.h>
|
|
|
|
@implementation AppDelegate
|
|
{
|
|
NSWindow *preferences_window;
|
|
NSArray<NSView *> *preferences_tabs;
|
|
}
|
|
|
|
- (void) applicationDidFinishLaunching:(NSNotification *)notification
|
|
{
|
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
for (unsigned i = 0; i < GBButtonCount; i++) {
|
|
if ([[defaults objectForKey:button_to_preference_name(i, 0)] isKindOfClass:[NSString class]]) {
|
|
[defaults removeObjectForKey:button_to_preference_name(i, 0)];
|
|
}
|
|
}
|
|
[[NSUserDefaults standardUserDefaults] registerDefaults:@{
|
|
@"GBRight": @(kVK_RightArrow),
|
|
@"GBLeft": @(kVK_LeftArrow),
|
|
@"GBUp": @(kVK_UpArrow),
|
|
@"GBDown": @(kVK_DownArrow),
|
|
|
|
@"GBA": @(kVK_ANSI_X),
|
|
@"GBB": @(kVK_ANSI_Z),
|
|
@"GBSelect": @(kVK_Delete),
|
|
@"GBStart": @(kVK_Return),
|
|
|
|
@"GBTurbo": @(kVK_Space),
|
|
@"GBRewind": @(kVK_Tab),
|
|
@"GBSlow-Motion": @(kVK_Shift),
|
|
|
|
@"GBFilter": @"NearestNeighbor",
|
|
@"GBColorCorrection": @(GB_COLOR_CORRECTION_EMULATE_HARDWARE),
|
|
@"GBHighpassFilter": @(GB_HIGHPASS_REMOVE_DC_OFFSET),
|
|
@"GBRewindLength": @(10),
|
|
@"GBFrameBlendingMode": @([defaults boolForKey:@"DisableFrameBlending"]? GB_FRAME_BLENDING_MODE_DISABLED : GB_FRAME_BLENDING_MODE_ACCURATE),
|
|
|
|
@"GBDMGModel": @(GB_MODEL_DMG_B),
|
|
@"GBCGBModel": @(GB_MODEL_CGB_E),
|
|
@"GBSGBModel": @(GB_MODEL_SGB2),
|
|
@"GBRumbleMode": @(GB_RUMBLE_CARTRIDGE_ONLY),
|
|
}];
|
|
|
|
[JOYController startOnRunLoop:[NSRunLoop currentRunLoop] withOptions:@{
|
|
JOYAxes2DEmulateButtonsKey: @YES,
|
|
JOYHatsEmulateButtonsKey: @YES,
|
|
}];
|
|
|
|
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"GBNotificationsUsed"]) {
|
|
[NSUserNotificationCenter defaultUserNotificationCenter].delegate = self;
|
|
}
|
|
}
|
|
|
|
- (IBAction)toggleDeveloperMode:(id)sender
|
|
{
|
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
[defaults setBool:![defaults boolForKey:@"DeveloperMode"] forKey:@"DeveloperMode"];
|
|
}
|
|
|
|
- (IBAction)switchPreferencesTab:(id)sender
|
|
{
|
|
for (NSView *view in preferences_tabs) {
|
|
[view removeFromSuperview];
|
|
}
|
|
NSView *tab = preferences_tabs[[sender tag]];
|
|
NSRect old = [_preferencesWindow frame];
|
|
NSRect new = [_preferencesWindow frameRectForContentRect:tab.frame];
|
|
new.origin.x = old.origin.x;
|
|
new.origin.y = old.origin.y + (old.size.height - new.size.height);
|
|
[_preferencesWindow setFrame:new display:YES animate:_preferencesWindow.visible];
|
|
[_preferencesWindow.contentView addSubview:tab];
|
|
}
|
|
|
|
- (BOOL)validateMenuItem:(NSMenuItem *)anItem
|
|
{
|
|
if ([anItem action] == @selector(toggleDeveloperMode:)) {
|
|
[(NSMenuItem *)anItem setState:[[NSUserDefaults standardUserDefaults] boolForKey:@"DeveloperMode"]];
|
|
}
|
|
|
|
if (anItem == self.linkCableMenuItem) {
|
|
return [[NSDocumentController sharedDocumentController] documents].count > 1;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
- (void)menuNeedsUpdate:(NSMenu *)menu
|
|
{
|
|
NSMutableArray *items = [NSMutableArray array];
|
|
NSDocument *currentDocument = [[NSDocumentController sharedDocumentController] currentDocument];
|
|
|
|
for (NSDocument *document in [[NSDocumentController sharedDocumentController] documents]) {
|
|
if (document == currentDocument) continue;
|
|
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:document.displayName action:@selector(connectLinkCable:) keyEquivalent:@""];
|
|
item.representedObject = document;
|
|
item.image = [[NSWorkspace sharedWorkspace] iconForFile:document.fileURL.path];
|
|
[item.image setSize:NSMakeSize(16, 16)];
|
|
[items addObject:item];
|
|
}
|
|
menu.itemArray = items;
|
|
}
|
|
|
|
- (IBAction) showPreferences: (id) sender
|
|
{
|
|
NSArray *objects;
|
|
if (!_preferencesWindow) {
|
|
[[NSBundle mainBundle] loadNibNamed:@"Preferences" owner:self topLevelObjects:&objects];
|
|
NSToolbarItem *first_toolbar_item = [_preferencesWindow.toolbar.items firstObject];
|
|
_preferencesWindow.toolbar.selectedItemIdentifier = [first_toolbar_item itemIdentifier];
|
|
preferences_tabs = @[self.emulationTab, self.graphicsTab, self.audioTab, self.controlsTab];
|
|
[self switchPreferencesTab:first_toolbar_item];
|
|
[_preferencesWindow center];
|
|
}
|
|
[_preferencesWindow makeKeyAndOrderFront:self];
|
|
}
|
|
|
|
- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender
|
|
{
|
|
/* Bring an existing panel to the foreground */
|
|
for (NSWindow *window in [[NSApplication sharedApplication] windows]) {
|
|
if ([window isKindOfClass:[NSOpenPanel class]]) {
|
|
[(NSOpenPanel *)window makeKeyAndOrderFront:nil];
|
|
return true;
|
|
}
|
|
}
|
|
[[NSDocumentController sharedDocumentController] openDocument:self];
|
|
return true;
|
|
}
|
|
|
|
- (void)userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification
|
|
{
|
|
[[NSDocumentController sharedDocumentController] openDocumentWithContentsOfFile:notification.identifier display:YES];
|
|
}
|
|
|
|
- (IBAction)nop:(id)sender
|
|
{
|
|
}
|
|
@end
|