浏览代码

macOS: always change working directory for launcher and server

This make relative paths work properly when launched from DMG or from different directory.
Arseniy Shestakov 8 年之前
父节点
当前提交
21074e13c3
共有 5 个文件被更改,包括 14 次插入4 次删除
  1. 1 1
      client/CMT.cpp
  2. 1 1
      launcher/main.cpp
  3. 4 0
      launcher/mainwindow_moc.cpp
  4. 7 1
      server/CVCMIServer.cpp
  5. 1 1
      test/main.cpp

+ 1 - 1
client/CMT.cpp

@@ -229,7 +229,7 @@ int wmain(int argc, wchar_t* argv[])
 #elif defined(VCMI_APPLE) || defined(VCMI_ANDROID)
 int SDL_main(int argc, char *argv[])
 #else
-int main(int argc, char** argv)
+int main(int argc, char * argv[])
 #endif
 {
 #ifdef VCMI_ANDROID

+ 1 - 1
launcher/main.cpp

@@ -12,7 +12,7 @@
 #include "mainwindow_moc.h"
 #include "sdldisplayquery.h"
 
-int main(int argc, char *argv[])
+int main(int argc, char * argv[])
 {
 	QApplication vcmilauncher(argc, argv);
 	auto displayList = getDisplays();

+ 4 - 0
launcher/mainwindow_moc.cpp

@@ -21,6 +21,10 @@
 
 void MainWindow::load()
 {
+	// Set current working dir to executable folder.
+	// This is important on Mac for relative paths to work inside DMG.
+	QDir::setCurrent(QApplication::applicationDirPath());
+
 	console = new CConsoleHandler();
 	CBasicLogConfigurator logConfig(VCMIDirs::get().userCachePath() / "VCMI_Launcher_log.txt", console);
 	logConfig.configureDefault();

+ 7 - 1
server/CVCMIServer.cpp

@@ -607,8 +607,14 @@ void handleLinuxSignal(int sig)
 }
 #endif
 
-int main(int argc, char** argv)
+int main(int argc, char * argv[])
 {
+#ifdef VCMI_APPLE
+	// Correct working dir executable folder (not bundle folder) so we can use executable relative paths
+	std::string executablePath = argv[0];
+	std::string workDir = executablePath.substr(0, executablePath.rfind('/'));
+	chdir(workDir.c_str());
+#endif
 	// Installs a sig sev segmentation violation handler
 	// to log stacktrace
 	#if defined(__GNUC__) && !defined (__MINGW32__) && !defined(VCMI_ANDROID)

+ 1 - 1
test/main.cpp

@@ -12,7 +12,7 @@
 #include "CVcmiTestConfig.h"
 #include "../lib/filesystem/CMemoryBuffer.h"
 
-int main(int argc, char ** argv)
+int main(int argc, char * argv[])
 {
 	::testing::InitGoogleTest(&argc, argv);
 	CVcmiTestConfig test;