add explicit support for cancelling a running script (CFM-based MacPython had this built-in)
diff --git a/Mac/Tools/IDE/PyEdit.py b/Mac/Tools/IDE/PyEdit.py
index 64463c6..502f7c4 100644
--- a/Mac/Tools/IDE/PyEdit.py
+++ b/Mac/Tools/IDE/PyEdit.py
@@ -619,16 +619,39 @@
 			savedir = os.getcwd()
 			os.chdir(dir)
 			sys.path.insert(0, dir)
-		else:
-			cwdindex = None
+		self._scriptDone = False
+		if sys.platform == "darwin":
+			# On MacOSX, MacPython doesn't poll for command-period
+			# (cancel), so to enable the user to cancel a running
+			# script, we have to spawn a thread which does the
+			# polling. It will send a SIGINT to the main thread
+			# (in which the script is running) when the user types
+			# command-period.
+			from threading import Thread
+			t = Thread(target=self._userCancelledMonitor,
+					name="UserCancelledMonitor")
+			t.start()
 		try:
 			execstring(pytext, globals, locals, file, self.debugging, 
 					modname, self.profiling)
 		finally:
+			self._scriptDone = True
 			if self.path:
 				os.chdir(savedir)
 				del sys.path[0]
 	
+	def _userCancelledMonitor(self):
+		import time
+		from signal import SIGINT
+		while not self._scriptDone:
+			if Evt.CheckEventQueueForUserCancel():
+				# Send a SIGINT signal to ourselves.
+				# This gets delivered to the main thread,
+				# cancelling the running script.
+				os.kill(os.getpid(), SIGINT)
+				break
+			time.sleep(0.25)
+	
 	def getenvironment(self):
 		if self.path:
 			file = self.path