ó
±xYc           @  s6  d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l	 m
 Z
 m Z d  d l m Z d d l m Z m Z d d l m Z d d	 l m Z d d
 l m Z d d l m Z d d l m Z m Z m Z d f Z e j Z d e f d „  ƒ  YZ d e  f d „  ƒ  YZ! d S(   iÿÿÿÿ(   t   unicode_literalsN(   t   InputStream(   t   DummyContextt   in_main_thread(   t   Inputi   (   t	   EventLoopt   INPUT_TIMEOUT(   t   EventLoopCallbacks(   t   InputHookContext(   t   PosixStdinReader(   t   TimeIt(   t   AutoSelectort   Selectort	   fd_to_intu   PosixEventLoopt   PosixEventLoopc           B  st   e  Z d  Z d e d „ Z d „  Z d d „ Z d „  Z d „  Z	 d d „ Z
 d „  Z d „  Z d	 „  Z d
 „  Z RS(   u9   
    Event loop for posix systems (Linux, Mac os X).
    c         C  sÃ   | d  k s t | ƒ s t ‚ t | t ƒ s3 t ‚ t |  _ t |  _ t |  _ d  |  _	 g  |  _
 i  |  _ | ƒ  |  _ t j ƒ  |  _ t j |  j d t j t j ƒ | r¶ t | ƒ n d  |  _ d  S(   Ni    (   t   Nonet   callablet   AssertionErrort
   issubclassR   t   Falset   runningt   closedt   _runningt
   _callbackst   _calls_from_executort	   _read_fdst   selectort   ost   pipet   _schedule_pipet   fcntlt   F_SETFLt
   O_NONBLOCKR   t   _inputhook_context(   t   selft	   inputhookR   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt   __init__   s    						 c      
     sO  t  | t ƒ s t ‚ t  | t ƒ s* t ‚ ˆ j s: t ‚ ˆ j rR t d ƒ ‚ n  t ˆ _ | ˆ _ t	 | j
 ƒ ‰ t g ‰  t | j ƒ  ƒ ‰ t ƒ  r© t ˆ j ƒ } n	 t ƒ  } ‡  ‡ ‡ ‡ f d †  } ˆ j | | ƒ ˆ j ˆ j d d ƒ | (x ˆ j rˆ j rMt ƒ  ) } ‡  ‡ f d †  } ˆ j j | ƒ Wd QX| j } n d } ˆ  d d k rld } n t d ˆ  d | ƒ } ˆ j | ƒ }	 |	 rùg  }
 g  } d } xà |	 D]Ø } | ˆ j d k raxq ˆ j D]f \ } } | d k rü|
 j | ƒ qÔ| pt ƒ  } | | k  r'|
 j | ƒ qÔ| j | | f ƒ qÔWg  ˆ _ t j ˆ j d d ƒ q±ˆ j  j! | ƒ } | r±|
 j | ƒ q±q±W|
 rØx |
 D] } | ƒ  qšWxH | D] \ } } ˆ j" | d | ƒq²Wqx< | D] \ } } | ƒ  qßWqû ˆ j# ƒ  | j$ ƒ  d ˆ  d <qû WWd QXˆ j% | ƒ ˆ j% ˆ j d ƒ d ˆ _ d S(   u)   
        The input 'event loop'.
        u   Event loop already closed.c            s=   ˆ j  ƒ  }  ˆ j |  ƒ t ˆ  d <ˆ j r9 ˆ j ƒ  n  d S(   u    Read user input. i    N(   t   readt   feedR   R   t   stop(   t   data(   t   current_timeoutt   inputstreamR"   t   stdin_reader(    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt   read_from_stdinN   s
    
	i    c           s#   ˆ j  |  r ˆ  d n d ƒ g  k S(   uF    True when there is input ready. The inputhook should return control. i    (   t   _ready_for_reading(   t   wait(   R)   R"   (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt   readyc   s    Ni   t   _max_postpone_until(&   t
   isinstanceR   R   R   R   R   t	   Exceptiont   TrueR   R   t   feed_keyR   R	   t   filenoR   t   call_on_sigwincht   received_winchR   t
   add_readerR   R   R!   R
   t   call_inputhookt   durationt   maxR-   R   t   appendt   _nowR   R%   R   t   gett   call_from_executort   flusht   input_timeoutt   remove_reader(   R"   t   stdint	   callbackst   ctxR,   t   inputhook_timerR/   t   inputhook_durationt   remaining_timeoutt   fdst   taskst   low_priority_taskst   nowt   fdt   ct   max_postpone_untilt   handlert   tt   _(    (   R)   R*   R"   R+   s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt   run1   sv    								
	

c         C  s   |  j  j | ƒ } | S(   uI   
        Return the file descriptors that are ready for reading.
        (   R   t   select(   R"   t   timeoutRI   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyR-   ¸   s    c           s    ‡  f d †  } ˆ  j  | ƒ d S(   uG   
        Notify the event loop that SIGWINCH has been received
        c             s   ˆ  j  r ˆ  j  j ƒ  n  d  S(   N(   R   t   terminal_size_changed(    (   R"   (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt   process_winchË   s    	N(   R?   (   R"   RW   (    (   R"   s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyR7   ¿   s    c           s    ‡  f d †  } |  j  | ƒ d S(   u½   
        Run a long running function in a background thread.
        (This is recommended for code that could block the event loop.)
        Similar to Twisted's ``deferToThread``.
        c             s   t  j d ˆ  ƒ j ƒ  d  S(   Nt   target(   t	   threadingt   Threadt   start(    (   t   callback(    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt   start_executorà   s    N(   R?   (   R"   R\   R]   (    (   R\   s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt   run_in_executorÑ   s    c         C  s   | d k s! t | t ƒ s! t ‚ |  j j | | f ƒ |  j r{ y t j |  j d d ƒ Wq{ t	 t
 t f k
 rw q{ Xn  d S(   uˆ  
        Call this function in the main event loop.
        Similar to Twisted's ``callFromThread``.

        :param _max_postpone_until: `None` or `time.time` value. For interal
            use. If the eventloop is saturated, consider this task to be low
            priority and postpone maximum until this timestamp. (For instance,
            repaint is done using low priority.)
        i   t   xN(   R   R1   t   floatR   R   R<   R   R   t   writet   AttributeErrort
   IndexErrort   OSError(   R"   R\   R0   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyR?   ä   s    
!	c         C  s   t  |  _ d S(   u&   
        Stop the event loop.
        N(   R   R   (   R"   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyR'   û   s    c         C  sc   t  |  _ |  j } d  |  _ | rF t j | d ƒ t j | d ƒ n  |  j r_ |  j j ƒ  n  d  S(   Ni    i   (   R3   R   R   R   R   t   closeR!   (   R"   t   schedule_pipe(    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyRe     s    				c         C  s-   t  | ƒ } | |  j | <|  j j | ƒ d S(   u-    Add read file descriptor to the event loop. N(   R   R   R   t   register(   R"   RM   R\   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyR8     s    c         C  s<   t  | ƒ } | |  j k r( |  j | =n  |  j j | ƒ d S(   u2    Remove read file descriptor from the event loop. N(   R   R   R   t
   unregister(   R"   RM   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyRB     s    N(   t   __name__t
   __module__t   __doc__R   R   R$   RS   R-   R7   R^   R?   R'   Re   R8   RB   (    (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyR      s   	‡					R6   c           B  s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   uv   
    Context manager which Installs a SIGWINCH callback.
    (This signal occurs when the terminal size changes.)
    c         C  s   | |  _  d  |  _ d  S(   N(   R\   R   t   previous_callback(   R"   R\   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyR$   $  s    	c           s%   t  j  t  j ‡  f d †  ƒ ˆ  _ d  S(   Nc            s
   ˆ  j  ƒ  S(   N(   R\   (   t   a(   R"   (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt   <lambda>)  s    (   t   signalt   SIGWINCHRl   (   R"   (    (   R"   s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt	   __enter__(  s    c         O  s?   |  j  d  k r% t j t j d ƒ n t j t j |  j  ƒ d  S(   Ni    (   Rl   R   Ro   Rp   (   R"   Rm   t   kw(    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt   __exit__+  s    (   Ri   Rj   Rk   R$   Rq   Rs   (    (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyR6     s   		("   t
   __future__R    R   R   Ro   RY   t   timet#   prompt_toolkit.terminal.vt100_inputR   t   prompt_toolkit.utilsR   R   t   prompt_toolkit.inputR   t   baseR   R   RD   R   R#   R   t   posix_utilsR	   t   utilsR
   RT   R   R   R   t   __all__R=   R   t   objectR6   (    (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/posix.pyt   <module>   s&   		ÿ 