diff --git a/Mac/Tools/IDE/PyConsole.py b/Mac/Tools/IDE/PyConsole.py index 8d4446910ba..e60b138c32b 100644 --- a/Mac/Tools/IDE/PyConsole.py +++ b/Mac/Tools/IDE/PyConsole.py @@ -78,12 +78,36 @@ class ConsoleTextWidget(W.EditText): text = string.join(string.split(text, "\r"), "\n") if hasattr(MacOS, 'EnableAppswitch'): saveyield = MacOS.EnableAppswitch(0) - self.pyinteractive.executeline(text, self, self._namespace) + self._scriptDone = False + if sys.platform == "darwin": + # see identical construct in PyEdit.py + from threading import Thread + t = Thread(target=self._userCancelledMonitor, + name="UserCancelledMonitor") + t.start() + try: + self.pyinteractive.executeline(text, self, self._namespace) + finally: + self._scriptDone = True if hasattr(MacOS, 'EnableAppswitch'): MacOS.EnableAppswitch(saveyield) selstart, selend = self.getselection() self._inputstart = selstart + def _userCancelledMonitor(self): + # XXX duplicate code from PyEdit.py + import time, os + from signal import SIGINT + from Carbon import Evt + 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 domenu_save_as(self, *args): filename = EasyDialogs.AskFileForSave(message='Save console text as:', savedFileName='console.txt')