From 5d1ae85ab9829ab38b96277a8cd63e4539774e06 Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Sat, 18 Jun 2011 18:44:01 +0300
Subject: [PATCH] Hand-picked Mac OSX cursor and bundle path fixes from
 https://bitbucket.org/toabi/minetest-mac

---
 src/game.cpp    | 10 ++++++++--
 src/porting.cpp | 24 +++++++++++++++++++++---
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/game.cpp b/src/game.cpp
index 1ab3d7962..f3fac0c84 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1366,7 +1366,11 @@ void the_game(
 		if((device->isWindowActive() && noMenuActive()) || random_input)
 		{
 			if(!random_input)
-				device->getCursorControl()->setVisible(false);
+			{
+				// Mac OSX gets upset if this is set every frame
+				if(device->getCursorControl()->isVisible())
+					device->getCursorControl()->setVisible(false);
+			}
 
 			if(first_loop_after_window_activation){
 				//std::cout<<"window active, first loop"<<std::endl;
@@ -1397,7 +1401,9 @@ void the_game(
 			input->setMousePos(displaycenter.X, displaycenter.Y);
 		}
 		else{
-			device->getCursorControl()->setVisible(true);
+			// Mac OSX gets upset if this is set every frame
+			if(device->getCursorControl()->isVisible() == false)
+				device->getCursorControl()->setVisible(true);
 
 			//std::cout<<"window inactive"<<std::endl;
 			first_loop_after_window_activation = true;
diff --git a/src/porting.cpp b/src/porting.cpp
index 7c7ce48ea..cce461be8 100644
--- a/src/porting.cpp
+++ b/src/porting.cpp
@@ -214,10 +214,28 @@ void initializePaths()
 	*/
 	#elif defined(__APPLE__)
 		#include <unistd.h>
-
+		#include "CoreFoundation/CoreFoundation.h"
+
+    // Code based on
+    // http://stackoverflow.com/questions/516200/relative-paths-not-working-in-xcode-c
+    CFBundleRef main_bundle = CFBundleGetMainBundle();
+    CFURLRef resources_url = CFBundleCopyResourcesDirectoryURL(main_bundle);
+    char path[PATH_MAX];
+    if(CFURLGetFileSystemRepresentation(resources_url, TRUE, (UInt8 *)path, PATH_MAX))
+	{
+		dstream<<"Bundle resource path: "<<path<<std::endl;
+		//chdir(path);
+		path_data = std::string(path) + "/data";
+	}
+	else
+    {
+        // error!
+		dstream<<"WARNING: Could not determine bundle resource path"<<std::endl;
+    }
+    CFRelease(resources_url);
+	
 	path_userdata = std::string(getenv("HOME")) + "/Library/Application Support/" + APPNAME;
-	path_data = std::string("minetest-mac.app/Contents/Resources/data/");
-
+    
 	#endif
 
 #endif // RUN_IN_PLACE
-- 
GitLab