From 3ab27a7d873a5500037978306d721c63e570c692 Mon Sep 17 00:00:00 2001 From: Soren Jorvang Date: Fri, 4 Jun 2010 04:59:07 +0000 Subject: [PATCH] Revert parts of r5576 and r5598 for Sonicadvance1's sake. This reenables the option for building without wx on OS X, but still leaves wxgl as the default. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5599 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/DolphinWX/Src/Frame.cpp | 2 +- Source/Core/DolphinWX/Src/MainNoGUI.cpp | 104 +++++++++++- Source/Core/DolphinWX/Src/SConscript | 46 +++--- Source/Core/DolphinWX/Src/cocoaApp.h | 15 ++ Source/Core/DolphinWX/Src/cocoaApp.m | 109 +++++++++++++ Source/Dolphin.xcodeproj/project.pbxproj | 24 +++ Source/Plugins/Plugin_GCPad/Src/GCPad.h | 3 + Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp | 21 +++ Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h | 11 +- Source/Plugins/Plugin_VideoOGL/Src/SConscript | 9 ++ Source/Plugins/Plugin_VideoOGL/Src/cocoaApp.h | 29 ++++ Source/Plugins/Plugin_VideoOGL/Src/cocoaApp.m | 149 ++++++++++++++++++ Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h | 28 ++++ Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.m | 149 ++++++++++++++++++ .../Plugin_VideoSoftware/Src/SConscript | 3 + 15 files changed, 676 insertions(+), 26 deletions(-) create mode 100644 Source/Core/DolphinWX/Src/cocoaApp.h create mode 100644 Source/Core/DolphinWX/Src/cocoaApp.m create mode 100644 Source/Plugins/Plugin_VideoOGL/Src/cocoaApp.h create mode 100755 Source/Plugins/Plugin_VideoOGL/Src/cocoaApp.m create mode 100644 Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h create mode 100755 Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.m diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index 4795bcf0cc..aeec0142ad 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -714,7 +714,7 @@ void CFrame::OnCustomHostMessage(int Id) CPluginManager::GetInstance().OpenDebug( GetHandle(), - SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin.c_str(), + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin, PLUGIN_TYPE_DSP, false ); diff --git a/Source/Core/DolphinWX/Src/MainNoGUI.cpp b/Source/Core/DolphinWX/Src/MainNoGUI.cpp index 32684d1d16..66e976310f 100644 --- a/Source/Core/DolphinWX/Src/MainNoGUI.cpp +++ b/Source/Core/DolphinWX/Src/MainNoGUI.cpp @@ -32,6 +32,10 @@ #include "X11Utils.h" #endif +#ifdef __APPLE__ +#import "cocoaApp.h" +#endif + #include "Core.h" #include "Globals.h" #include "Host.h" @@ -255,12 +259,110 @@ void X11_MainLoop() } #endif +//for cocoa we need to hijack the main to get event +#ifdef __APPLE__ + +@interface CocoaThread : NSObject +{ + NSThread *Thread; +} +- (void)cocoaThreadStart; +- (void)cocoaThreadRun:(id)sender; +- (void)cocoaThreadQuit:(NSNotification*)note; +- (bool)cocoaThreadRunning; +@end + +static NSString *CocoaThreadHaveFinish = @"CocoaThreadHaveFinish"; + +int cocoaArgc; +char **cocoaArgv; +int appleMain(int argc, char *argv[]); + +@implementation CocoaThread + +- (void)cocoaThreadStart +{ + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cocoaThreadQuit:) name:CocoaThreadHaveFinish object:nil]; + [NSThread detachNewThreadSelector:@selector(cocoaThreadRun:) toTarget:self withObject:nil]; + +} + +- (void)cocoaThreadRun:(id)sender +{ + + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + Thread = [NSThread currentThread]; + //launch main + appleMain(cocoaArgc,cocoaArgv); + + [[NSNotificationCenter defaultCenter] postNotificationName:CocoaThreadHaveFinish object:nil]; + + [pool release]; + +} + +- (void)cocoaThreadQuit:(NSNotification*)note +{ + + [[NSNotificationCenter defaultCenter] removeObserver:self]; + +} + +- (bool)cocoaThreadRunning +{ + if([Thread isFinished]) + return false; + else + return true; +} + +@end + + +int main(int argc, char *argv[]) +{ + + cocoaArgc = argc; + cocoaArgv = argv; + + cocoaCreateApp(); + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + CocoaThread *thread = [[CocoaThread alloc] init]; + NSEvent *event = [[NSEvent alloc] init]; + + [thread cocoaThreadStart]; + + //cocoa event loop + while(1) + { + event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES ]; + if(cocoaSendEvent(event)) + { + Core::Stop(); + break; + } + if(![thread cocoaThreadRunning]) + break; + } + + + [event release]; + [thread release]; + [pool release]; +} + + +int appleMain(int argc, char *argv[]) +#else // Include SDL header so it can hijack main(). #if defined(USE_SDL) && USE_SDL #include #endif - int main(int argc, char* argv[]) +#endif { gengetopt_args_info args_info; diff --git a/Source/Core/DolphinWX/Src/SConscript b/Source/Core/DolphinWX/Src/SConscript index c002d3f681..d44a627552 100644 --- a/Source/Core/DolphinWX/Src/SConscript +++ b/Source/Core/DolphinWX/Src/SConscript @@ -44,27 +44,37 @@ if wxenv['HAVE_WX']: 'NetWindow.cpp', ] - CPPDEFINE = [ + CPPDEFINES = [ 'wxNEEDS_CHARPP', ], - compileFlags = [ - ], - - libs = [ 'debwx', 'debugger_ui_util'] + libs +if sys.platform == 'darwin': + files += [ 'cocoaApp.m', ] + compileFlags = [ + '-x', + 'objective-c++', + ] + wxenv.Append( + CXXFLAGS = compileFlags, + LINKFLAGS = [ + '-pthread', '-framework', 'IOKit' + ], + LIBS = libs + ) +else: + wxenv.Append( + LINKFLAGS = [ + '-pthread', + ], + LIBS = libs + ) + + + if sys.platform == 'darwin': - compileFlags = [ - '-x', - 'objective-c++', - ] - - linkflags = [ - '-pthread', '-framework', 'IOKit' - ] - exeGUI = env['binary_dir'] + 'Dolphin.app/Contents/MacOS/Dolphin' exeNoGUI = env['binary_dir'] + 'DolphinNoGUI' @@ -86,17 +96,11 @@ if sys.platform == 'darwin': else: exeGUI = env['binary_dir'] + 'dolphin-emu' exeNoGUI = env['binary_dir'] + 'dolphin-emu-nogui' - linkflags = [ '-pthread' ] if wxenv['HAVE_X11']: files += [ 'X11Utils.cpp' ] - -wxenv.Append( - CXXFLAGS = compileFlags, - LINKFLAGS = linkflags, - LIBS = libs, -) +#objects = [ wxenv.Object(srcFile) for srcFile in files ] if wxenv['HAVE_WX']: wxenv.Program(exeGUI, files + [ 'Main.cpp' ]) diff --git a/Source/Core/DolphinWX/Src/cocoaApp.h b/Source/Core/DolphinWX/Src/cocoaApp.h new file mode 100644 index 0000000000..81e3d17704 --- /dev/null +++ b/Source/Core/DolphinWX/Src/cocoaApp.h @@ -0,0 +1,15 @@ +#import + +#ifdef __cplusplus +extern "C" +{ +#endif + +bool cocoaSendEvent(NSEvent *event); + +void cocoaCreateApp(); + +#ifdef __cplusplus +} +#endif + diff --git a/Source/Core/DolphinWX/Src/cocoaApp.m b/Source/Core/DolphinWX/Src/cocoaApp.m new file mode 100644 index 0000000000..5c5402cf89 --- /dev/null +++ b/Source/Core/DolphinWX/Src/cocoaApp.m @@ -0,0 +1,109 @@ +#import "cocoaApp.h" + +@implementation NSApplication(i) +- (void)appRunning +{ + _running = 1; +} +@end + +@interface cocoaAppDelegate : NSObject +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; +@end + +@implementation cocoaAppDelegate : NSObject +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender +{ + return NSTerminateCancel; +} +@end + +void cocoaCreateApp() +{ + ProcessSerialNumber psn; + NSAutoreleasePool *pool; + + if (!GetCurrentProcess(&psn)) { + TransformProcessType(&psn, kProcessTransformToForegroundApplication); + SetFrontProcess(&psn); + } + + pool = [[NSAutoreleasePool alloc] init]; + + if (NSApp == nil) { + [NSApplication sharedApplication]; + //TODO : Create menu + [NSApp finishLaunching]; + } + + if ([NSApp delegate] == nil) { + [NSApp setDelegate:[[cocoaAppDelegate alloc] init]]; + } + + [NSApp appRunning]; + + [pool release]; + +} + +bool cocoaKeyCode(NSEvent *event) +{ + static bool CMDDown = false, QDown = false; + bool Return = false; + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + + NSConnection *connec = [[NSConnection new] autorelease]; + + [connec setRootObject: event]; + if ([connec registerName: @"DolphinCocoaEvent"] == NO) + { + //printf("error creating nsconnection\n"); + } + + if( [event type] != NSFlagsChanged ) + { + const char *Keys = [[event characters] UTF8String]; + + if( Keys[0] == 'q' && [event type] == NSKeyDown ) + QDown = true; + if( Keys[0] == 'q' && [event type] == NSKeyUp ) + QDown = false; + } + else + if( [event modifierFlags] & NSCommandKeyMask ) + CMDDown = true; + else + CMDDown = false; + + if( QDown && CMDDown ) + Return = true; + + [pool release]; + return Return; +} + +bool cocoaSendEvent(NSEvent *event) +{ + + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + + if ( event != nil ) { + switch ([event type]) { + case NSKeyDown: + case NSKeyUp: + case NSFlagsChanged: // For Command + return cocoaKeyCode(event); + break; + default: + [NSApp sendEvent:event]; + break; + } + } + + + [pool release]; + return false; + +} + + diff --git a/Source/Dolphin.xcodeproj/project.pbxproj b/Source/Dolphin.xcodeproj/project.pbxproj index e04c133408..c95d294162 100644 --- a/Source/Dolphin.xcodeproj/project.pbxproj +++ b/Source/Dolphin.xcodeproj/project.pbxproj @@ -452,6 +452,8 @@ 292AC39C11838FD700B8790B /* CheatsWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 292ABF8D11838FD600B8790B /* CheatsWindow.h */; }; 292AC39D11838FD700B8790B /* cmdline.c in Sources */ = {isa = PBXBuildFile; fileRef = 292ABF8E11838FD600B8790B /* cmdline.c */; }; 292AC39E11838FD700B8790B /* cmdline.h in Headers */ = {isa = PBXBuildFile; fileRef = 292ABF8F11838FD600B8790B /* cmdline.h */; }; + 292AC39F11838FD700B8790B /* cocoaApp.h in Headers */ = {isa = PBXBuildFile; fileRef = 292ABF9011838FD600B8790B /* cocoaApp.h */; }; + 292AC3A011838FD700B8790B /* cocoaApp.m in Sources */ = {isa = PBXBuildFile; fileRef = 292ABF9111838FD600B8790B /* cocoaApp.m */; }; 292AC3A111838FD700B8790B /* ConfigMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292ABF9211838FD600B8790B /* ConfigMain.cpp */; }; 292AC3A211838FD700B8790B /* ConfigMain.h in Headers */ = {isa = PBXBuildFile; fileRef = 292ABF9311838FD600B8790B /* ConfigMain.h */; }; 292AC3A311838FD700B8790B /* Frame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292ABF9411838FD600B8790B /* Frame.cpp */; }; @@ -789,6 +791,8 @@ 292AC4F711838FD700B8790B /* XFStructs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC12B11838FD700B8790B /* XFStructs.cpp */; }; 292AC4F811838FD700B8790B /* XFStructs.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC12C11838FD700B8790B /* XFStructs.h */; }; 292AC4F911838FD700B8790B /* BPFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC13011838FD700B8790B /* BPFunctions.cpp */; }; + 292AC4FA11838FD700B8790B /* cocoaGL.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC13111838FD700B8790B /* cocoaGL.h */; }; + 292AC4FB11838FD700B8790B /* cocoaGL.m in Sources */ = {isa = PBXBuildFile; fileRef = 292AC13211838FD700B8790B /* cocoaGL.m */; }; 292AC4FC11838FD700B8790B /* Debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC13411838FD700B8790B /* Debugger.cpp */; }; 292AC4FD11838FD700B8790B /* Debugger.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC13511838FD700B8790B /* Debugger.h */; }; 292AC4FE11838FD700B8790B /* DLCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC13611838FD700B8790B /* DLCache.cpp */; }; @@ -830,6 +834,8 @@ 292AC52211838FD700B8790B /* BPMemLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC16011838FD700B8790B /* BPMemLoader.h */; }; 292AC52311838FD700B8790B /* Clipper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC16111838FD700B8790B /* Clipper.cpp */; }; 292AC52411838FD700B8790B /* Clipper.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC16211838FD700B8790B /* Clipper.h */; }; + 292AC52511838FD700B8790B /* cocoaGL.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC16311838FD700B8790B /* cocoaGL.h */; }; + 292AC52611838FD700B8790B /* cocoaGL.m in Sources */ = {isa = PBXBuildFile; fileRef = 292AC16411838FD700B8790B /* cocoaGL.m */; }; 292AC52711838FD700B8790B /* CommandProcessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC16511838FD700B8790B /* CommandProcessor.cpp */; }; 292AC52811838FD700B8790B /* CommandProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC16611838FD700B8790B /* CommandProcessor.h */; }; 292AC52911838FD700B8790B /* CPMemLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC16711838FD700B8790B /* CPMemLoader.cpp */; }; @@ -1767,6 +1773,8 @@ 292ABF8D11838FD600B8790B /* CheatsWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CheatsWindow.h; sourceTree = ""; }; 292ABF8E11838FD600B8790B /* cmdline.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cmdline.c; sourceTree = ""; }; 292ABF8F11838FD600B8790B /* cmdline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cmdline.h; sourceTree = ""; }; + 292ABF9011838FD600B8790B /* cocoaApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoaApp.h; sourceTree = ""; }; + 292ABF9111838FD600B8790B /* cocoaApp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = cocoaApp.m; sourceTree = ""; }; 292ABF9211838FD600B8790B /* ConfigMain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConfigMain.cpp; sourceTree = ""; }; 292ABF9311838FD600B8790B /* ConfigMain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConfigMain.h; sourceTree = ""; }; 292ABF9411838FD600B8790B /* Frame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Frame.cpp; sourceTree = ""; }; @@ -2134,6 +2142,8 @@ 292AC12C11838FD700B8790B /* XFStructs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XFStructs.h; sourceTree = ""; }; 292AC12E11838FD700B8790B /* Plugin_VideoOGL.vcproj */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Plugin_VideoOGL.vcproj; sourceTree = ""; }; 292AC13011838FD700B8790B /* BPFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BPFunctions.cpp; sourceTree = ""; }; + 292AC13111838FD700B8790B /* cocoaGL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoaGL.h; sourceTree = ""; }; + 292AC13211838FD700B8790B /* cocoaGL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = cocoaGL.m; sourceTree = ""; }; 292AC13411838FD700B8790B /* Debugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Debugger.cpp; sourceTree = ""; }; 292AC13511838FD700B8790B /* Debugger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Debugger.h; sourceTree = ""; }; 292AC13611838FD700B8790B /* DLCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DLCache.cpp; sourceTree = ""; }; @@ -2177,6 +2187,8 @@ 292AC16011838FD700B8790B /* BPMemLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPMemLoader.h; sourceTree = ""; }; 292AC16111838FD700B8790B /* Clipper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Clipper.cpp; sourceTree = ""; }; 292AC16211838FD700B8790B /* Clipper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clipper.h; sourceTree = ""; }; + 292AC16311838FD700B8790B /* cocoaGL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoaGL.h; sourceTree = ""; }; + 292AC16411838FD700B8790B /* cocoaGL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = cocoaGL.m; sourceTree = ""; }; 292AC16511838FD700B8790B /* CommandProcessor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CommandProcessor.cpp; sourceTree = ""; }; 292AC16611838FD700B8790B /* CommandProcessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommandProcessor.h; sourceTree = ""; }; 292AC16711838FD700B8790B /* CPMemLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CPMemLoader.cpp; sourceTree = ""; }; @@ -3358,6 +3370,8 @@ 292ABF8D11838FD600B8790B /* CheatsWindow.h */, 292ABF8E11838FD600B8790B /* cmdline.c */, 292ABF8F11838FD600B8790B /* cmdline.h */, + 292ABF9011838FD600B8790B /* cocoaApp.h */, + 292ABF9111838FD600B8790B /* cocoaApp.m */, 292ABF9211838FD600B8790B /* ConfigMain.cpp */, 292ABF9311838FD600B8790B /* ConfigMain.h */, 292ABF9411838FD600B8790B /* Frame.cpp */, @@ -4052,6 +4066,8 @@ isa = PBXGroup; children = ( 292AC13011838FD700B8790B /* BPFunctions.cpp */, + 292AC13111838FD700B8790B /* cocoaGL.h */, + 292AC13211838FD700B8790B /* cocoaGL.m */, 292AC13311838FD700B8790B /* Debugger */, 292AC13611838FD700B8790B /* DLCache.cpp */, 292AC13711838FD700B8790B /* DLCache.h */, @@ -4134,6 +4150,8 @@ 292AC16011838FD700B8790B /* BPMemLoader.h */, 292AC16111838FD700B8790B /* Clipper.cpp */, 292AC16211838FD700B8790B /* Clipper.h */, + 292AC16311838FD700B8790B /* cocoaGL.h */, + 292AC16411838FD700B8790B /* cocoaGL.m */, 292AC16511838FD700B8790B /* CommandProcessor.cpp */, 292AC16611838FD700B8790B /* CommandProcessor.h */, 292AC16711838FD700B8790B /* CPMemLoader.cpp */, @@ -4578,6 +4596,7 @@ 292AC39A11838FD700B8790B /* BootManager.h in Headers */, 292AC39C11838FD700B8790B /* CheatsWindow.h in Headers */, 292AC39E11838FD700B8790B /* cmdline.h in Headers */, + 292AC39F11838FD700B8790B /* cocoaApp.h in Headers */, 292AC3A211838FD700B8790B /* ConfigMain.h in Headers */, 292AC3A411838FD700B8790B /* Frame.h in Headers */, 292AC3A811838FD700B8790B /* GameListCtrl.h in Headers */, @@ -4741,6 +4760,7 @@ 292AC4F411838FD700B8790B /* TabControl.h in Headers */, 292AC4F611838FD700B8790B /* Thread.h in Headers */, 292AC4F811838FD700B8790B /* XFStructs.h in Headers */, + 292AC4FA11838FD700B8790B /* cocoaGL.h in Headers */, 292AC4FD11838FD700B8790B /* Debugger.h in Headers */, 292AC4FF11838FD700B8790B /* DLCache.h in Headers */, 292AC50111838FD700B8790B /* FramebufferManager.h in Headers */, @@ -4761,6 +4781,7 @@ 292AC52011838FD700B8790B /* XFB.h in Headers */, 292AC52211838FD700B8790B /* BPMemLoader.h in Headers */, 292AC52411838FD700B8790B /* Clipper.h in Headers */, + 292AC52511838FD700B8790B /* cocoaGL.h in Headers */, 292AC52811838FD700B8790B /* CommandProcessor.h in Headers */, 292AC52A11838FD700B8790B /* CPMemLoader.h in Headers */, 292AC52C11838FD700B8790B /* DebugUtil.h in Headers */, @@ -5615,6 +5636,7 @@ 292AC39911838FD700B8790B /* BootManager.cpp in Sources */, 292AC39B11838FD700B8790B /* CheatsWindow.cpp in Sources */, 292AC39D11838FD700B8790B /* cmdline.c in Sources */, + 292AC3A011838FD700B8790B /* cocoaApp.m in Sources */, 292AC3A111838FD700B8790B /* ConfigMain.cpp in Sources */, 292AC3A311838FD700B8790B /* Frame.cpp in Sources */, 292AC3A511838FD700B8790B /* FrameAui.cpp in Sources */, @@ -5789,6 +5811,7 @@ 292AC4F511838FD700B8790B /* Thread.cpp in Sources */, 292AC4F711838FD700B8790B /* XFStructs.cpp in Sources */, 292AC4F911838FD700B8790B /* BPFunctions.cpp in Sources */, + 292AC4FB11838FD700B8790B /* cocoaGL.m in Sources */, 292AC4FC11838FD700B8790B /* Debugger.cpp in Sources */, 292AC4FE11838FD700B8790B /* DLCache.cpp in Sources */, 292AC50011838FD700B8790B /* FramebufferManager.cpp in Sources */, @@ -5810,6 +5833,7 @@ 292AC51F11838FD700B8790B /* XFB.cpp in Sources */, 292AC52111838FD700B8790B /* BPMemLoader.cpp in Sources */, 292AC52311838FD700B8790B /* Clipper.cpp in Sources */, + 292AC52611838FD700B8790B /* cocoaGL.m in Sources */, 292AC52711838FD700B8790B /* CommandProcessor.cpp in Sources */, 292AC52911838FD700B8790B /* CPMemLoader.cpp in Sources */, 292AC52B11838FD700B8790B /* DebugUtil.cpp in Sources */, diff --git a/Source/Plugins/Plugin_GCPad/Src/GCPad.h b/Source/Plugins/Plugin_GCPad/Src/GCPad.h index 52fe385785..dca978cb9c 100644 --- a/Source/Plugins/Plugin_GCPad/Src/GCPad.h +++ b/Source/Plugins/Plugin_GCPad/Src/GCPad.h @@ -42,6 +42,9 @@ #include #include #include +//no need for Cocoa yet, but I guess ayuanx isn't done yet. +//#elif defined(__APPLE__) +// #include #endif #include "pluginspecs_pad.h" diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp index 9a714eeed5..c28b99e778 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp @@ -55,6 +55,8 @@ void OpenGL_SwapBuffers() { #if defined(USE_WX) && USE_WX GLWin.glCanvas->SwapBuffers(); +#elif defined(__APPLE__) + cocoaGLSwap(GLWin.cocoaCtx,GLWin.cocoaWin); #elif defined(_WIN32) SwapBuffers(hDC); #elif defined(HAVE_X11) && HAVE_X11 @@ -76,6 +78,8 @@ void OpenGL_SetWindowText(const char *text) { #if defined(USE_WX) && USE_WX // GLWin.frame->SetTitle(wxString::FromAscii(text)); +#elif defined(__APPLE__) + cocoaGLSetTitle(GLWin.cocoaWin, text); #elif defined(_WIN32) // TODO convert text to unicode and change SetWindowTextA to SetWindowText SetWindowTextA(EmuWindow::GetWnd(), text); @@ -264,6 +268,12 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); +#elif defined(__APPLE__) + GLWin.width = s_backbuffer_width; + GLWin.height = s_backbuffer_height; + GLWin.cocoaWin = cocoaGLCreateWindow(GLWin.width, GLWin.height); + GLWin.cocoaCtx = cocoaGLInit(g_Config.iMultisampleMode); + #elif defined(_WIN32) g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create((HWND)g_VideoInitialize.pWindowHandle, g_hInstance, _T("Please wait...")); if (g_VideoInitialize.pWindowHandle == NULL) @@ -405,6 +415,8 @@ bool OpenGL_MakeCurrent() // connect the glx-context to the window #if defined(USE_WX) && USE_WX GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); +#elif defined(__APPLE__) + cocoaGLMakeCurrent(GLWin.cocoaCtx,GLWin.cocoaWin); #elif defined(_WIN32) return wglMakeCurrent(hDC,hRC); #elif defined(HAVE_X11) && HAVE_X11 @@ -425,6 +437,11 @@ void OpenGL_Update() // TODO fill in +#elif defined(__APPLE__) + RECT rcWindow = {0}; + rcWindow.right = GLWin.width; + rcWindow.bottom = GLWin.height; + #elif defined(_WIN32) RECT rcWindow; if (!EmuWindow::GetParentWnd()) @@ -464,6 +481,10 @@ void OpenGL_Shutdown() { #if defined(USE_WX) && USE_WX delete GLWin.glCanvas; +#elif defined(__APPLE__) + cocoaGLDeleteWindow(GLWin.cocoaWin); + cocoaGLDelete(GLWin.cocoaCtx); + #elif defined(_WIN32) if (hRC) // Do We Have A Rendering Context? { diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h index b75cf3ba84..36b23238cf 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h @@ -49,8 +49,9 @@ #include #include -#else +#elif defined(__APPLE__) #include +#include "cocoaGL.h" #endif // end USE_WX #if defined(__APPLE__) @@ -75,7 +76,10 @@ typedef struct { int screen; -#if defined(HAVE_X11) && HAVE_X11 +#if defined(__APPLE__) + NSWindow *cocoaWin; + NSOpenGLContext *cocoaCtx; +#elif defined(HAVE_X11) && HAVE_X11 Window win; Window parent; Display *dpy; @@ -83,7 +87,8 @@ typedef struct { GLXContext ctx; XSetWindowAttributes attr; Common::Thread *xEventThread; -#elif defined(USE_WX) && USE_WX +#endif // X11 +#if defined(USE_WX) && USE_WX wxGLCanvas *glCanvas; wxPanel *panel; wxGLContext *glCtxt; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SConscript b/Source/Plugins/Plugin_VideoOGL/Src/SConscript index 2724a150d2..f88d81f17b 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/SConscript +++ b/Source/Plugins/Plugin_VideoOGL/Src/SConscript @@ -25,6 +25,8 @@ files = [ 'PostProcessing.cpp', 'FramebufferManager.cpp', ] +compileFlags = [ + ] linkFlags = [ ] libs = [ @@ -46,6 +48,12 @@ if gfxenv['HAVE_WX']: 'Debugger/Debugger.cpp', ] +if sys.platform == 'darwin': + files += [ 'cocoaGL.m' ] + compileFlags += [ + '-x', + 'objective-c++', + ] if sys.platform == 'win32': files += [ 'OS/Win32.cpp' ] @@ -97,6 +105,7 @@ if gfxenv['USE_WX'] and not gfxenv['HAVE_WX']: print "Must have wx to use wxgl" Return() gfxenv.Append( + CXXFLAGS = compileFlags, LINKFLAGS = linkFlags, ) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/cocoaApp.h b/Source/Plugins/Plugin_VideoOGL/Src/cocoaApp.h new file mode 100644 index 0000000000..cdd2a70650 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/cocoaApp.h @@ -0,0 +1,29 @@ +#import +#import + +#ifdef __cplusplus +extern "C" +{ +#endif + + +void cocoaGLCreateApp(); + +NSWindow *cocoaGLCreateWindow(int w,int h); + +void cocoaGLSetTitle(NSWindow *win, const char *title); + +void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win); + +NSOpenGLContext* cocoaGLInit(int mode); + +void cocoaGLDelete(NSOpenGLContext *ctx); + +void cocoaGLDeleteWindow(NSWindow *window); + +void cocoaGLSwap(NSOpenGLContext *ctx,NSWindow *window); + +#ifdef __cplusplus +} +#endif + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/cocoaApp.m b/Source/Plugins/Plugin_VideoOGL/Src/cocoaApp.m new file mode 100755 index 0000000000..6a821635e2 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/cocoaApp.m @@ -0,0 +1,149 @@ +#import "cocoaGL.h" + +NSWindow *cocoaGLCreateWindow(int w,int h) +{ + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSWindow *window; + window = [[NSWindow alloc] initWithContentRect:NSMakeRect(50,50,w,h) + styleMask:NSTitledWindowMask | NSResizableWindowMask + backing:NSBackingStoreBuffered + defer:FALSE]; + [window setReleasedWhenClosed: YES]; + + [window setTitle:@"Dolphin on OSX"]; + //[window makeKeyAndOrderFront: nil]; + + [pool release]; + + return window; +} + +void cocoaGLSetTitle(NSWindow *win, const char *title) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + [win setTitle: [[[NSString alloc] initWithCString: title encoding: NSASCIIStringEncoding] autorelease]]; + + [pool release]; +} + +void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win) +{ + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + + int value = 0; + [ctx setValues:&value forParameter:NSOpenGLCPSwapInterval]; + + if (ctx) { + [ctx setView:[win contentView]]; + [ctx update]; + [ctx makeCurrentContext]; + } + else + [NSOpenGLContext clearCurrentContext]; + + [pool release]; +} + + + +NSOpenGLContext* cocoaGLInit(int mode) +{ + NSAutoreleasePool *pool; + + NSOpenGLPixelFormatAttribute attr[32]; + NSOpenGLPixelFormat *fmt; + NSOpenGLContext *context; + int i = 0; + + pool = [[NSAutoreleasePool alloc] init]; + + attr[i++] = NSOpenGLPFADepthSize; + attr[i++] = 24; + attr[i++] = NSOpenGLPFADoubleBuffer; + + attr[i++] = NSOpenGLPFASampleBuffers; + attr[i++] = mode; + attr[i++] = NSOpenGLPFASamples; + attr[i++] = 1; + + attr[i++] = NSOpenGLPFANoRecovery; +#ifdef GL_VERSION_1_3 + +#else +#ifdef GL_VERSION_1_2 +#warning "your card only supports ogl 1.2, dolphin will use software renderer" + //if opengl < 1.3 uncomment this twoo lines to use software renderer + attr[i++] = NSOpenGLPFARendererID; + attr[i++] = kCGLRendererGenericFloatID; +#endif +#endif + attr[i++] = NSOpenGLPFAScreenMask; + attr[i++] = CGDisplayIDToOpenGLDisplayMask(CGMainDisplayID()); + + attr[i] = 0; + + fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr]; + if (fmt == nil) { + printf("failed to create pixel format\n"); + [pool release]; + return NULL; + } + + context = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil]; + + [fmt release]; + + if (context == nil) { + printf("failed to create context\n"); + [pool release]; + return NULL; + } + + [pool release]; + + return context; + +} + +void cocoaGLDelete(NSOpenGLContext *ctx) +{ + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + + [ctx clearDrawable]; + [ctx release]; + + [pool release]; + +} +void cocoaGLDeleteWindow(NSWindow *window) +{ + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + [window close]; + [pool release]; + + return; +} + +void cocoaGLSwap(NSOpenGLContext *ctx,NSWindow *window) +{ + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + [window makeKeyAndOrderFront: nil]; + + ctx = [NSOpenGLContext currentContext]; + if (ctx != nil) + [ctx flushBuffer]; + else + printf("bad cocoa gl ctx\n"); + + [pool release]; +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h b/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h new file mode 100644 index 0000000000..0d8515ff7f --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h @@ -0,0 +1,28 @@ +#import +#import + +#ifdef __cplusplus +extern "C" +{ +#endif + + +void cocoaGLCreateApp(); + +NSWindow *cocoaGLCreateWindow(int w,int h); + +void cocoaGLSetTitle(NSWindow *win, const char *title); + +void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win); + +NSOpenGLContext* cocoaGLInit(int mode); + +void cocoaGLDelete(NSOpenGLContext *ctx); + +void cocoaGLDeleteWindow(NSWindow *window); + +void cocoaGLSwap(NSOpenGLContext *ctx,NSWindow *window); + +#ifdef __cplusplus +} +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.m b/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.m new file mode 100755 index 0000000000..6a821635e2 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.m @@ -0,0 +1,149 @@ +#import "cocoaGL.h" + +NSWindow *cocoaGLCreateWindow(int w,int h) +{ + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSWindow *window; + window = [[NSWindow alloc] initWithContentRect:NSMakeRect(50,50,w,h) + styleMask:NSTitledWindowMask | NSResizableWindowMask + backing:NSBackingStoreBuffered + defer:FALSE]; + [window setReleasedWhenClosed: YES]; + + [window setTitle:@"Dolphin on OSX"]; + //[window makeKeyAndOrderFront: nil]; + + [pool release]; + + return window; +} + +void cocoaGLSetTitle(NSWindow *win, const char *title) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + [win setTitle: [[[NSString alloc] initWithCString: title encoding: NSASCIIStringEncoding] autorelease]]; + + [pool release]; +} + +void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win) +{ + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + + int value = 0; + [ctx setValues:&value forParameter:NSOpenGLCPSwapInterval]; + + if (ctx) { + [ctx setView:[win contentView]]; + [ctx update]; + [ctx makeCurrentContext]; + } + else + [NSOpenGLContext clearCurrentContext]; + + [pool release]; +} + + + +NSOpenGLContext* cocoaGLInit(int mode) +{ + NSAutoreleasePool *pool; + + NSOpenGLPixelFormatAttribute attr[32]; + NSOpenGLPixelFormat *fmt; + NSOpenGLContext *context; + int i = 0; + + pool = [[NSAutoreleasePool alloc] init]; + + attr[i++] = NSOpenGLPFADepthSize; + attr[i++] = 24; + attr[i++] = NSOpenGLPFADoubleBuffer; + + attr[i++] = NSOpenGLPFASampleBuffers; + attr[i++] = mode; + attr[i++] = NSOpenGLPFASamples; + attr[i++] = 1; + + attr[i++] = NSOpenGLPFANoRecovery; +#ifdef GL_VERSION_1_3 + +#else +#ifdef GL_VERSION_1_2 +#warning "your card only supports ogl 1.2, dolphin will use software renderer" + //if opengl < 1.3 uncomment this twoo lines to use software renderer + attr[i++] = NSOpenGLPFARendererID; + attr[i++] = kCGLRendererGenericFloatID; +#endif +#endif + attr[i++] = NSOpenGLPFAScreenMask; + attr[i++] = CGDisplayIDToOpenGLDisplayMask(CGMainDisplayID()); + + attr[i] = 0; + + fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr]; + if (fmt == nil) { + printf("failed to create pixel format\n"); + [pool release]; + return NULL; + } + + context = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil]; + + [fmt release]; + + if (context == nil) { + printf("failed to create context\n"); + [pool release]; + return NULL; + } + + [pool release]; + + return context; + +} + +void cocoaGLDelete(NSOpenGLContext *ctx) +{ + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + + [ctx clearDrawable]; + [ctx release]; + + [pool release]; + +} +void cocoaGLDeleteWindow(NSWindow *window) +{ + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + [window close]; + [pool release]; + + return; +} + +void cocoaGLSwap(NSOpenGLContext *ctx,NSWindow *window) +{ + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + [window makeKeyAndOrderFront: nil]; + + ctx = [NSOpenGLContext currentContext]; + if (ctx != nil) + [ctx flushBuffer]; + else + printf("bad cocoa gl ctx\n"); + + [pool release]; +} diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SConscript b/Source/Plugins/Plugin_VideoSoftware/Src/SConscript index 9bdd52243c..6732a13b0f 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SConscript +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SConscript @@ -53,6 +53,9 @@ conf = gfxenv.Configure(custom_tests = tests, if sys.platform == 'darwin': gfxenv['FRAMEWORKS'] = ['CoreFoundation', 'System', 'OpenGL', 'Cocoa', 'Cg'] + compileFlags = ['-x','objective-c++',] + files += [ 'cocoaGL.m', ] + conf.CheckPKG('OpenGL') if gfxenv['HAVE_OPENCL']: gfxenv['FRAMEWORKS'] += ['OpenCL']