diff --git a/Mac/Include/macglue.h b/Mac/Include/macglue.h index 9213f2f33f67..58b28e041b9f 100644 --- a/Mac/Include/macglue.h +++ b/Mac/Include/macglue.h @@ -39,6 +39,10 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #pragma lib_export on #endif +#ifdef USE_GUSI +void PyMac_FixGUSIcd Py_PROTO((void)); /* Workaround for GUSI chdir() call */ +#endif + char *PyMac_StrError(int); /* strerror with mac errors */ extern int PyMac_DoYieldEnabled; /* Don't do eventloop when false */ diff --git a/Mac/Modules/macmodule.c b/Mac/Modules/macmodule.c index 4190db0b80c9..75716db66d96 100644 --- a/Mac/Modules/macmodule.c +++ b/Mac/Modules/macmodule.c @@ -176,7 +176,17 @@ mac_chdir(self, args) object *self; object *args; { +#ifdef USE_GUSI + object *rv; + + /* Change MacOS's idea of wd too */ + rv = mac_1str(args, chdir); + PyMac_FixGUSIcd(); + return rv; +#else return mac_1str(args, chdir); +#endif + } static object * diff --git a/Mac/Python/macglue.c b/Mac/Python/macglue.c index dd4499e32f06..215accc6932d 100644 --- a/Mac/Python/macglue.c +++ b/Mac/Python/macglue.c @@ -51,6 +51,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #endif #ifdef USE_GUSI #include /* For Path2FSSpec */ +#include /* For SetSFCurDir, etc */ #endif #ifndef HAVE_UNIVERSAL_HEADERS @@ -118,6 +119,34 @@ struct hook_args { static DlgHookYDUPP myhook_upp; static int upp_inited = 0; +#ifdef USE_GUSI +/* +** GUSI (1.6.0 and earlier, at the least) do not set the MacOS idea of +** the working directory. Hence, we call this routine after each call +** to chdir() to rectify things. +*/ +void +PyMac_FixGUSIcd() +{ + WDPBRec pb; + FSSpec curdirfss; + + if ( Path2FSSpec(":x", &curdirfss) != noErr ) + return; + + /* Set MacOS "working directory" */ + pb.ioNamePtr= "\p"; + pb.ioVRefNum= curdirfss.vRefNum; + pb.ioWDDirID= curdirfss.parID; + if (PBHSetVol(&pb, 0) != noErr) + return; + + /* Set standard-file working directory */ + LMSetSFSaveDisk(-curdirfss.vRefNum); + LMSetCurDirStore(curdirfss.parID); +} +#endif + /* Convert C to Pascal string. Returns pointer to static buffer. */ unsigned char * @@ -657,21 +686,8 @@ PyMac_GetFSSpec(PyObject *v, FSSpec *fs) /* It's a pathname */ if( !PyArg_Parse(v, "O&", PyMac_GetStr255, &path) ) return 0; -#ifdef USE_GUSI - { - FSSpec curdirfss; - - if ( Path2FSSpec(":x", &curdirfss) == 0 ) { - refnum = curdirfss.vRefNum; - parid = curdirfss.parID; - } else { - return 0; - } - } -#else - refnum = 0; /* XXXX Should get CurWD here... */ + refnum = 0; /* XXXX Should get CurWD here?? */ parid = 0; -#endif } else { if( !PyArg_Parse(v, "(hlO&); FSSpec should be fullpath or (vrefnum,dirid,path)", &refnum, &parid, PyMac_GetStr255, &path)) { @@ -687,7 +703,6 @@ PyMac_GetFSSpec(PyObject *v, FSSpec *fs) } - /* Convert a Python object to a Rect. The object must be a (left, top, right, bottom) tuple. (This differs from the order in the struct but is consistent with diff --git a/Mac/Python/macmain.c b/Mac/Python/macmain.c index 3d878ed4328b..5cea381b429f 100644 --- a/Mac/Python/macmain.c +++ b/Mac/Python/macmain.c @@ -192,6 +192,10 @@ PyMac_InitApplication() *endp = '\0'; chdir(curwd); +#ifdef USE_GUSI + /* Change MacOS's idea of wd too */ + PyMac_FixGUSIcd(); +#endif } } Py_Main(argc, argv);