From 5033d704711d13b02cac64931dd853b4e6314727 Mon Sep 17 00:00:00 2001 From: rti Date: Wed, 3 Nov 2010 13:39:35 +0100 Subject: [PATCH] Changed: #1153 Make ryzom_client run completely in an .app bundle --- .../driver/opengl/mac/cocoa_event_emitter.cpp | 6 ++- code/nel/src/misc/path.cpp | 5 +++ code/ryzom/client/src/CMakeLists.txt | 5 +++ code/ryzom/client/src/client.cpp | 43 +++++++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp b/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp index 482474de5..0c75ed12b 100644 --- a/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp +++ b/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp @@ -231,7 +231,11 @@ void CCocoaEventEmitter::init(NL3D::IDriver* driver, CocoaOpenGLView* glView) bool CCocoaEventEmitter::processMessage(NSEvent* event, CEventServer* server) { if(!server && !_server) - nlerror("no server to post events to"); + { + // nlerror("no server to post events to"); + nldebug("no server to post events to"); + return true; + } if(!server) server = _server; diff --git a/code/nel/src/misc/path.cpp b/code/nel/src/misc/path.cpp index dfc8e6381..0abc4ba8c 100644 --- a/code/nel/src/misc/path.cpp +++ b/code/nel/src/misc/path.cpp @@ -1700,6 +1700,9 @@ std::string CFileContainer::getApplicationDirectory(const std::string &appName) wchar_t buffer[MAX_PATH]; SHGetSpecialFolderPathW(NULL, buffer, CSIDL_APPDATA, TRUE); appPath = CPath::standardizePath(ucstring((ucchar*)buffer).toUtf8()); +#elif defined(NL_OS_MAC) + appPath = CPath::standardizePath(getenv("HOME")); + appPath += "/Library/Preferences/"; #else appPath = CPath::standardizePath(getenv("HOME")); #endif @@ -1709,6 +1712,8 @@ std::string CFileContainer::getApplicationDirectory(const std::string &appName) #ifdef NL_OS_WINDOWS if (!appName.empty()) path = CPath::standardizePath(path + appName); +#elif defined(NL_OS_MAC) + path = CPath::standardizePath(path + appName); #else if (!appName.empty()) path = CPath::standardizePath(path + "." + toLower(appName)); diff --git a/code/ryzom/client/src/CMakeLists.txt b/code/ryzom/client/src/CMakeLists.txt index 91aa8e20e..75c1e0538 100644 --- a/code/ryzom/client/src/CMakeLists.txt +++ b/code/ryzom/client/src/CMakeLists.txt @@ -97,6 +97,11 @@ IF(NOT APPLE AND NOT WIN32) TARGET_LINK_LIBRARIES(ryzom_client ${X11_LIBRARIES}) ENDIF(NOT APPLE AND NOT WIN32) +IF(APPLE) + FIND_LIBRARY(FOUNDATION_LIBRARY Foundation) + TARGET_LINK_LIBRARIES(ryzom_client ${FOUNDATION_LIBRARY}) +ENDIF(APPLE) + ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${CURL_DEFINITIONS}) NL_DEFAULT_PROPS(ryzom_client "Ryzom, Client: Ryzom Core Client") diff --git a/code/ryzom/client/src/client.cpp b/code/ryzom/client/src/client.cpp index 7d5ddeb34..427439519 100644 --- a/code/ryzom/client/src/client.cpp +++ b/code/ryzom/client/src/client.cpp @@ -33,6 +33,8 @@ #ifdef NL_OS_MAC #include #include +#include +#include "nel/misc/dynloadlib.h" #endif #include "nel/misc/debug.h" @@ -350,6 +352,47 @@ int main(int argc, char **argv) // init the Nel context CApplicationContext *appContext = new CApplicationContext; +#if defined(NL_OS_MAC) + // get the bundle + CFBundleRef bundle = CFBundleGetMainBundle(); + if(bundle) + { + // get the url to the bundles root + CFURLRef url = CFBundleCopyBundleURL(bundle); + if(url) + { + // get the file system path + CFStringRef str; + str = CFURLCopyFileSystemPath( + CFURLCopyAbsoluteURL(url), kCFURLPOSIXPathStyle); + CFRelease(url); + + if(str) + { + std::string pathToBundle = CFStringGetCStringPtr( + str, CFStringGetSmallestEncoding(str)); + CFRelease(str); + + // change the working directory + nldebug("Bundle Path is %s", pathToBundle.c_str()); + nldebug("setCurrentPath %s", (pathToBundle + "/Contents/Resources/").c_str()); + CPath::setCurrentPath(pathToBundle + "/Contents/Resources/"); + + // add the search path for plugins (nel drivers) + nldebug("addLibPath %s", (pathToBundle + "/Contents/PlugIns/nel/").c_str()); + CLibrary::addLibPath(pathToBundle + "/Contents/PlugIns/nel/"); + } + else + nlerror("CFStringGetCStringPtr"); + + } + else + nlerror("CFBundleCopyBundleURL"); + } + else + nlerror("CFBundleGetMainBundle"); +#endif + createDebug(); #ifndef NL_DEBUG