diff options
-rw-r--r-- | src/bundle.h | 11 | ||||
-rw-r--r-- | src/bundle.mm | 36 | ||||
-rw-r--r-- | src/client.cpp | 59 | ||||
-rw-r--r-- | src/log.cpp | 8 | ||||
-rw-r--r-- | src/window.h | 10 | ||||
-rw-r--r-- | src/window.mm | 26 |
6 files changed, 118 insertions, 32 deletions
diff --git a/src/bundle.h b/src/bundle.h new file mode 100644 index 00000000..3231988c --- /dev/null +++ b/src/bundle.h @@ -0,0 +1,11 @@ +// +// bundle.h +// themanaworld +// +// Created by David Athay on 1/27/11. +// Copyright 2011 __MyCompanyName__. All rights reserved. +// + +#include <string> + +std::string getBundleResourcesPath(); diff --git a/src/bundle.mm b/src/bundle.mm new file mode 100644 index 00000000..424e35f8 --- /dev/null +++ b/src/bundle.mm @@ -0,0 +1,36 @@ +// +// bundle.m +// themanaworld +// +// Created by David Athay on 1/27/11. +// Copyright 2011 __MyCompanyName__. All rights reserved. +// + +#import "bundle.h" +#import <Cocoa/Cocoa.h> + +std::string getBundleResourcesPath() +{ + std::string resPath; + NSBundle *mainBundle; + + // Get the main bundle for the app. + mainBundle = [NSBundle mainBundle]; + + NSString *bundlePath = [mainBundle bundlePath]; + NSArray *bundlePathArray = [[NSFileManager defaultManager] directoryContentsAtPath:bundlePath]; + // check it contains the right directories + if ((nil != bundlePathArray) && ([bundlePathArray containsObject:@"Contents"])) + { + NSString *contentsPath = [bundlePath stringByAppendingPathComponent:@"Contents"]; + NSArray *contentsPathArray = [[NSFileManager defaultManager] directoryContentsAtPath:contentsPath]; + if ((nil != contentsPath) && ([contentsPathArray containsObject:@"MacOS"]) && ([contentsPathArray containsObject:@"Resources"])) + { + // get the final path of the resources + NSString *finalResourcesPath = [contentsPath stringByAppendingPathComponent:@"Resources"]; + resPath = [finalResourcesPath UTF8String]; + } + } + + return resPath; +}
\ No newline at end of file diff --git a/src/client.cpp b/src/client.cpp index b57c3ae8..42a8465b 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -77,7 +77,8 @@ #include "utils/stringutils.h" #ifdef __APPLE__ -#include <CoreFoundation/CFBundle.h> +#include "window.h" +#include "bundle.h" #endif #include <physfs.h> @@ -211,16 +212,35 @@ Client::Client(const Options &options): mInstance = this; logger = new Logger; + + ResourceManager *resman = ResourceManager::getInstance(); + +#if defined __APPLE__ + std::string path; + path = getBundleResourcesPath(); + path.append("/data"); + resman->addToSearchPath(path.c_str(), false); + mPackageDir = path; +#else + resman->addToSearchPath(PKG_DATADIR "data", false); + mPackageDir = PKG_DATADIR "data"; +#endif // Load branding information if (!options.brandingPath.empty()) { - branding.init(options.brandingPath); + branding.init(options.brandingPath, true); } - + initRootDir(); initHomeDir(); initConfiguration(); + + if (!resman->setWriteDir(mLocalDataDir)) + { + logger->error(strprintf("%s couldn't be set as home directory! " + "Exiting.", mLocalDataDir.c_str())); + } // Configure logger logger->setLogFile(mLocalDataDir + std::string("/mana.log")); @@ -245,34 +265,8 @@ Client::Client(const Options &options): SDL_WM_SetCaption(branding.getValue("appName", "Mana").c_str(), NULL); - ResourceManager *resman = ResourceManager::getInstance(); - - if (!resman->setWriteDir(mLocalDataDir)) - { - logger->error(strprintf("%s couldn't be set as home directory! " - "Exiting.", mLocalDataDir.c_str())); - } - Image::SDLsetEnableAlphaCache(config.getValue("alphaCache", true)); -#if defined __APPLE__ - CFBundleRef mainBundle = CFBundleGetMainBundle(); - CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); - char path[PATH_MAX]; - if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, - PATH_MAX)) - { - fprintf(stderr, "Can't find Resources directory\n"); - } - CFRelease(resourcesURL); - strncat(path, "/data", PATH_MAX - 1); - resman->addToSearchPath(path, false); - mPackageDir = path; -#else - resman->addToSearchPath(PKG_DATADIR "data", false); - mPackageDir = PKG_DATADIR "data"; -#endif - resman->addToSearchPath("data", false); // Add branding/data to PhysFS search path @@ -302,10 +296,15 @@ Client::Client(const Options &options): std::string iconFile = branding.getValue("appIcon", "icons/mana"); #ifdef WIN32 iconFile += ".ico"; +#elif defined (__APPLE__) + // MacOSX expects just the filename without extension + iconFile = iconFile.substr(iconFile.find_last_of("/")+1); #else iconFile += ".png"; #endif +#ifndef __APPLE__ iconFile = resman->getPath(iconFile); +#endif logger->log("Loading icon from file: %s", iconFile.c_str()); #ifdef WIN32 static SDL_SysWMinfo pInfo; @@ -320,6 +319,8 @@ Client::Client(const Options &options): if (icon) SetClassLong(pInfo.window, GCL_HICON, (LONG) icon); +#elif defined(__APPLE__) + setIcon(iconFile.c_str()); #else mIcon = IMG_Load(iconFile.c_str()); if (mIcon) diff --git a/src/log.cpp b/src/log.cpp index 5880e108..acb9f67c 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -26,7 +26,8 @@ #ifdef WIN32 #include <windows.h> #elif __APPLE__ -#include <Carbon/Carbon.h> +//#include <Carbon/Carbon.h> +#include "window.h" #endif #include <sys/time.h> @@ -114,7 +115,7 @@ void Logger::error(const std::string &error_text) #ifdef WIN32 MessageBox(NULL, error_text.c_str(), "Error", MB_ICONERROR | MB_OK); #elif defined __APPLE__ - Str255 msg; + /*Str255 msg; CFStringRef error; error = CFStringCreateWithCString(NULL, error_text.c_str(), @@ -122,7 +123,8 @@ void Logger::error(const std::string &error_text) CFStringGetPascalString(error, msg, 255, kCFStringEncodingMacRoman); StandardAlert(kAlertStopAlert, "\pError", - (ConstStr255Param) msg, NULL, NULL); + (ConstStr255Param) msg, NULL, NULL);*/ + windowAlert(error_text.c_str()); #elif defined __linux__ || __linux std::cerr << "Error: " << error_text << std::endl; std::string msg="xmessage \"" + error_text + "\""; diff --git a/src/window.h b/src/window.h new file mode 100644 index 00000000..482f65ee --- /dev/null +++ b/src/window.h @@ -0,0 +1,10 @@ +// +// window.h +// themanaworld +// +// Created by David Athay on 1/27/11. +// Copyright 2011 __MyCompanyName__. All rights reserved. +// + +void setIcon(const char *icon); +void windowAlert(const char *msg);
\ No newline at end of file diff --git a/src/window.mm b/src/window.mm new file mode 100644 index 00000000..f631f17d --- /dev/null +++ b/src/window.mm @@ -0,0 +1,26 @@ +// +// window.m +// themanaworld +// +// Created by David Athay on 1/27/11. +// Copyright 2011 __MyCompanyName__. All rights reserved. +// + +#import "window.h" +#import <Cocoa/Cocoa.h> + +void setIcon(const char *icon) +{ + NSString *path = [NSString stringWithCString:icon + encoding:[NSString defaultCStringEncoding]]; + NSString *imageName = [[NSBundle mainBundle] pathForResource:path ofType:@"icns" inDirectory:@"data/icons"]; + NSImage *iconImage = [[NSImage alloc] initWithContentsOfFile:imageName]; + [NSApp setApplicationIconImage: iconImage]; +} + +void windowAlert(const char *msg) +{ + NSString *alertText = [NSString stringWithCString:msg + encoding:[NSString defaultCStringEncoding]]; + NSRunAlertPanel(nil, alertText , @"OK", nil, nil); +}
\ No newline at end of file |