Force working directory to user's home-dir when started as mac application bundle.
authorChris Hanson <org/chris-hanson/cph>
Wed, 23 Dec 2009 05:00:27 +0000 (21:00 -0800)
committerChris Hanson <org/chris-hanson/cph>
Wed, 23 Dec 2009 05:00:27 +0000 (21:00 -0800)
src/microcode/option.c
src/microcode/pruxenv.c
src/microcode/uxtop.c
src/microcode/uxtop.h

index 850cdd72a81876aff8ae34b1db832113a8350631..8d43c5d22cd988375ede13237a08bce4a979d09e 100644 (file)
@@ -30,6 +30,7 @@ USA.
 #include "fasl.h"
 #include "osenv.h"
 #include "osfs.h"
+#include "uxtop.h"
 #include <sys/stat.h>
 
 #define xfree(p) OS_free ((void *) (p))
@@ -73,10 +74,6 @@ USA.
 #endif
 
 #define FILE_READABLE(filename) (OS_file_access ((filename), 4))
-
-#ifdef __APPLE__
-   extern const char * macosx_main_bundle_dir (void);
-#endif
 \f
 static bool option_summary;
 
index 29cc0f174e693fe700e292963ee1b3f8f2d797e7..1e0980122dbbea96dca6792e9af747333f499512 100644 (file)
@@ -28,6 +28,7 @@ USA.
 #include "scheme.h"
 #include "prims.h"
 #include "ux.h"
+#include "uxtop.h"
 #include "uxtrap.h"
 
 extern const char * OS_current_user_name (void);
@@ -36,10 +37,6 @@ extern const char * OS_current_user_home_directory (void);
 #ifdef HAVE_SOCKETS
 #  include "uxsock.h"
 #endif
-
-#ifdef __APPLE__
-#  include <CoreServices/CoreServices.h>
-#endif
 \f
 DEFINE_PRIMITIVE ("FILE-TIME->STRING", Prim_file_time_to_string, 1, 1,
   "Convert a file system time stamp into a date/time string.")
@@ -241,47 +238,6 @@ DEFINE_PRIMITIVE ("INSTRUCTION-ADDRESS->COMPILED-CODE-BLOCK",
 #endif
 }
 
-#ifdef __APPLE__
-const char *
-macosx_main_bundle_dir (void)
-{
-  CFBundleRef bundle;
-  CFURLRef url;
-  UInt8 buffer [4096];
-  char * bp;
-  char * result;
-
-  bundle = (CFBundleGetMainBundle());
-  if (bundle == 0)
-    return (0);
-
-  url = (CFBundleCopyResourceURL (bundle, (CFSTR ("all")), (CFSTR ("com")), 0));
-  if (url == 0)
-    return (0);
-
-  if (!CFURLGetFileSystemRepresentation (url, true, buffer, (sizeof (buffer))))
-    {
-      CFRelease (url);
-      return (0);
-    }
-  CFRelease (url);
-  bp = ((char *) buffer);
-
-  /* Discard everything after the final slash.  */
-  {
-    char * slash = (strrchr (bp, '/'));
-    if (slash != 0)
-      (*slash) = '\0';
-  }
-
-  result = (UX_malloc ((strlen (bp)) + 1));
-  if (result != 0)
-    strcpy (result, bp);
-
-  return (result);
-}
-#endif
-
 DEFINE_PRIMITIVE ("MACOSX-MAIN-BUNDLE-DIR",
                  Prim_macosx_main_bundle_dir, 0, 0, 0)
 {
index 3c2ce38edbc6fce9bc3ef103d8ea4db6c1b2b15b..b7f3404e5cd524a4edd7ca37522a65c5885340d7 100644 (file)
@@ -26,6 +26,7 @@ USA.
 #include "ux.h"
 #include "uxtop.h"
 #include "osctty.h"
+#include "osenv.h"
 #include "uxutil.h"
 #include "errors.h"
 #include "option.h"
@@ -33,6 +34,12 @@ USA.
 #include "object.h"
 #include "extern.h"
 
+#ifdef __APPLE__
+#  include <CoreServices/CoreServices.h>
+   extern const char * OS_current_user_home_directory (void);
+   static CFURLRef macosx_default_band_url (void);
+#endif
+
 extern void UX_initialize_channels (void);
 extern void UX_initialize_ctty (int interactive);
 extern void UX_initialize_directory_reader (void);
@@ -98,6 +105,16 @@ OS_initialize (void)
 #if defined(_SUNOS) || defined(_SUNOS3) || defined(_SUNOS4)
   vadvise (VA_ANOM);           /* Anomalous paging, don't try to guess. */
 #endif
+#ifdef __APPLE__
+  /* If in MacOS X application bundle, force working directory to
+     user's home directory.  */
+  if (macosx_in_app_p ())
+    {
+      const char * home_dir = OS_current_user_home_directory ();
+      if (home_dir != 0)
+       OS_set_working_dir_pathname (home_dir);
+    }
+#endif
 }
 
 void
@@ -113,11 +130,8 @@ OS_announcement (void)
 void
 OS_reset (void)
 {
-  /*
-    There should really be a reset for each initialize above,
-    but the rest seem innocuous.
-   */
-
+  /* There should really be a reset for each initialize above, but the
+     rest seem innocuous.  */
   UX_reset_channels ();
   UX_reset_terminals ();
   UX_reset_processes ();
@@ -180,6 +194,63 @@ OS_restore_external_state (void)
   UX_ctty_restore_external_state ();
 }
 \f
+#ifdef __APPLE__
+
+const char *
+macosx_main_bundle_dir (void)
+{
+  CFURLRef url = (macosx_default_band_url ());
+  UInt8 buffer [4096];
+  char * bp;
+  char * result;
+
+  if (url == 0)
+    return (0);
+
+  if (!CFURLGetFileSystemRepresentation (url, true, buffer, (sizeof (buffer))))
+    {
+      CFRelease (url);
+      return (0);
+    }
+  CFRelease (url);
+  bp = ((char *) buffer);
+
+  /* Discard everything after the final slash.  */
+  {
+    char * slash = (strrchr (bp, '/'));
+    if (slash != 0)
+      (*slash) = '\0';
+  }
+
+  result = (UX_malloc ((strlen (bp)) + 1));
+  if (result != 0)
+    strcpy (result, bp);
+
+  return (result);
+}
+
+bool
+macosx_in_app_p (void)
+{
+  CFURLRef url = (macosx_default_band_url ());
+  if (url == 0)
+    return (false);
+  CFRelease (url);
+  return (true);
+}
+
+static CFURLRef
+macosx_default_band_url (void)
+{
+  CFBundleRef bundle = (CFBundleGetMainBundle());
+  return
+    ((bundle != 0)
+     ? (CFBundleCopyResourceURL (bundle, (CFSTR ("all")), (CFSTR ("com")), 0))
+     : 0);
+}
+
+#endif
+\f
 enum syserr_names
 OS_error_code_to_syserr (int code)
 {
index 996eeddebdf00f077789de63ef8226d84d425505..a846264b747584acb7ba1395e57d82da7089972a 100644 (file)
@@ -30,4 +30,9 @@ USA.
 
 extern void UX_dump_core (void);
 
+#ifdef __APPLE__
+   extern bool macosx_in_app_p (void);
+   extern const char * macosx_main_bundle_dir (void);
+#endif
+
 #endif /* SCM_UXTOP_H */