@@ -215,13 +215,13 @@ bool HandleBootstrap()
if (BaseGraphics::GetUsedSet() != NULL) return true;
/* No user interface, bail out with an error. */
if (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() == 0) goto failure;
/* If there is no network or no freetype, then there is nothing we can do. Go straight to failure. */
#if defined(ENABLE_NETWORK) && defined(WITH_FREETYPE) && !defined(__APPLE__) && (defined(WITH_FONTCONFIG) || defined(WIN32))
#if defined(ENABLE_NETWORK) && defined(WITH_FREETYPE) && (defined(WITH_FONTCONFIG) || defined(WIN32) || defined(__APPLE__))
if (!_network_available) goto failure;
/* First tell the game we're bootstrapping. */
_game_mode = GM_BOOTSTRAP;
/* Initialise the freetype font code. */
@@ -53,40 +53,75 @@ static NSAutoreleasePool *_ottd_autorele
static OTTDMain *_ottd_main;
static bool _cocoa_video_started = false;
static bool _cocoa_video_dialog = false;
CocoaSubdriver *_cocoa_subdriver = NULL;
static const NSString *OTTDMainLaunchGameEngine = @"ottdmain_launch_game_engine";
/**
* The main class of the application, the application's delegate.
*/
@implementation OTTDMain
* Stop the game engine. Must be called on main thread.
- (void)stopEngine
{
[ NSApp stop:self ];
/* Send an empty event to return from the run loop. Without that, application is stuck waiting for an event. */
NSEvent *event = [ NSEvent otherEventWithType:NSApplicationDefined location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0.0 windowNumber:0 context:nil subtype:0 data1:0 data2:0 ];
[ NSApp postEvent:event atStart:YES ];
}
* Start the game loop.
- (void)launchGameEngine: (NSNotification*) note
/* Setup cursor for the current _game_mode. */
[ _cocoa_subdriver->cocoaview resetCursorRects ];
/* Hand off to main application code. */
QZ_GameLoop();
/* We are done, thank you for playing. */
[ self performSelectorOnMainThread:@selector(stopEngine) withObject:nil waitUntilDone:FALSE ];
* Called when the internal event loop has just started running.
- (void) applicationDidFinishLaunching: (NSNotification*) note
/* Hand off to main application code */
/* Add a notification observer so we can restart the game loop later on if necessary. */
[ [ NSNotificationCenter defaultCenter ] addObserver:self selector:@selector(launchGameEngine:) name:OTTDMainLaunchGameEngine object:nil ];
/* We're done, thank you for playing */
[ NSApp stop:_ottd_main ];
/* Start game loop. */
[ [ NSNotificationCenter defaultCenter ] postNotificationName:OTTDMainLaunchGameEngine object:nil ];
* Display the in game quit confirmation dialog.
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*) sender
HandleExitGameRequest();
return NSTerminateCancel; // NSTerminateLater ?
* Remove ourself as a notification observer.
- (void)unregisterObserver
[ [ NSNotificationCenter defaultCenter ] removeObserver:self ];
@end
* Initialize the application menu shown in top bar.
static void setApplicationMenu()
@@ -323,12 +358,14 @@ static FVideoDriver_Cocoa iFVideoDriver_
* Stop the cocoa video subdriver.
void VideoDriver_Cocoa::Stop()
if (!_cocoa_video_started) return;
[ _ottd_main unregisterObserver ];
delete _cocoa_subdriver;
_cocoa_subdriver = NULL;
[ _ottd_main release ];
_cocoa_video_started = false;
@@ -382,13 +419,17 @@ void VideoDriver_Cocoa::MakeDirty(int le
* Start the main programme loop when using a cocoa video driver.
void VideoDriver_Cocoa::MainLoop()
/* Start the main event loop */
/* Restart game loop if it was already running (e.g. after bootstrapping),
* otherwise this call is a no-op. */
/* Start the main event loop. */
[ NSApp run ];
* Change the resolution when using a cocoa video driver.
*
@@ -705,13 +746,13 @@ void cocoaReleaseAutoreleasePool()
- (void)resetCursorRects
[ super resetCursorRects ];
[ self clearTrackingRect ];
[ self setTrackingRect ];
[ self addCursorRect:[ self bounds ] cursor:[ NSCursor clearCocoaCursor ] ];
[ self addCursorRect:[ self bounds ] cursor:(_game_mode == GM_BOOTSTRAP ? [ NSCursor arrowCursor ] : [ NSCursor clearCocoaCursor ]) ];
* Prepare for moving the application window
- (void)viewWillMoveToWindow:(NSWindow *)win
Status change: