ó
±xYc           @  s  d  Z  d d l m Z d d l 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 m Z d d l m Z m Z m Z d d l Z d d l Z d Z d Z e d e	 ƒ Z d e f d „  ƒ  YZ d d „ Z d „  Z d S(   ug   
Win32 event loop.

Windows notes:
    - Somehow it doesn't seem to work with the 'ProactorEventLoop'.
iÿÿÿÿ(   t   unicode_literalsi   (   t   ConsoleInputReader(   t   SECURITY_ATTRIBUTESi   (   t	   EventLoopt   INPUT_TIMEOUT(   t   InputHookContext(   t   TimeIt(   t   windllt   pointer(   t   DWORDt   BOOLt   HANDLENu   Win32EventLoopi  iè  t   Win32EventLoopc           B  st   e  Z d  Z d e d „ Z d „  Z d d „ Z d „  Z d „  Z	 d „  Z
 d d „ Z d „  Z d	 „  Z d
 „  Z RS(   u¡   
    Event loop for Windows systems.

    :param recognize_paste: When True, try to discover paste actions and turn
        the event into a BracketedPaste.
    c         C  s   | d  k s t | ƒ s t ‚ t ƒ  |  _ t d | ƒ |  _ g  |  _ t |  _	 t |  _
 i  |  _ | rr t | ƒ n d  |  _ d  S(   Nt   recognize_paste(   t   Nonet   callablet   AssertionErrort   _create_eventt   _eventR   t   _console_input_readert   _calls_from_executort   Falset   closedt   _runningt	   _read_fdsR   t   _inputhook_context(   t   selft	   inputhookR   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyt   __init__$   s    				c   
        sl  ˆ j  r t d ƒ ‚ n  t ‰  t ˆ _ x>ˆ j rgt ƒ  5 } ˆ j rm ‡  ‡ f d †  } ˆ j j | ƒ n  Wd  QXˆ  d k rˆ d } n  t d ˆ  t	 d | j
 ƒ ƒ } ˆ j | ƒ } | ˆ j j k rÿ ˆ j j ƒ  } x | D] } | j | ƒ qß Wt ‰  q* | ˆ j k r.t j j ˆ j ƒ ˆ j ƒ  q* | ˆ j k rTˆ j | }	 |	 ƒ  q* | j ƒ  d ‰  q* Wd  S(   Nu   Event loop already closed.c           s   t  ˆ j |  r ˆ  n d ƒ ƒ S(   uF    True when there is input ready. The inputhook should return control. i    (   t   boolt   _ready_for_reading(   t   wait(   t   current_timeoutR   (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyt   ready?   s    iÿÿÿÿi    iè  (   R   t	   Exceptiont   INPUT_TIMEOUT_MSt   TrueR   R   R   t   call_inputhookt   maxt   intt   durationR   R   t   handlet   readt   feed_keyR   R   t   kernel32t
   ResetEventt#   _process_queued_calls_from_executorR   t   input_timeout(
   R   t   stdint	   callbackst   inputhook_timerR!   t   remaining_timeoutR)   t   keyst   kt   callback(    (   R    R   s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyt   run4   s4    				 	

c         C  s8   |  j  |  j j g } | j |  j j ƒ  ƒ t | | ƒ S(   uS   
        Return the handle that is ready for reading or `None` on timeout.
        (   R   R   R)   t   extendR   R4   t   _wait_for_handles(   R   t   timeoutt   handles(    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyR   a   s    c         C  s   t  |  _ d  S(   N(   R   R   (   R   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyt   stopi   s    c         C  sF   t  |  _ t j j |  j ƒ |  j r5 |  j j ƒ  n  |  j j ƒ  d  S(   N(	   R$   R   R   R,   t   CloseHandleR   R   t   closeR   (   R   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyR>   l   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(    (   R6   (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyt   start_executor€   s    N(   t   call_from_executor(   R   R6   RC   (    (   R6   s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyt   run_in_executorw   s    	c         C  s'   |  j  j | ƒ t j j |  j ƒ d S(   um   
        Call this function in the main event loop.
        Similar to Twisted's ``callFromThread``.
        N(   R   t   appendR   R,   t   SetEventR   (   R   R6   t   _max_postpone_until(    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyRD   „   s    c         C  s/   |  j  g  } |  _  x | D] } | ƒ  q Wd  S(   N(   R   (   R   t   calls_from_executort   c(    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyR.      s    c         C  s    t  j | ƒ } | |  j | <d S(   u;    Start watching the file descriptor for read availability. N(   t   msvcrtt   get_osfhandleR   (   R   t   fdR6   t   h(    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyt
   add_reader•   s    c         C  s/   t  j | ƒ } | |  j k r+ |  j | =n  d S(   u:    Stop watching the file descriptor for read availability. N(   RK   RL   R   (   R   RM   RN   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyt   remove_readerš   s    N(   t   __name__t
   __module__t   __doc__R   R$   R   R7   R   R<   R>   RE   RD   R.   RO   RP   (    (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyR      s   	-					c         C  sk   t  t |  ƒ } | |  Œ  } t j j t | ƒ | t t ƒ t | ƒ ƒ } | t k rY d S| | } | Sd S(   uÑ   
    Waits for multiple handles. (Similar to 'select') Returns the handle which is ready.
    Returns `None` on timeout.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx
    N(
   R   t   lenR   R,   t   WaitForMultipleObjectsR
   R   R	   t   WAIT_TIMEOUTR   (   R;   R:   t   arrtypet   handle_arrayt   retRN   (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyR9   ¡   s    	$
c           C  s.   t  j j t t ƒ  ƒ t t ƒ t t ƒ d ƒ S(   u}   
    Creates a Win32 unnamed Event .

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396(v=vs.85).aspx
    N(	   R   R,   t   CreateEventAR   R   R
   R$   R   R   (    (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyR   µ   s    (   u   Win32EventLoop(   RS   t
   __future__R    t   terminal.win32_inputR   t   win32_typesR   t   baseR   R   R   R   t   utilsR   t   ctypesR   R   t   ctypes.wintypesR	   R
   R   RK   R@   t   __all__RV   R'   R#   R   R9   R   (    (    (    s=   lib/python2.7/site-packages/prompt_toolkit/eventloop/win32.pyt   <module>   s    „