ó
[³XMc           @   s³  d  Z  d d l Z d d l Z d d l m Z y0 e e d ƒ r] d d l Z e j d ƒ n  Wn e e	 f k
 rw n Xd d l
 Z
 e e
 d ƒ r  e
 j ƒ  n  d d l m Z m Z m Z d d l m Z d d	 l m Z d d
 l m Z m Z m Z m Z m Z e
 j e
 j Be
 j BZ e
 j e BZ e
 j  e BZ! d „  Z" d e j# f d „  ƒ  YZ$ d e j% f d „  ƒ  YZ& e' d „ Z( e' d „ Z) e j* j+ ƒ  d k r¦e) Z( n  d g Z, d S(   sÚ  
This module provides support for Twisted to interact with the glib/gtk2
mainloop.

In order to use this support, simply do the following::

    |  from twisted.internet import gtk2reactor
    |  gtk2reactor.install()

Then use twisted.internet APIs as usual.  The other methods here are not
intended to be called directly.

When installing the reactor, you can choose whether to use the glib
event loop or the GTK+ event loop which is based on it but adds GUI
integration.
iÿÿÿÿN(   t
   implementst   frozens   2.0t   threads_init(   t   logt   runtimet   failure(   t   set(   t   IReactorFDSet(   t   maint   baset	   posixbaset   errort   selectreactorc          C   s)   d d  l  }  |  j ƒ  r% |  j ƒ  n  d  S(   Niÿÿÿÿ(   t   gtkt
   main_levelt	   main_quit(   R   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   _our_mainquit:   s    t   Gtk2Reactorc           B   s  e  Z d  Z e e ƒ e d „ Z e j d k r= d „  Z	 n  d „  Z
 d „  Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d Z d „  Z d „  Z d „  Z d d „ Z i e j e j ƒ  ƒ e j 6e j e j ƒ  ƒ e j 6d „ Z d „  Z  d „  Z! RS(   s“  
    GTK+-2 event loop reactor.

    @ivar _sources: A dictionary mapping L{FileDescriptor} instances to gtk
        watch handles.

    @ivar _reads: A set of L{FileDescriptor} instances currently monitored for
        reading.

    @ivar _writes: A set of L{FileDescriptor} instances currently monitored for
        writing.

    @ivar _simtag: A gtk timeout handle for the next L{simulate} call.
    c         C   só   d  |  _ t ƒ  |  _ t ƒ  |  _ i  |  _ t j j |  ƒ t	 t
 d d ƒ d k r¶ | r¶ t
 j ƒ  |  _ |  j j |  _ |  j j |  _ t
 j ƒ  |  _ |  j j |  _ |  j j |  _ n9 d d  l } | j |  _ | j |  _ t |  _ | j |  _ d  S(   Nt   pygtk_versioni   i   i[   iÿÿÿÿ(    (   i   i   i[   (   t   Nonet   _simtagR   t   _readst   _writest   _sourcesR
   t   PosixReactorBaset   __init__t   getattrt   gobjectt   main_context_defaultt   contextt   pendingt   _Gtk2Reactor__pendingt	   iterationt   _Gtk2Reactor__iterationt   MainLoopt   loopt   quitt   _Gtk2Reactor__crasht   runt   _Gtk2Reactor__runR   t   events_pendingt   main_iterationR   R   (   t   selft   useGtkR   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyR   W   s"    			t   posixc            sx   d d l  m ‰ t j j ˆ  ƒ t j t j ‡  ‡ f d †  ƒ t t d d  ƒ d  k	 rm t j	 t j t
 ƒ n  ˆ ƒ  d  S(   Niÿÿÿÿ(   t   reapAllProcessesc             s   ˆ  j  ˆ ƒ S(   N(   t   callFromThread(   t   a(   R*   t   _reapAllProcesses(    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   <lambda>y   s    t   siginterrupt(   t   twisted.internet.processR-   R	   t   _SignalReactorMixint   _handleSignalst   signalt   SIGCHLDR   R   R2   t   False(   R*   (    (   R*   R0   s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyR5   o   s    c         C   sN   t  | d ƒ r7 | | d „ } t j | j ƒ  | | ƒ St j | | | ƒ Sd  S(   Nt   filenoc         S   s   | | | ƒ S(   N(    (   t   sourcet	   conditiont   real_st   real_cb(    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   wrapperŒ   s    (   t   hasattrR   t   io_add_watchR9   (   R*   R:   R;   t   callbackR>   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt	   input_add‰   s    c         C   ss   | | k r d S| } | | k rC t  j |  j | ƒ | | O} n  |  j | | |  j ƒ |  j | <| j | ƒ d S(   s  
        Add the given L{FileDescriptor} for monitoring either for reading or
        writing. If the file is already monitored for the other operation, we
        delete the previous registration and re-register it for both reading
        and writing.
        N(   R   t   source_removeR   RB   RA   t   add(   R*   R:   t   primaryt   othert   primaryFlagt	   otherFlagt   flags(    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   _add“   s    c         C   s#   |  j  | |  j |  j t t ƒ d S(   sS   
        Add a L{FileDescriptor} for monitoring of data available to read.
        N(   RJ   R   R   t   INFLAGSt   OUTFLAGS(   R*   t   reader(    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt	   addReader¤   s    c         C   s#   |  j  | |  j |  j t t ƒ d S(   sO   
        Add a L{FileDescriptor} for monitoring ability to write data.
        N(   RJ   R   R   RL   RK   (   R*   t   writer(    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt	   addWriter«   s    c         C   s   t  |  j ƒ S(   sW   
        Retrieve the list of current L{FileDescriptor} monitored for reading.
        (   t   listR   (   R*   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt
   getReaders²   s    c         C   s   t  |  j ƒ S(   sW   
        Retrieve the list of current L{FileDescriptor} monitored for writing.
        (   RQ   R   (   R*   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt
   getWriters¹   s    c         C   s   |  j  |  j |  j ƒ S(   sJ   
        Remove monitoring for all registered L{FileDescriptor}s.
        (   t
   _removeAllR   R   (   R*   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt	   removeAllÀ   s    c         C   ss   | | k r d St  j |  j | ƒ | j | ƒ | | k r_ |  j | | |  j ƒ |  j | <n |  j j | ƒ d S(   sÝ   
        Remove monitoring the given L{FileDescriptor} for either reading or
        writing. If it's still monitored for the other operation, we
        re-register the L{FileDescriptor} for only that operation.
        N(   R   RC   R   t   removeRB   RA   t   pop(   R*   R:   RE   RF   RI   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   _removeÇ   s    c         C   s    |  j  | |  j |  j t ƒ d S(   sJ   
        Stop monitoring the given L{FileDescriptor} for reading.
        N(   RX   R   R   RL   (   R*   RM   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   removeReaderØ   s    c         C   s    |  j  | |  j |  j t ƒ d S(   sJ   
        Stop monitoring the given L{FileDescriptor} for writing.
        N(   RX   R   R   RK   (   R*   RO   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   removeWriterß   s    c         G   s   d  |  _ d S(   Ni    (   R   t   doIterationTimer(   R*   t   args(    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   doIterationTimeoutè   s    	c         C   s¡   t  j d d d d d |  ƒ |  j ƒ  r9 |  j d ƒ d  S| d k rI d  St j t | d ƒ |  j ƒ |  _ |  j d ƒ |  j r t j	 |  j ƒ d  |  _ n  d  S(	   Nt   channelt   systemt   eventR    t   reactori    iè  i   (   R   t   msgR   R!   R   t   timeout_addt   intR]   R[   RC   R   (   R*   t   delay(    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   doIterationí   s    	c         C   s   t  j j |  ƒ |  j ƒ  d  S(   N(   R
   R   t   crashR%   (   R*   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyRg     s    i   c         C   s=   |  j  d | ƒ t j d |  j ƒ |  j r9 |  j ƒ  n  d  S(   Nt   installSignalHandlersi    (   t   startRunningR   Rc   t   simulatet   _startedR'   (   R*   Rh   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyR&   
  s    	c         C   sû   d  } t } | t @rQ | t j @rQ | |  j k rE t j } t } qÛ t j	 } nŠ yU | t j @rv | j
 ƒ  } t } n  | r¥ | t j @r¥ | j s¥ | j ƒ  } q¥ n  Wn2 t j ƒ  d } t j d | ƒ t j ƒ  n X| r÷ |  j | | | ƒ n  d  S(   Ni   s   Error In %s(   R   R8   t   POLL_DISCONNECTEDR   t   IO_INR   R   t   CONNECTION_DONEt   Truet   CONNECTION_LOSTt   doReadt   IO_OUTt   disconnectedt   doWritet   syst   exc_infoR   Rb   t   deferrt   _disconnectSelectable(   R*   R:   R;   t   faildictt   whyt   inRead(    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   _doReadOrWrite  s(    				c         C   s'   t  j | |  j | | ƒ |  j ƒ  d S(   Ni   (   R   t   callWithLoggerR|   Rj   (   R*   R:   R;   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyRA   0  s    
c         C   s|   |  j  d k	 r" t j |  j  ƒ n  |  j ƒ  t |  j ƒ  d ƒ } | d k rV d } n  t j t | d ƒ |  j	 ƒ |  _  d S(   s@   
        Run simulation loops and reschedule callbacks.
        gš™™™™™¹?iò  N(
   R   R   R   RC   t   runUntilCurrentt   mint   timeoutRc   Rd   Rj   (   R*   R€   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyRj   6  s    
	N("   t   __name__t
   __module__t   __doc__R    R   Ro   R   R   t   platformTypeR5   RB   RJ   RN   RP   RR   RS   RU   RX   RY   RZ   R   R[   R]   Rf   Rg   R&   R   t   FailureR   t   ConnectionDonet   ConnectionLostR|   RA   Rj   (    (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyR   F   s2   
	
												"	t   PortableGtkReactorc           B   s2   e  Z d  Z d Z d „  Z d d „ Z d „  Z RS(   sd   
    Reactor that works on Windows.

    Sockets aren't supported by GTK+'s input_add on Win32.
    c         C   sU   t  j j |  ƒ d d  l } | j ƒ  rQ t | d ƒ rD | j ƒ  qQ | j ƒ  n  d  S(   NiÿÿÿÿR   (   R   t   SelectReactorRg   R   R   R?   R   t   mainquit(   R*   R   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyRg   M  s    i   c         C   sY   d d  l  } |  j d | ƒ t j d |  j ƒ t | d ƒ rK | j ƒ  n
 | j ƒ  d  S(   NiÿÿÿÿRh   i    R   (   R   Ri   R   Rc   Rj   R?   R   t   mainloop(   R*   Rh   R   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyR&   X  s    c         C   s|   |  j  d k	 r" t j |  j  ƒ n  |  j ƒ  t |  j ƒ  d ƒ } | d k rV d } n  t j t | d ƒ |  j	 ƒ |  _  d S(   s@   
        Run simulation loops and reschedule callbacks.
        gš™™™™™¹?iò  N(
   R   R   R   RC   t   iterateR   R€   Rc   Rd   Rj   (   R*   R€   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyRj   c  s    
	N(   R   R‚   Rƒ   R   R   Rg   R&   Rj   (    (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyRˆ   E  s
   	c         C   s*   t  |  ƒ } d d l m } | | ƒ | S(   sÐ   
    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).
    iÿÿÿÿ(   t   installReactor(   R   t   twisted.internet.mainR   (   R+   Ra   R   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   installr  s    
c         C   s'   t  ƒ  } d d l m } | | ƒ | S(   sK   
    Configure the twisted mainloop to be run inside the gtk mainloop.
    iÿÿÿÿ(   R   (   Rˆ   RŽ   R   (   R+   Ra   R   (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   portableInstall€  s    	
R,   R   (-   Rƒ   Ru   R6   t   zope.interfaceR    R?   t   pygtkt   requiret   ImportErrort   AttributeErrorR   R   t   twisted.pythonR   R   R   t   twisted.python.compatR   t   twisted.internet.interfacesR   t   twisted.internetR   R	   R
   R   R   t   IO_HUPt   IO_ERRt   IO_NVALRl   Rm   RK   Rr   RL   R   R   R   R‰   Rˆ   Ro   R   R   t   platformt   getTypet   __all__(    (    (    s@   /usr/lib/python2.7/dist-packages/twisted/internet/gtk2reactor.pyt   <module>   s4   (	ÿ-	