Index: third_party/twisted_8_1/twisted/internet/wxreactor.py |
diff --git a/third_party/twisted_8_1/twisted/internet/wxreactor.py b/third_party/twisted_8_1/twisted/internet/wxreactor.py |
deleted file mode 100644 |
index b0708bdebfc7228d5435fe88ecf9eb103767ac4f..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/internet/wxreactor.py |
+++ /dev/null |
@@ -1,181 +0,0 @@ |
-# Copyright (c) 2001-2006 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-""" |
-This module provides wxPython event loop support for Twisted. |
- |
-In order to use this support, simply do the following:: |
- |
- | from twisted.internet import wxreactor |
- | wxreactor.install() |
- |
-Then, when your root wxApp has been created:: |
- |
- | from twisted.internet import reactor |
- | reactor.registerWxApp(yourApp) |
- | reactor.run() |
- |
-Then use twisted.internet APIs as usual. Stop the event loop using |
-reactor.stop(), not yourApp.ExitMainLoop(). |
- |
-IMPORTANT: tests will fail when run under this reactor. This is |
-expected and probably does not reflect on the reactor's ability to run |
-real applications. |
- |
-Maintainer: U{Itamar Shtull-Trauring<mailto:twisted@itamarst.org>} |
-""" |
- |
-import Queue |
-try: |
- from wx import PySimpleApp as wxPySimpleApp, CallAfter as wxCallAfter, \ |
- Timer as wxTimer |
-except ImportError: |
- # older version of wxPython: |
- from wxPython.wx import wxPySimpleApp, wxCallAfter, wxTimer |
- |
-from twisted.python import log, runtime |
-from twisted.internet import _threadedselect |
- |
- |
-class ProcessEventsTimer(wxTimer): |
- """ |
- Timer that tells wx to process pending events. |
- |
- This is necessary on OS X, probably due to a bug in wx, if we want |
- wxCallAfters to be handled when modal dialogs, menus, etc. are open. |
- """ |
- def __init__(self, wxapp): |
- wxTimer.__init__(self) |
- self.wxapp = wxapp |
- |
- |
- def Notify(self): |
- """ |
- Called repeatedly by wx event loop. |
- """ |
- self.wxapp.ProcessPendingEvents() |
- |
- |
- |
-class WxReactor(_threadedselect.ThreadedSelectReactor): |
- """ |
- wxPython reactor. |
- |
- wxPython drives the event loop, select() runs in a thread. |
- """ |
- |
- _stopping = False |
- |
- def registerWxApp(self, wxapp): |
- """ |
- Register wxApp instance with the reactor. |
- """ |
- self.wxapp = wxapp |
- |
- def _installSignalHandlersAgain(self): |
- """ |
- wx sometimes removes our own signal handlers, so re-add them. |
- """ |
- try: |
- # make _handleSignals happy: |
- import signal |
- signal.signal(signal.SIGINT, signal.default_int_handler) |
- except ImportError: |
- return |
- self._handleSignals() |
- |
- def stop(self): |
- """ |
- Stop the reactor. |
- """ |
- if self._stopping: |
- return |
- self._stopping = True |
- _threadedselect.ThreadedSelectReactor.stop(self) |
- |
- def _runInMainThread(self, f): |
- """ |
- Schedule function to run in main wx/Twisted thread. |
- |
- Called by the select() thread. |
- """ |
- if hasattr(self, "wxapp"): |
- wxCallAfter(f) |
- else: |
- # wx shutdown but twisted hasn't |
- self._postQueue.put(f) |
- |
- def _stopWx(self): |
- """ |
- Stop the wx event loop if it hasn't already been stopped. |
- |
- Called during Twisted event loop shutdown. |
- """ |
- if hasattr(self, "wxapp"): |
- self.wxapp.ExitMainLoop() |
- |
- def run(self, installSignalHandlers=True): |
- """ |
- Start the reactor. |
- """ |
- self._postQueue = Queue.Queue() |
- if not hasattr(self, "wxapp"): |
- log.msg("registerWxApp() was not called on reactor, " |
- "registering my own wxApp instance.") |
- self.registerWxApp(wxPySimpleApp()) |
- |
- # start select() thread: |
- self.interleave(self._runInMainThread, |
- installSignalHandlers=installSignalHandlers) |
- if installSignalHandlers: |
- self.callLater(0, self._installSignalHandlersAgain) |
- |
- # add cleanup events: |
- self.addSystemEventTrigger("after", "shutdown", self._stopWx) |
- self.addSystemEventTrigger("after", "shutdown", |
- lambda: self._postQueue.put(None)) |
- |
- # On Mac OS X, work around wx bug by starting timer to ensure |
- # wxCallAfter calls are always processed. We don't wake up as |
- # often as we could since that uses too much CPU. |
- if runtime.platform.isMacOSX(): |
- t = ProcessEventsTimer(self.wxapp) |
- t.Start(2) # wake up every 2ms |
- |
- self.wxapp.MainLoop() |
- wxapp = self.wxapp |
- del self.wxapp |
- |
- if not self._stopping: |
- # wx event loop exited without reactor.stop() being |
- # called. At this point events from select() thread will |
- # be added to _postQueue, but some may still be waiting |
- # unprocessed in wx, thus the ProcessPendingEvents() |
- # below. |
- self.stop() |
- wxapp.ProcessPendingEvents() # deal with any queued wxCallAfters |
- while 1: |
- try: |
- f = self._postQueue.get(timeout=0.01) |
- except Queue.Empty: |
- continue |
- else: |
- if f is None: |
- break |
- try: |
- f() |
- except: |
- log.err() |
- |
- |
-def install(): |
- """ |
- Configure the twisted mainloop to be run inside the wxPython mainloop. |
- """ |
- reactor = WxReactor() |
- from twisted.internet.main import installReactor |
- installReactor(reactor) |
- return reactor |
- |
- |
-__all__ = ['install'] |