Index: twisted/internet/gtk2reactor.py===================================================================--- twisted/internet/gtk2reactor.py (revision 14339)+++ twisted/internet/gtk2reactor.py (working copy)@@ -30,8 +30,9 @@ try: if not hasattr(sys, 'frozen'): # Don't want to check this for py2exe- import pygtk- pygtk.require('2.0')+ import pygtk+ if not sys.modules.has_key('gtk'):+ pygtk.require('2.0') except (ImportError, AttributeError): pass # maybe we're using pygtk before this hack existed. import gobject@@ -79,7 +80,7 @@ implements(IReactorFDSet)- def __init__(self, useGtk=True):+ def __init__(self, useGtk=True, useExistingGtk=False): self.context = gobject.main_context_default() self.loop = gobject.MainLoop() posixbase.PosixReactorBase.__init__(self)@@ -96,7 +97,10 @@ self.__pending = gtk.events_pending self.__iteration = gtk.main_iteration self.__crash = _our_mainquit- self.__run = gtk.main+ if useExistingGtk:+ self.__run = lambda: None+ else:+ self.__run = gtk.main # The input_add function in pygtk1 checks for objects with a # 'fileno' method and, if present, uses the result of that method@@ -253,13 +257,15 @@ _simtag = gobject.timeout_add(int(timeout * 1010), self.simulate)-def install(useGtk=True):+def install(useGtk=True, useExistingGtk=False): """Configure the twisted mainloop to be run inside the gtk mainloop. @param useGtk: should glib rather than GTK+ event loop be used (this will be slightly faster but does not support GUI).+ @param useExistingGtk: When used in combination with useGtk,+ do not launch gtk.main, but use the existing gtk mainloop. """- reactor = Gtk2Reactor(useGtk)+ reactor = Gtk2Reactor(useGtk, useExistingGtk) from twisted.internet.main import installReactor installReactor(reactor) return reactor