| Index: third_party/twisted_8_1/twisted/internet/gtkreactor.py
|
| diff --git a/third_party/twisted_8_1/twisted/internet/gtkreactor.py b/third_party/twisted_8_1/twisted/internet/gtkreactor.py
|
| deleted file mode 100644
|
| index 6c19fe49389bc8041529e6d1b5b6c8c4057970ef..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/internet/gtkreactor.py
|
| +++ /dev/null
|
| @@ -1,233 +0,0 @@
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -This module provides support for Twisted to interact with the PyGTK mainloop.
|
| -
|
| -In order to use this support, simply do the following::
|
| -
|
| - | from twisted.internet import gtkreactor
|
| - | gtkreactor.install()
|
| -
|
| -Then use twisted.internet APIs as usual. The other methods here are not
|
| -intended to be called directly.
|
| -
|
| -Maintainer: U{Itamar Shtull-Trauring<mailto:twisted@itamarst.org>}
|
| -"""
|
| -
|
| -import sys
|
| -
|
| -# System Imports
|
| -try:
|
| - import pygtk
|
| - pygtk.require('1.2')
|
| -except ImportError, AttributeError:
|
| - pass # maybe we're using pygtk before this hack existed.
|
| -import gtk
|
| -
|
| -from zope.interface import implements
|
| -
|
| -# Twisted Imports
|
| -from twisted.python import log, runtime
|
| -from twisted.internet.interfaces import IReactorFDSet
|
| -
|
| -# Sibling Imports
|
| -from twisted.internet import posixbase, selectreactor
|
| -
|
| -
|
| -class GtkReactor(posixbase.PosixReactorBase):
|
| - """
|
| - GTK+ event loop reactor.
|
| -
|
| - @ivar _reads: A dictionary mapping L{FileDescriptor} instances to gtk INPUT_READ
|
| - watch handles.
|
| -
|
| - @ivar _writes: A dictionary mapping L{FileDescriptor} instances to gtk
|
| - INTPUT_WRITE watch handles.
|
| -
|
| - @ivar _simtag: A gtk timeout handle for the next L{simulate} call.
|
| - """
|
| - implements(IReactorFDSet)
|
| -
|
| - def __init__(self):
|
| - """
|
| - Initialize the file descriptor tracking dictionaries and the base
|
| - class.
|
| - """
|
| - self._simtag = None
|
| - self._reads = {}
|
| - self._writes = {}
|
| - posixbase.PosixReactorBase.__init__(self)
|
| -
|
| -
|
| - def addReader(self, reader):
|
| - if reader not in self._reads:
|
| - self._reads[reader] = gtk.input_add(reader, gtk.GDK.INPUT_READ, self.callback)
|
| -
|
| - def addWriter(self, writer):
|
| - if writer not in self._writes:
|
| - self._writes[writer] = gtk.input_add(writer, gtk.GDK.INPUT_WRITE, self.callback)
|
| -
|
| -
|
| - def getReaders(self):
|
| - return self._reads.keys()
|
| -
|
| -
|
| - def getWriters(self):
|
| - return self._writes.keys()
|
| -
|
| -
|
| - def removeAll(self):
|
| - return self._removeAll(self._reads, self._writes)
|
| -
|
| - def removeReader(self, reader):
|
| - if reader in self._reads:
|
| - gtk.input_remove(self._reads[reader])
|
| - del self._reads[reader]
|
| -
|
| - def removeWriter(self, writer):
|
| - if writer in self._writes:
|
| - gtk.input_remove(self._writes[writer])
|
| - del self._writes[writer]
|
| -
|
| - doIterationTimer = None
|
| -
|
| - def doIterationTimeout(self, *args):
|
| - self.doIterationTimer = None
|
| - return 0 # auto-remove
|
| - def doIteration(self, delay):
|
| - # flush some pending events, return if there was something to do
|
| - # don't use the usual "while gtk.events_pending(): mainiteration()"
|
| - # idiom because lots of IO (in particular test_tcp's
|
| - # ProperlyCloseFilesTestCase) can keep us from ever exiting.
|
| - log.msg(channel='system', event='iteration', reactor=self)
|
| - if gtk.events_pending():
|
| - gtk.mainiteration(0)
|
| - return
|
| - # nothing to do, must delay
|
| - if delay == 0:
|
| - return # shouldn't delay, so just return
|
| - self.doIterationTimer = gtk.timeout_add(int(delay * 1000),
|
| - self.doIterationTimeout)
|
| - # This will either wake up from IO or from a timeout.
|
| - gtk.mainiteration(1) # block
|
| - # note: with the .simulate timer below, delays > 0.1 will always be
|
| - # woken up by the .simulate timer
|
| - if self.doIterationTimer:
|
| - # if woken by IO, need to cancel the timer
|
| - gtk.timeout_remove(self.doIterationTimer)
|
| - self.doIterationTimer = None
|
| -
|
| - def crash(self):
|
| - posixbase.PosixReactorBase.crash(self)
|
| - gtk.mainquit()
|
| -
|
| - def run(self, installSignalHandlers=1):
|
| - self.startRunning(installSignalHandlers=installSignalHandlers)
|
| - gtk.timeout_add(0, self.simulate)
|
| - gtk.mainloop()
|
| -
|
| - def _readAndWrite(self, source, condition):
|
| - # note: gtk-1.2's gtk_input_add presents an API in terms of gdk
|
| - # constants like INPUT_READ and INPUT_WRITE. Internally, it will add
|
| - # POLL_HUP and POLL_ERR to the poll() events, but if they happen it
|
| - # will turn them back into INPUT_READ and INPUT_WRITE. gdkevents.c
|
| - # maps IN/HUP/ERR to INPUT_READ, and OUT/ERR to INPUT_WRITE. This
|
| - # means there is no immediate way to detect a disconnected socket.
|
| -
|
| - # The g_io_add_watch() API is more suited to this task. I don't think
|
| - # pygtk exposes it, though.
|
| - why = None
|
| - didRead = None
|
| - try:
|
| - if condition & gtk.GDK.INPUT_READ:
|
| - why = source.doRead()
|
| - didRead = source.doRead
|
| - if not why and condition & gtk.GDK.INPUT_WRITE:
|
| - # if doRead caused connectionLost, don't call doWrite
|
| - # if doRead is doWrite, don't call it again.
|
| - if not source.disconnected and source.doWrite != didRead:
|
| - why = source.doWrite()
|
| - didRead = source.doWrite # if failed it was in write
|
| - except:
|
| - why = sys.exc_info()[1]
|
| - log.msg('Error In %s' % source)
|
| - log.deferr()
|
| -
|
| - if why:
|
| - self._disconnectSelectable(source, why, didRead == source.doRead)
|
| -
|
| - def callback(self, source, condition):
|
| - log.callWithLogger(source, self._readAndWrite, source, condition)
|
| - self.simulate() # fire Twisted timers
|
| - return 1 # 1=don't auto-remove the source
|
| -
|
| - def simulate(self):
|
| - """Run simulation loops and reschedule callbacks.
|
| - """
|
| - if self._simtag is not None:
|
| - gtk.timeout_remove(self._simtag)
|
| - self.runUntilCurrent()
|
| - timeout = min(self.timeout(), 0.1)
|
| - if timeout is None:
|
| - timeout = 0.1
|
| - # Quoth someone other than me, "grumble", yet I know not why. Try to be
|
| - # more specific in your complaints, guys. -exarkun
|
| - self._simtag = gtk.timeout_add(int(timeout * 1010), self.simulate)
|
| -
|
| -
|
| -
|
| -class PortableGtkReactor(selectreactor.SelectReactor):
|
| - """Reactor that works on Windows.
|
| -
|
| - input_add is not supported on GTK+ for Win32, apparently.
|
| -
|
| - @ivar _simtag: A gtk timeout handle for the next L{simulate} call.
|
| - """
|
| - _simtag = None
|
| -
|
| -
|
| - def crash(self):
|
| - selectreactor.SelectReactor.crash(self)
|
| - gtk.mainquit()
|
| -
|
| - def run(self, installSignalHandlers=1):
|
| - self.startRunning(installSignalHandlers=installSignalHandlers)
|
| - self.simulate()
|
| - gtk.mainloop()
|
| -
|
| - def simulate(self):
|
| - """Run simulation loops and reschedule callbacks.
|
| - """
|
| - if self._simtag is not None:
|
| - gtk.timeout_remove(self._simtag)
|
| - self.iterate()
|
| - timeout = min(self.timeout(), 0.1)
|
| - if timeout is None:
|
| - timeout = 0.1
|
| -
|
| - # See comment for identical line in GtkReactor.simulate.
|
| - self._simtag = gtk.timeout_add((timeout * 1010), self.simulate)
|
| -
|
| -
|
| -
|
| -def install():
|
| - """Configure the twisted mainloop to be run inside the gtk mainloop.
|
| - """
|
| - reactor = GtkReactor()
|
| - from twisted.internet.main import installReactor
|
| - installReactor(reactor)
|
| - return reactor
|
| -
|
| -def portableInstall():
|
| - """Configure the twisted mainloop to be run inside the gtk mainloop.
|
| - """
|
| - reactor = PortableGtkReactor()
|
| - from twisted.internet.main import installReactor
|
| - installReactor(reactor)
|
| - return reactor
|
| -
|
| -if runtime.platform.getType() != 'posix':
|
| - install = portableInstall
|
| -
|
| -__all__ = ['install']
|
|
|