00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if !defined(VMDNOMACBUNDLE) && (defined(ARCH_MACOSX) || defined(ARCH_MACOSXX86) || defined(ARCH_MACOSXX86_64))
00025 #include <Carbon/Carbon.h>
00026 #include <stdlib.h>
00027 #include <stdio.h>
00028 #include "utilities.h"
00029
00030 OSErr GetApplicationBundleFSSpec(FSSpecPtr theFSSpecPtr) {
00031 OSErr err;
00032 ProcessSerialNumber psn;
00033 err = GetCurrentProcess(&psn);
00034 if (err != noErr) return err;
00035
00036 FSRef location;
00037 err = GetProcessBundleLocation(&psn, &location);
00038 if (err != noErr) return err;
00039
00040 return FSGetCatalogInfo(&location, kFSCatInfoNone,
00041 NULL, NULL, theFSSpecPtr, NULL);
00042 }
00043
00044 OSErr GetApplicationPackageFSSpecFromBundle(FSSpecPtr theFSSpecPtr) {
00045 OSErr err = fnfErr;
00046 CFBundleRef myAppsBundle = CFBundleGetMainBundle();
00047 if (myAppsBundle == NULL) return err;
00048 CFURLRef myBundleURL = CFBundleCopyBundleURL(myAppsBundle);
00049 if (myBundleURL == NULL) return err;
00050
00051 FSRef myBundleRef;
00052 Boolean ok = CFURLGetFSRef(myBundleURL, &myBundleRef);
00053 CFRelease(myBundleURL);
00054 if (!ok) return err;
00055
00056 return FSGetCatalogInfo(&myBundleRef, kFSCatInfoNone,
00057 NULL, NULL, theFSSpecPtr, NULL);
00058 }
00059
00060
00061 static char * vmd_get_vmddir(void) {
00062 OSErr rc = 0;
00063 FSSpec spec;
00064 FSRef ref;
00065 UInt8 *path = NULL;
00066 char *bundledir = NULL;
00067 char *vmddir = NULL;
00068 char *tmp = NULL;
00069
00070 bundledir = (char *) malloc(2048 * sizeof(UInt8));
00071 memset(bundledir, 0, 2048 * sizeof(UInt8));
00072
00073 #if defined(ARCH_MACOSXX86_64)
00074
00075
00076
00077 CFBundleRef mainbundle = CFBundleGetMainBundle();
00078 if (mainbundle != NULL) {
00079 #if 1
00080 CFURLRef appurl = CFBundleCopyBundleURL(mainbundle);
00081 #else
00082 CFURLRef appurl = CFBundleCopyExecutableURL(mainbundle);
00083 #endif
00084 CFStringRef cfpath = CFURLCopyFileSystemPath(appurl, kCFURLPOSIXPathStyle);
00085 if (CFStringGetFileSystemRepresentation(cfpath, bundledir, 2048 * sizeof(UInt8) - 1) == true) {
00086
00087
00088
00089
00090
00091
00092
00093
00094 if (strstr(bundledir, "/Contents/Resources/VMD.app")) {
00095 if ((tmp = strrchr(bundledir, '/')) != NULL) {
00096 tmp[0] = '\0';
00097 }
00098 if ((tmp = strrchr(bundledir, '/')) != NULL) {
00099 tmp[0] = '\0';
00100 }
00101 if ((tmp = strrchr(bundledir, '/')) != NULL) {
00102 tmp[0] = '\0';
00103 }
00104
00105
00106 strcat(bundledir, "/Contents/vmd");
00107 }
00108
00109
00110 vmddir = (char *) malloc(strlen(bundledir) + 1 + strlen("/vmd"));
00111 strcpy(vmddir, bundledir);
00112 }
00113
00114 free(bundledir);
00115 CFRelease(appurl);
00116 CFRelease(cfpath);
00117 }
00118
00119 if (!vmddir) {
00120 printf("WARNING: Failed to get path for main VMD application bundle...\n");
00121 vmddir = getenv("VMDDIR");
00122 }
00123
00124 #else
00125
00126
00127
00128
00129 #if 0
00130 if (!(rc = GetApplicationPackageFSSpecFromBundle(&spec))) {
00131 #else
00132 if (!(rc = GetApplicationBundleFSSpec(&spec))) {
00133 #endif
00134 rc = FSpMakeFSRef(&spec, &ref);
00135 if (rc) printf("makefsref OSErr: %d\n", rc);
00136
00137 rc = FSRefMakePath(&ref,(UInt8 *) bundledir, 2048);
00138 if (rc) printf("makepath OSErr: %d\n", rc);
00139 } else {
00140 printf("getappbundlepath OSErr: %d\n", rc);
00141 }
00142
00143 if (rc) {
00144 free(bundledir);
00145 return NULL;
00146 }
00147
00148
00149 if ((tmp = strrchr(bundledir, '/')) != NULL) {
00150 tmp[0] = '\0';
00151 }
00152 if ((tmp = strrchr(bundledir, '/')) != NULL) {
00153 tmp[0] = '\0';
00154 }
00155
00156
00157 vmddir = (char *) malloc(strlen(bundledir) + 1 + strlen("/vmd"));
00158 strcpy(vmddir, bundledir);
00159 strcat(vmddir, "/vmd");
00160
00161 free(bundledir);
00162 #endif
00163
00164 return (char *) vmddir;
00165 }
00166
00167
00168 #if 1
00169 int macosxvmdstart(int argc, char **argv) {
00170 #else
00171 int main(int argc, char **argv) {
00172 #endif
00173 char tmp[8192];
00174 char * vmddir;
00175 int i;
00176
00177 vmddir = vmd_get_vmddir();
00178 if (vmddir == NULL) {
00179 return -1;
00180 }
00181
00182 #if 0
00183 if (!getenv("MACOSXVMDSTARTUP")) {
00184 int startterminal=1;
00185
00186 setenv("MACOSXVMDSTARTUP", "1", 1);
00187
00188 for (i=0; i < argc; i++) {
00189 if (!strupcmp(argv[i], "-dispdev")) {
00190 if (argc > i+1) {
00191 if (!strupcmp(argv[i+1], "text")) {
00192 startterminal=0;
00193 }
00194 }
00195 }
00196 }
00197
00198 if (startterminal) {
00199 char cmdbuf[16384];
00200 sprintf(cmdbuf, "\"%s/vmd_MACOSX\"", vmddir);
00201 if (argc > 1) {
00202 for (i=1; i < argc; i++) {
00203 strcat(cmdbuf, " ");
00204 strcat(cmdbuf, argv[i]);
00205 }
00206 }
00207 strcat(cmdbuf, " &");
00208
00209 printf("Executing VMD startup command: %s\n", cmdbuf);
00210 exit(system(cmdbuf));
00211 }
00212 }
00213 #endif
00214
00215 if (!getenv("VMDDIR")) {
00216 setenv("VMDDIR", vmddir, 1);
00217 }
00218
00219 if (!getenv("TCL_LIBRARY")) {
00220 strcpy(tmp, vmddir);
00221 strcat(tmp, "/scripts/tcl");
00222 setenv("TCL_LIBRARY", tmp, 1);
00223 }
00224
00225 if (!getenv("TK_LIBRARY")) {
00226 strcpy(tmp, vmddir);
00227 strcat(tmp, "/scripts/tk");
00228 setenv("TK_LIBRARY", tmp, 1);
00229 }
00230
00231 if (!getenv("PYTHONPATH")) {
00232 strcpy(tmp, vmddir);
00233 strcat(tmp, "/scripts/python");
00234 setenv("PYTHONPATH", tmp, 1);
00235 } else {
00236 strcpy(tmp, getenv("PYTHONPATH"));
00237 strcat(tmp, ":");
00238 strcat(tmp, vmddir);
00239 strcat(tmp, "/scripts/python");
00240 setenv("PYTHONPATH", tmp, 1);
00241 }
00242
00243 if (!getenv("STRIDE_BIN")) {
00244 strcpy(tmp, vmddir);
00245 #if defined(ARCH_MACOSXX86_64)
00246 strcat(tmp, "/stride_MACOSXX86_64");
00247 #elif defined(ARCH_MACOSXX86)
00248 strcat(tmp, "/stride_MACOSXX86");
00249 #else
00250 strcat(tmp, "/stride_MACOSX");
00251 #endif
00252 setenv("STRIDE_BIN", tmp, 1);
00253 }
00254
00255 if (!getenv("SURF_BIN")) {
00256 strcpy(tmp, vmddir);
00257 #if defined(ARCH_MACOSXX86_64)
00258 strcat(tmp, "/surf_MACOSXX86_64");
00259 #elif defined(ARCH_MACOSXX86)
00260 strcat(tmp, "/surf_MACOSXX86");
00261 #else
00262 strcat(tmp, "/surf_MACOSX");
00263 #endif
00264 setenv("SURF_BIN", tmp, 1);
00265 }
00266
00267 if (!getenv("TACHYON_BIN")) {
00268 strcpy(tmp, vmddir);
00269 #if defined(ARCH_MACOSXX86_64)
00270 strcat(tmp, "/tachyon_MACOSXX86_64");
00271 #elif defined(ARCH_MACOSXX86)
00272 strcat(tmp, "/tachyon_MACOSXX86");
00273 #else
00274 strcat(tmp, "/tachyon_MACOSX");
00275 #endif
00276 setenv("TACHYON_BIN", tmp, 1);
00277 }
00278
00279 return 0;
00280 }
00281
00282
00283 #endif
00284