Просмотр исходного кода

use ~/Library/Caches/Panda3D on Mac, ~/Panda3D on Linux

David Rose 16 лет назад
Родитель
Сommit
54e34d4672

+ 2 - 0
direct/src/plugin/Sources.pp

@@ -33,6 +33,7 @@
   #define SOURCES \
     fileSpec.cxx fileSpec.h fileSpec.I \
     find_root_dir.cxx find_root_dir.h \
+    $[if $[IS_OSX],find_root_dir_assist.mm] \
     get_tinyxml.h \
     binaryXml.cxx binaryXml.h \
     fhandle.h \
@@ -149,6 +150,7 @@
     load_plugin.cxx load_plugin.h \
     fileSpec.cxx fileSpec.h fileSpec.I \
     find_root_dir.cxx find_root_dir.h \
+    $[if $[IS_OSX],find_root_dir_assist.mm] \
     is_pathsep.h is_pathsep.I \
     mkdir_complete.cxx mkdir_complete.h
 

+ 9 - 2
direct/src/plugin/find_root_dir.cxx

@@ -241,8 +241,15 @@ find_root_dir() {
     }
   }
 
+#elif defined(__APPLE__)
+  // e.g., /Users/<username>/Library/Caches/Panda3D
+  string root = find_osx_root_dir();
+  if (!root.empty()) {
+    return root;
+  }
+
 #else  // _WIN32
-  // e.g., /home/<username>/.panda3d
+  // e.g., /home/<username>/Panda3D
 
   string root;
   const char *uname = getlogin();
@@ -255,7 +262,7 @@ find_root_dir() {
     root = pwdata->pw_dir;
   }
   
-  root += "/.panda3d";
+  root += "/Panda3D";
   if (mkdir(root.c_str(), 0700) == 0 || errno == EEXIST) {
     return root;
   }

+ 4 - 0
direct/src/plugin/find_root_dir.h

@@ -21,4 +21,8 @@ using namespace std;
 
 string find_root_dir();
 
+#ifdef __APPLE__
+string find_osx_root_dir();
+#endif  // __APPLE__
+
 #endif

+ 92 - 0
direct/src/plugin/find_root_dir_assist.mm

@@ -0,0 +1,92 @@
+// Filename: filename_assist.mm
+// Created by:  drose (13Apr09)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) Carnegie Mellon University.  All rights reserved.
+//
+// All use of this software is subject to the terms of the revised BSD
+// license.  You should have received a copy of this license along
+// with this source code in a file named "LICENSE."
+//
+////////////////////////////////////////////////////////////////////
+
+#include "find_root_dir.h"
+
+#ifdef __APPLE__
+
+#include <Foundation/Foundation.h>
+#include <AppKit/AppKit.h>
+
+////////////////////////////////////////////////////////////////////
+//     Function: NSString_to_cpp_string
+//  Description: Copy the Objective-C string to a C++ string.
+////////////////////////////////////////////////////////////////////
+static string 
+NSString_to_cpp_string(NSString *str) {
+  size_t length = [str length];
+  string result;
+  for (size_t i = 0; i < length; ++i) {
+    result += (char)[str characterAtIndex: i];
+  }
+
+  return result;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: call_NSSearchPathForDirectories
+//  Description: 
+////////////////////////////////////////////////////////////////////
+static string 
+call_NSSearchPathForDirectories(NSSearchPathDirectory dirkey, NSSearchPathDomainMask domain) {
+  // Ensure that Carbon has been initialized, and that we have an
+  // auto-release pool.
+  NSApplicationLoad();
+  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
+
+  NSArray *paths = NSSearchPathForDirectoriesInDomains(dirkey, domain, YES);
+  string result;
+  if ([paths count] != 0) {
+    result = NSString_to_cpp_string([paths objectAtIndex:0]);
+  }
+  [pool release]; 
+
+  return result;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: get_osx_home_directory
+//  Description: 
+////////////////////////////////////////////////////////////////////
+static string
+get_osx_home_directory() {
+  NSApplicationLoad();
+  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
+
+  NSString *dir = NSHomeDirectory();
+  string result = NSString_to_cpp_string(dir);
+  [pool release]; 
+
+  return result;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: find_osx_root_dir
+//  Description: 
+////////////////////////////////////////////////////////////////////
+string
+find_osx_root_dir() {
+  string result = call_NSSearchPathForDirectories(NSCachesDirectory, NSUserDomainMask);
+  if (!result.empty()) {
+    return result + "/Panda3D";
+  }
+  result = get_osx_home_directory();
+  if (!result.empty()) {
+    return result + "/Panda3D";
+  }
+
+  return string();
+}
+
+#endif  // __APPLE__