summaryrefslogtreecommitdiffstats
path: root/Mac
diff options
context:
space:
mode:
Diffstat (limited to 'Mac')
-rw-r--r--Mac/Tools/IDE/PyConsole.py26
1 files changed, 25 insertions, 1 deletions
diff --git a/Mac/Tools/IDE/PyConsole.py b/Mac/Tools/IDE/PyConsole.py
index 8d44469..e60b138 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')