|
2 | 2 | from AppKit import NSSpeechSynthesizer
|
3 | 3 | from Foundation import *
|
4 | 4 | from PyObjCTools import AppHelper
|
| 5 | +# noinspection PyProtectedMember |
| 6 | +from PyObjCTools.AppHelper import PyObjCAppHelperRunLoopStopper |
5 | 7 |
|
6 | 8 | from ..voice import Voice
|
7 | 9 |
|
8 | 10 |
|
| 11 | +# noinspection PyUnresolvedReferences |
| 12 | +class RunLoopStopper(PyObjCAppHelperRunLoopStopper): |
| 13 | + """ |
| 14 | + Overrides PyObjCAppHelperRunLoopStopper to terminate after endLoop. |
| 15 | + """ |
| 16 | + |
| 17 | + def __init__(self): |
| 18 | + self.shouldStop = False |
| 19 | + |
| 20 | + def init(self): |
| 21 | + return objc.super(RunLoopStopper, self).init() |
| 22 | + |
| 23 | + def stop(self): |
| 24 | + self.shouldStop = True |
| 25 | + |
| 26 | + |
9 | 27 | # noinspection PyPep8Naming
|
10 | 28 | def buildDriver(proxy):
|
11 | 29 | return NSSpeechDriver.alloc().initWithProxy(proxy)
|
@@ -42,9 +60,22 @@ def onPumpFirst_(self, timer):
|
42 | 60 | self._proxy.setBusy(False)
|
43 | 61 |
|
44 | 62 | def startLoop(self):
|
| 63 | + # https://github.com/ronaldoussoren/pyobjc/blob/mater/pyobjc-framework-Cocoa/Lib/PyObjCTools/AppHelper.py#L243C25-L243C25 # noqa |
45 | 64 | NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(
|
46 |
| - 0.0, self, 'onPumpFirst:', None, False) |
47 |
| - AppHelper.runConsoleEventLoop() |
| 65 | + 0.0, self, 'onPumpFirst:', None, False |
| 66 | + ) |
| 67 | + runLoop = NSRunLoop.currentRunLoop() |
| 68 | + stopper = RunLoopStopper.alloc().init() |
| 69 | + PyObjCAppHelperRunLoopStopper.addRunLoopStopper_toRunLoop_(stopper, runLoop) |
| 70 | + while stopper.shouldRun(): |
| 71 | + nextfire = runLoop.limitDateForMode_(NSDefaultRunLoopMode) |
| 72 | + soon = NSDate.dateWithTimeIntervalSinceNow_(0) # maxTimeout in runConsoleEventLoop |
| 73 | + if nextfire is not None: |
| 74 | + nextfire = soon.earlierDate_(nextfire) |
| 75 | + if not runLoop.runMode_beforeDate_(NSDefaultRunLoopMode, nextfire): |
| 76 | + stopper.stop() |
| 77 | + break |
| 78 | + PyObjCAppHelperRunLoopStopper.removeRunLoopStopperFromRunLoop_(runLoop) |
48 | 79 |
|
49 | 80 | @staticmethod
|
50 | 81 | def endLoop():
|
|
0 commit comments