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 18cbe5658..d746eaf43 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..ba69da3af 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/Application Support/"; #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/app_bundle_utils.cpp b/code/ryzom/client/src/app_bundle_utils.cpp new file mode 100644 index 000000000..ebd1960d3 --- /dev/null +++ b/code/ryzom/client/src/app_bundle_utils.cpp @@ -0,0 +1,65 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "app_bundle_utils.h" + +#if defined(NL_OS_MAC) +#include + +std::string getAppBundlePath() +{ + static std::string cachedPathToBundle; + + if(cachedPathToBundle.size()) + return cachedPathToBundle; + + // 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) + { + cachedPathToBundle = CFStringGetCStringPtr( + str, CFStringGetSmallestEncoding(str)); + CFRelease(str); + + return cachedPathToBundle; + } + else + nlerror("CFStringGetCStringPtr"); + } + else + nlerror("CFBundleCopyBundleURL"); + } + else + nlerror("CFBundleGetMainBundle"); + + return std::string(); +} + +#endif // defined(NL_OS_MAC) diff --git a/code/ryzom/client/src/app_bundle_utils.h b/code/ryzom/client/src/app_bundle_utils.h new file mode 100644 index 000000000..f2adad6db --- /dev/null +++ b/code/ryzom/client/src/app_bundle_utils.h @@ -0,0 +1,32 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef CL_APP_BUNDLE_UTILS_H +#define CL_APP_BUNDLE_UTILS_H 1 + +#include "nel/misc/types_nl.h" + +#if defined(NL_OS_MAC) +#include + +/** + * Returns the current path to the .app bundle on Mac OS X. + * @note This path will have "Contents" as sub directory. + */ +std::string getAppBundlePath(); + +#endif // defined(NL_OS_MAC) +#endif // CL_APP_BUNDLE_UTILS_H diff --git a/code/ryzom/client/src/client.cpp b/code/ryzom/client/src/client.cpp index 7d5ddeb34..43ea4408a 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 "nel/misc/dynloadlib.h" +#include "app_bundle_utils.h" #endif #include "nel/misc/debug.h" @@ -383,6 +385,9 @@ int main(int argc, char **argv) getrlimit(RLIMIT_NOFILE, &rlp3); nlinfo("rlimit before %d %d\n", rlp.rlim_cur, rlp.rlim_max); nlinfo("rlimit after %d %d\n", rlp3.rlim_cur, rlp3.rlim_max); + + // add the bundle's plugins path as library search path (for nel drivers) + CLibrary::addLibPath(getAppBundlePath() + "/Contents/PlugIns/nel/"); #endif #if defined(NL_OS_WINDOWS) diff --git a/code/ryzom/client/src/client_cfg.cpp b/code/ryzom/client/src/client_cfg.cpp index 3444eae7f..dab0b8dba 100644 --- a/code/ryzom/client/src/client_cfg.cpp +++ b/code/ryzom/client/src/client_cfg.cpp @@ -45,6 +45,10 @@ # include "config.h" #endif // HAVE_CONFIG_H +#ifdef NL_OS_MAC +#include "app_bundle_utils.h" +#endif // NL_OS_MAC + #include /////////// @@ -1888,7 +1892,14 @@ void CClientConfig::init(const string &configFileName) if (CFile::isExists(defaultConfigFileName)) found = true; -#ifdef RYZOM_ETC_PREFIX +#ifdef NL_OS_MAC + if (!found) + { + defaultConfigFileName = + getAppBundlePath() + "/Contents/Resources/" + defaultConfigFileName; + if(CFile::isExists(defaultConfigFileName)) found = true; + } +#elif defined(RYZOM_ETC_PREFIX) if (!found) { defaultConfigFileName = CPath::standardizePath(RYZOM_ETC_PREFIX) + defaultConfigFileName; diff --git a/code/ryzom/client/src/init.cpp b/code/ryzom/client/src/init.cpp index 5bdac0321..a0f0c5fd2 100644 --- a/code/ryzom/client/src/init.cpp +++ b/code/ryzom/client/src/init.cpp @@ -103,6 +103,10 @@ extern HINSTANCE HInstance; extern HWND SlashScreen; #endif // NL_OS_WINDOWS +#ifdef NL_OS_MAC +#include "app_bundle_utils.h" +#endif // NL_OS_MAC + #include /////////// @@ -615,7 +619,11 @@ void addPreDataPaths(NLMISC::IProgressCallback &progress) progress.progress ((float)i/(float)ClientCfg.PreDataPath.size()); progress.pushCropedValues ((float)i/(float)ClientCfg.PreDataPath.size(), (float)(i+1)/(float)ClientCfg.PreDataPath.size()); - CPath::addSearchPath(ClientCfg.PreDataPath[i], true, false, &progress); + std::string preDataPath = ClientCfg.PreDataPath[i]; +#if defined(NL_OS_MAC) + preDataPath = getAppBundlePath() + "/Contents/Resources/" + preDataPath; +#endif // defined(NL_OS_MAC) + CPath::addSearchPath(preDataPath, true, false, &progress); progress.popCropedValues (); }