summaryrefslogtreecommitdiffstats
path: root/Mac/Python/macglue.c
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Python/macglue.c')
-rw-r--r--Mac/Python/macglue.c72
1 files changed, 61 insertions, 11 deletions
diff --git a/Mac/Python/macglue.c b/Mac/Python/macglue.c
index 112604e..18243ec 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 <TFileSpec.h> /* For Path2FSSpec */
#include <LowMem.h> /* For SetSFCurDir, etc */
+#include <GUSI.h>
#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
@@ -135,6 +138,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
*/
struct hook_args {
@@ -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