From 15db25bc9dfc6e65655412851a52dbf9e4fd9105 Mon Sep 17 00:00:00 2001 From: Rand Dvorak Date: Fri, 18 Feb 2022 19:32:17 -0500 Subject: [PATCH] fixed issue where NSApp terminate called after endLoop --- pyttsx3/drivers/nsss.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/pyttsx3/drivers/nsss.py b/pyttsx3/drivers/nsss.py index 6cf5f81..98e8ae2 100644 --- a/pyttsx3/drivers/nsss.py +++ b/pyttsx3/drivers/nsss.py @@ -2,8 +2,23 @@ from Foundation import * from AppKit import NSSpeechSynthesizer from PyObjCTools import AppHelper +from PyObjCTools.AppHelper import PyObjCAppHelperRunLoopStopper + from ..voice import Voice +class RunLoopStopper(PyObjCAppHelperRunLoopStopper): + + def init(self): + self = super(RunLoopStopper, self).init() + self.shouldStop = False + return self + + def stop(self): + self.shouldStop = True + # this should go away when/if runEventLoop uses + # runLoop iteration + # if NSApp() is not None: + # NSApp().terminate_(self) def buildDriver(proxy): return NSSpeechDriver.alloc().initWithProxy(proxy) @@ -32,7 +47,20 @@ def onPumpFirst_(self, timer): def startLoop(self): NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_( 0.0, self, 'onPumpFirst:', None, False) - AppHelper.runConsoleEventLoop() + runLoop = NSRunLoop.currentRunLoop() + stopper = RunLoopStopper.alloc().init() + PyObjCAppHelperRunLoopStopper.addRunLoopStopper_toRunLoop_(stopper, runLoop) + try: + + while stopper.shouldRun(): + nextfire = runLoop.limitDateForMode_(NSDefaultRunLoopMode) + if not stopper.shouldRun(): + break + if not runLoop.runMode_beforeDate_(NSDefaultRunLoopMode, nextfire): + stopper.stop() + + finally: + PyObjCAppHelperRunLoopStopper.removeRunLoopStopperFromRunLoop_(runLoop) def endLoop(self): AppHelper.stopEventLoop()