changeset 20689:dc0d0d726c8f draft

-Add [FS#4847]: [OSX] Bootstrap downloading of a baseset. (Matthieu)
author Michael Lutz <michi@icosahedron.de>
date Thu, 07 Mar 2013 21:38:20 +0100
parents fbdf622fa8b3
children f866c42de03d
files src/bootstrap_gui.cpp src/video/cocoa/cocoa_v.mm
diffstat 2 files changed, 49 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/bootstrap_gui.cpp
+++ b/src/bootstrap_gui.cpp
@@ -218,7 +218,7 @@
 	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. */
--- a/src/video/cocoa/cocoa_v.mm
+++ b/src/video/cocoa/cocoa_v.mm
@@ -56,6 +56,7 @@
 
 CocoaSubdriver *_cocoa_subdriver = NULL;
 
+static const NSString *OTTDMainLaunchGameEngine = @"ottdmain_launch_game_engine";
 
 
 /**
@@ -63,15 +64,42 @@
  */
 @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 */
-	QZ_GameLoop();
+	/* 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 ];
 }
 
 /**
@@ -79,11 +107,18 @@
  */
 - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*) sender
 {
-
 	HandleExitGameRequest();
 
 	return NSTerminateCancel; // NSTerminateLater ?
 }
+
+/**
+ * Remove ourself as a notification observer.
+ */
+- (void)unregisterObserver
+{
+	[ [ NSNotificationCenter defaultCenter ] removeObserver:self ];
+}
 @end
 
 /**
@@ -326,6 +361,8 @@
 {
 	if (!_cocoa_video_started) return;
 
+	[ _ottd_main unregisterObserver ];
+
 	delete _cocoa_subdriver;
 	_cocoa_subdriver = NULL;
 
@@ -385,7 +422,11 @@
  */
 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. */
+	[ [ NSNotificationCenter defaultCenter ] postNotificationName:OTTDMainLaunchGameEngine object:nil ];
+
+	/* Start the main event loop. */
 	[ NSApp run ];
 }
 
@@ -708,7 +749,7 @@
 	[ 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