From dff7770b7f19b3cfdcbcbc4dc205f53ef6170c2d Mon Sep 17 00:00:00 2001 From: Jack Jansen Date: Wed, 5 Sep 2001 22:07:52 +0000 Subject: Changes to make these work under OSX as the main program for a fullblown drag and drop application. To my surprise it is starting to work already: Python actually executes a script dropped on it. To be done: - Make sure this still works in MacPython - Don't lose argv[0] in the process - Applet support --- Mac/Python/macgetargv.c | 53 +++++++++++++++++------ Mac/Python/macmain.c | 113 +++++++++++++++++++++++++++++++----------------- 2 files changed, 113 insertions(+), 53 deletions(-) diff --git a/Mac/Python/macgetargv.c b/Mac/Python/macgetargv.c index 1bd57ad..c5af0ec 100644 --- a/Mac/Python/macgetargv.c +++ b/Mac/Python/macgetargv.c @@ -27,6 +27,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include +#ifdef WITHOUT_FRAMEWORKS #include #include #include @@ -40,6 +41,9 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#else +#include +#endif /* WITHOUT_FRAMEWORKS */ #if UNIVERSAL_INTERFACES_VERSION >= 0x0340 typedef long refcontype; @@ -54,7 +58,6 @@ static int arg_count; static char *arg_vector[256]; FSSpec PyMac_ApplicationFSSpec; char PyMac_ApplicationPath[256]; -static int applocation_inited; /* Duplicate a string to the heap. We also export this since it isn't standard ** and others use it @@ -70,14 +73,33 @@ strdup(const char *src) } #endif +#if TARGET_API_MAC_OSX +OSErr +PyMac_GetFullPath(FSSpec *fss, char *path) +{ + FSRef fsr; + OSErr err; + + *path = '\0'; + err = FSpMakeFSRef(fss, &fsr); + if ( err ) return err; + err = (OSErr)FSRefMakePath(&fsr, path, 1024); + if ( err ) return err; + return 0; +} +#endif /* TARGET_API_MAC_OSX */ + + +#if !TARGET_API_MAC_OSX /* Initialize FSSpec and full name of current application */ OSErr -PyMac_init_process_location() +PyMac_init_process_location(void) { ProcessSerialNumber currentPSN; ProcessInfoRec info; OSErr err; + static int applocation_inited; if ( applocation_inited ) return 0; currentPSN.highLongOfPSN = 0; @@ -92,6 +114,7 @@ PyMac_init_process_location() applocation_inited = 1; return 0; } +#endif /* !TARGET_API_MAC_OSX */ /* Check that there aren't any args remaining in the event */ @@ -147,15 +170,15 @@ handle_open_doc(const AppleEvent *theAppleEvent, AppleEvent *reply, refcontype r DescType rttype; long i, ndocs, size; FSSpec fss; - char path[256]; + char path[1024]; got_one = 1; - if (err = AEGetParamDesc(theAppleEvent, - keyDirectObject, typeAEList, &doclist)) + if ((err = AEGetParamDesc(theAppleEvent, + keyDirectObject, typeAEList, &doclist))) return err; - if (err = get_missing_params(theAppleEvent)) + if ((err = get_missing_params(theAppleEvent))) return err; - if (err = AECountItems(&doclist, &ndocs)) + if ((err = AECountItems(&doclist, &ndocs))) return err; for(i = 1; i <= ndocs; i++) { err = AEGetNthPtr(&doclist, i, typeFSS, @@ -174,7 +197,7 @@ AEEventHandlerUPP open_app_upp; AEEventHandlerUPP not_upp; static void -set_ae_handlers() +set_ae_handlers(void) { open_doc_upp = NewAEEventHandlerUPP(&handle_open_doc); open_app_upp = NewAEEventHandlerUPP(&handle_open_app); @@ -193,7 +216,7 @@ set_ae_handlers() /* Uninstall standard core event handlers */ static void -reset_ae_handlers() +reset_ae_handlers(void) { AERemoveEventHandler(kCoreEventClass, kAEOpenApplication, open_app_upp, false); @@ -208,7 +231,7 @@ reset_ae_handlers() /* Wait for events until a core event has been handled */ static void -event_loop() +event_loop(void) { EventRecord event; int n; @@ -229,14 +252,16 @@ event_loop() /* Get the argv vector, return argc */ int -PyMac_GetArgv(pargv, noevents) - char ***pargv; - int noevents; +PyMac_GetArgv(char ***pargv, int noevents) { - arg_count = 0; +#if TARGET_API_MAC_OSX + /* In an OSX bundle argv[0] is okay */ + arg_count++; +#else (void)PyMac_init_process_location(); arg_vector[arg_count++] = strdup(PyMac_ApplicationPath); +#endif /* TARGET_API_MAC_OSX */ if( !noevents ) { set_ae_handlers(); diff --git a/Mac/Python/macmain.c b/Mac/Python/macmain.c index c72bc33..39f6222 100644 --- a/Mac/Python/macmain.c +++ b/Mac/Python/macmain.c @@ -30,6 +30,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "marshal.h" #include "macglue.h" +#ifdef WITHOUT_FRAMEWORKS #include #include #include @@ -41,21 +42,23 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #endif /* USE_APPEARANCE */ +#else +#include +#endif /* WITHOUT_FRAMEWORKS */ + #ifdef __MWERKS__ #include #define USE_SIOUX extern int ccommand(char ***); #if __profile__ == 1 #include -#endif -#endif +#endif /* __profile__ */ +#endif /* __MWERKS__ */ + #include #ifdef USE_MAC_SHARED_LIBRARY extern PyMac_AddLibResources(void); #endif -//#ifdef USE_GUSI -//#include "GUSISIOUX.h" -//#endif #define STARTUP "PythonStartup" @@ -81,7 +84,7 @@ PyMac_PrefRecord PyMac_options; static void Py_Main(int, char **); /* Forward */ void PyMac_Exit(int); /* Forward */ -static void init_appearance() +static void init_appearance(void) { #ifdef USE_APPEARANCE OSErr err; @@ -99,7 +102,7 @@ no_appearance: /* Initialize the Mac toolbox world */ static void -init_mac_world() +init_mac_world(void) { #if !TARGET_API_MAC_CARBON /* These aren't needed for carbon */ @@ -127,8 +130,6 @@ PyMac_InteractiveOptions(PyMac_PrefRecord *p, int *argcp, char ***argvp) ControlHandle handle; DialogPtr dialog; Rect rect; - int old_argc = *argcp; - int i; /* ** If the preferences disallows interactive options we return, @@ -191,7 +192,10 @@ PyMac_InteractiveOptions(PyMac_PrefRecord *p, int *argcp, char ***argvp) HMSetBalloons(!HMGetBalloons()); } #endif +#if !TARGET_API_MAC_OSX if ( item == OPT_CMDLINE ) { + int old_argc = *argcp; + int i; int new_argc, newer_argc; char **new_argv, **newer_argv; @@ -209,6 +213,7 @@ PyMac_InteractiveOptions(PyMac_PrefRecord *p, int *argcp, char ***argvp) /* XXXX Is it not safe to use free() here, apparently */ } +#endif /* !TARGET_API_MAC_OSX */ #define OPT_ITEM(num, var) \ if ( item == (num) ) { \ p->var = !p->var; \ @@ -283,7 +288,9 @@ init_common(int *argcp, char ***argvp, int embedded) #ifdef USE_SIOUX /* Set various SIOUX flags. Some are changed later based on options */ -/* SIOUXSettings.standalone = 0; /* XXXX Attempting to keep sioux from eating events */ +#if 0 + SIOUXSettings.standalone = 0; /* XXXX Attempting to keep sioux from eating events */ +#endif SIOUXSettings.asktosaveonclose = 0; SIOUXSettings.showstatusline = 0; SIOUXSettings.tabspaces = 4; @@ -291,8 +298,11 @@ init_common(int *argcp, char ***argvp, int embedded) /* Get options from preference file (or from applet resource fork) */ PyMac_options.keep_console = POPT_KEEPCONSOLE_OUTPUT; /* default-default */ + PyMac_options.unixnewlines = 1; +#if !TARGET_API_MAC_OSX PyMac_PreferenceOptions(&PyMac_options); - +#endif + if ( embedded ) { static char *emb_argv[] = {"embedded-python", 0}; @@ -301,6 +311,7 @@ init_common(int *argcp, char ***argvp, int embedded) } else { /* Create argc/argv. Do it before we go into the options event loop. */ *argcp = PyMac_GetArgv(argvp, PyMac_options.noargs); +#if !TARGET_API_MAC_OSX #ifndef NO_ARGV0_CHDIR if (*argcp >= 1 && (*argvp)[0] && (*argvp)[0][0]) { /* Workaround for MacOS X, which currently (DP4) doesn't set @@ -314,6 +325,7 @@ init_common(int *argcp, char ***argvp, int embedded) chdir(app_wd); } #endif +#endif /* Do interactive option setting, if allowed and