diff --git a/Mac/Include/macglue.h b/Mac/Include/macglue.h index 02ee84cd251..929e9cabd04 100644 --- a/Mac/Include/macglue.h +++ b/Mac/Include/macglue.h @@ -46,19 +46,23 @@ void PyMac_FixGUSIcd Py_PROTO((void)); /* Workaround for GUSI chdir() call */ char *PyMac_StrError(int); /* strerror with mac errors */ extern int PyMac_DoYieldEnabled; /* Don't do eventloop when false */ +#ifdef USE_GUSI +extern int PyMac_ConsoleIsDead; /* True when exiting */ +extern void PyMac_SetGUSISpin(void); /* Install our private GUSI spin routine */ +#endif extern PyObject *PyMac_OSErrException; /* Exception for OSErr */ PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ +#ifdef USE_MACTCP int PyMac_Idle Py_PROTO((void)); /* Idle routine */ +#endif void PyMac_Yield Py_PROTO((void)); /* optional idle routine for mainloop */ void PyMac_SetYield Py_PROTO((long, long, long, long)); /* Set timeouts */ PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ void PyMac_HandleEvent Py_PROTO((EventRecord *)); /* Handle one event, if possible */ -int PyMac_Idle(void); /* Idle routine */ - int PyMac_FindResourceModule(char *, char *); /* Test for 'PYC ' resource in a file */ PyObject * PyMac_LoadResourceModule(char *, char *); /* Load 'PYC ' resource from file */ diff --git a/Mac/Python/macglue.c b/Mac/Python/macglue.c index 112604ee028..18243ec6875 100644 --- a/Mac/Python/macglue.c +++ b/Mac/Python/macglue.c @@ -65,6 +65,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifdef USE_GUSI #include /* For Path2FSSpec */ #include /* For SetSFCurDir, etc */ +#include #endif #ifndef HAVE_UNIVERSAL_HEADERS @@ -110,6 +111,8 @@ extern FSSpec *mfs_GetFSSpecFSSpec(); static int interrupted; /* Set to true when cmd-. seen */ static RETSIGTYPE intcatcher Py_PROTO((int)); +static void PyMac_DoYield Py_PROTO((int)); + /* ** We attempt to be a good citizen by giving up the CPU periodically. ** When in the foreground we do this less often and for shorter periods @@ -134,6 +137,11 @@ static int in_foreground; */ int PyMac_DoYieldEnabled = 1; +/* +** Workaround for sioux/gusi combo: set when we are exiting +*/ +int PyMac_ConsoleIsDead; + /* ** Some stuff for our GetDirectory and PromptGetFile routines */ @@ -171,6 +179,40 @@ PyMac_FixGUSIcd() void SpinCursor(short x) { /* Dummy */ } #endif /* __CFM68K */ +/* +** Replacement GUSI Spin function +*/ +static int +PyMac_GUSISpin(spin_msg msg, long arg) +{ + static Boolean inForeground = true; + WindowPtr win; + EventRecord ev; + int maysleep; + + if (PyMac_ConsoleIsDead) return 0; +#if 0 + if (inForeground) + SpinCursor(msg == SP_AUTO_SPIN ? short(arg) : 1); +#endif + + if (interrupted) return -1; + + if ( msg == SP_AUTO_SPIN || ((msg==SP_SLEEP||msg==SP_SELECT) && arg <= yield_fg)) + maysleep = 0; + else + maysleep = 0; + + PyMac_DoYield(maysleep); + + return 0; +} + +void +PyMac_SetGUSISpin() { + GUSISetHook(GUSI_SpinHook, (GUSIHook)PyMac_GUSISpin); +} + #endif @@ -403,7 +445,7 @@ PyMac_HandleEvent(evp) ** Yield the CPU to other tasks. */ static void -PyMac_DoYield() +PyMac_DoYield(int maysleep) { EventRecord ev; long yield; @@ -415,19 +457,25 @@ PyMac_DoYield() NGetTrapAddress(_Unimplemented, ToolTrap)); } - if ( PyMac_DoYieldEnabled >= 0) { + lastyield = TickCount(); #ifndef THINK_C - /* Under think this has been done before in intrcheck() or intrpeek() */ + /* Under think this has been done before in intrcheck() or intrpeek() */ + if (PyMac_DoYieldEnabled >= 0) scan_event_queue(0); #endif + if (PyMac_DoYieldEnabled == 0) return; - } in_foreground = PyMac_InForeground(); - if ( in_foreground ) - yield = yield_fg; - else - yield = yield_bg; + if ( maysleep ) { + if ( in_foreground ) + yield = yield_fg; + else + yield = yield_bg; + } else { + yield = 0; + } + while ( 1 ) { if ( no_waitnextevent ) { SystemTask(); @@ -440,7 +488,6 @@ PyMac_DoYield() break; PyMac_HandleEvent(&ev); } - lastyield = TickCount(); } /* @@ -455,9 +502,10 @@ PyMac_Yield() { else iv = interval_bg; if ( TickCount() > lastyield + iv ) - PyMac_DoYield(); + PyMac_DoYield(1); } +#ifdef USE_MACTCP /* ** Idle routine for busy-wait loops. ** Gives up CPU, handles events and returns true if an interrupt is pending @@ -466,9 +514,11 @@ PyMac_Yield() { int PyMac_Idle() { - PyMac_DoYield(); + PyMac_DoYield(1); return intrpeek(); } +#endif + /* ** Returns true if the argument has a resource fork, and it contains ** a 'PYC ' resource of the correct name diff --git a/Mac/Python/macmain.c b/Mac/Python/macmain.c index 7241539f157..019e0bec0f9 100644 --- a/Mac/Python/macmain.c +++ b/Mac/Python/macmain.c @@ -28,6 +28,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "pythonresources.h" #include "import.h" #include "marshal.h" +#include "macglue.h" #include #include @@ -108,6 +109,7 @@ init_common() #if defined(USE_GUSI) /* Setup GUSI */ GUSIDefaultSetup(); + PyMac_SetGUSISpin(); #endif #ifdef USE_SIOUX @@ -396,7 +398,14 @@ PyMac_Exit(status) } else SIOUXSettings.autocloseonquit = 1; -#endif +#ifdef USE_GUSI + /* + ** Workaround for Sioux/GUSI combo: we should not call + ** SiouxHandleOneEvent after the window is closed + */ + PyMac_ConsoleIsDead = 1; +#endif /* USE_GUSI */ +#endif /* USE_SIOUX */ #ifdef THINK_C console_options.pause_atexit = keep; #endif