
xYc           @  s#  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 d  d l m Z m Z m Z m Z m Z d  d	 l Z d  d	 l Z d  d	 l Z d  d	 l Z d
 d d f Z d e f d     YZ d e f d     YZ d e f d     YZ d	 S(   i(   t   unicode_literals(   t   windllt   pointer(   t   DWORD(   t   range(   t   KeyPress(   t   Keys(   t   MouseEventType(   t
   EventTypest   KEY_EVENT_RECORDt   MOUSE_EVENT_RECORDt   INPUT_RECORDt   STD_INPUT_HANDLENu   ConsoleInputReaderu   raw_modeu   cooked_modet   ConsoleInputReaderc           B  s  e  Z d  Z i! e j d 6e j d 6e j d 6e j d 6e j d 6e j	 d 6e j
 d 6e j d 6e j d	 6e j d
 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j d 6e j  d 6e j! d 6e j" d  6e j# d! 6Z$ i e j% d" 6e j& d# 6e j' d$ 6e j( d% 6e j) d& 6e j* d' 6e j+ d( 6e j, d) 6e j- d* 6e j. d+ 6e j/ d, 6e j0 d- 6e j1 d. 6e j2 d/ 6e j3 d0 6e j4 d1 6e j5 d2 6e j6 d3 6e j7 d4 6e j8 d5 6e j9 d6 6e j: d7 6Z; d8 Z< d9 Z= d: Z> d; Z? d< Z@ eA d=  ZB d>   ZC d?   ZD d@   ZE eF dA    ZG dB   ZH dC   ZI RS(D   u|   
    :param recognize_paste: When True, try to discover paste actions and turn
        the event into a BracketedPaste.
    s   s    s   s   s   s   s   s   s   s   s   	s   
s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   i!   i"   i#   i$   i%   i&   i'   i(   i-   i.   ip   iq   ir   is   it   iu   iv   iw   ix   iy   iz   i{   i   i   i   i   i   c         C  sq   d  |  _ | |  _ t j j   r9 t j j t	  |  _
 n4 t j d t j t j B |  _ t j |  j  |  _
 d  S(   Nu   CONIN$(   t   Nonet   _fdcont   recognize_pastet   syst   stdint   isattyR   t   kernel32t   GetStdHandleR   t   handlet   ost   opent   O_RDWRt   O_BINARYt   msvcrtt   get_osfhandle(   t   selfR   (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyt   __init__k   s    		c         C  s&   |  j  d k	 r" t j |  j   n  d S(   u    Close fdcon. N(   R   R   R   t   close(   R   (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR   w   s    c   	      c  sb  d } t  d  } t | } |   } t j j |  j t |  | t |   t |  j | |   } |  j	 rH|  j
 |  rHt |  } x | D] } g  } xk | r	t | j t j  s | j t j k r	| j | j  y t |  } Wq t k
 rd } q Xq W| r-t t j d j |   Vn  | d k	 r | Vq q Wn x | D] } | VqOWd S(   u   
        Return a list of `KeyPress` instances. It won't return anything when
        there was nothing to read.  (This function doesn't block.)

        http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx
        i   i    u    N(   R   R   R   R   t   ReadConsoleInputWR   R   t   listt	   _get_keysR   t	   _is_pastet   itert
   isinstancet   keyt   sixt	   text_typeR   t   ControlJt   appendt   datat   nextt   StopIterationR   R   t   BracketedPastet   join(	   R   t	   max_countt   readt   arrtypet   input_recordst   all_keyst   gent   kR+   (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR1   |   s0    
		c         c  s   x t  | j  D] } | | } | j t k r t | j t | j  } t |  t k r | j r xS |  j	 |  D] } | Vqs Wq t |  t
 k r x |  j |  D] } | Vq Wq q q Wd S(   uR   
        Generator that yields `KeyPress` objects from the input records.
        N(   R   t   valuet	   EventTypeR   t   getattrt   Eventt   typeR	   t   KeyDownt   _event_to_key_pressesR
   t   _handle_mouse(   R   R1   R3   t   it   irt   evt	   key_press(    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR"      s    
c         C  st   d } d } xO |  D]G } t  | j t j  r; | d 7} n  | j t j k r | d 7} q q W| d k os | d k S(   u<  
        Return `True` when we should consider this list of keys as a paste
        event. Pasted text on windows will be turned into a
        `Keys.BracketedPaste` event. (It's not 100% correct, but it is probably
        the best possible way to detect pasting of text and handle that
        correctly.)
        i    i   (   R%   R&   R'   R(   R   R)   (   t   keyst
   text_countt   newline_countR6   (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR#      s    c         C  s  t  |  t k r | j s! t  d } | j j } | j d  } | d k r | j |  j	 k r t
 |  j	 | j d  } q nV | |  j k r |  j | t j k r d } n  t
 |  j | |  } n t
 | |  } | j |  j @s | j |  j @r| r| j t j k rt j | _ n  | j t j k r=t j | _ n  | j t j k r^t j | _ n  | j t j k rt j | _ qn  | j |  j @r| r| j t j k rt j | _ qn  | j |  j @s| j |  j @r| r| j d k rt
 t j d  } n  | j |  j @s&| j |  j @rT| rT| j t j k rTt
 t j d  | g S| r| j |  j  @} | rt
 t j d  | g S| g Sn g  Sd S(   uU   
        For this `KEY_EVENT_RECORD`, return a list of `KeyPress` instances.
        u   utf-8u    u    u   
u    N(!   R;   R	   R<   t   AssertionErrorR   t   uChart   UnicodeChart   encodet   VirtualKeyCodet   keycodesR   t   mappingsR   R)   t   ControlKeyStatet   LEFT_CTRL_PRESSEDt   RIGHT_CTRL_PRESSEDR&   t   Leftt   ControlLeftt   Rightt   ControlRightt   Upt	   ControlUpt   Downt   ControlDownt   SHIFT_PRESSEDt   Tabt   BackTabR+   t   ControlSpacet   Escapet   LEFT_ALT_PRESSED(   R   RA   t   resultt   u_chart
   ascii_chart   meta_pressed(    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR=      sL    !	%

c         C  s   d } g  } | j  | k r xf t j t j g D]O } d j | t | j j  t | j j  g  } | j	 t
 t j |   q. Wn  | S(   uK   
        Handle mouse events. Return a list of KeyPress instances.
        i   u   ;(   t   ButtonStateR   t
   MOUSE_DOWNt   MOUSE_UPR/   t   strt   MousePositiont   Xt   YR*   R   R   t   WindowsMouseEvent(   R   RA   t   FROM_LEFT_1ST_BUTTON_PRESSEDR^   t
   event_typeR+   (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR>   #  s     (J   t   __name__t
   __module__t   __doc__R   R\   R[   t   ControlAt   ControlBt   ControlCt   ControlDt   ControlEt   ControlFt   ControlGt   ControlHt   ControlIR)   t   ControlKt   ControlLt   ControlNt   ControlOt   ControlPt   ControlQt   ControlRt   ControlSt   ControlTt   ControlUt   ControlVt   ControlWt   ControlXt   ControlYt   ControlZt   ControlBackslasht   ControlSquareCloset   ControlCircumflext   ControlUnderscoret	   BackspaceRL   t   PageUpt   PageDownt   Endt   HomeRP   RT   RR   RV   t   Insertt   Deletet   F1t   F2t   F3t   F4t   F5t   F6t   F7t   F8t   F9t   F10t   F11t   F12RK   R]   t   RIGHT_ALT_PRESSEDRX   RN   RO   t   TrueR   R   R1   R"   t   staticmethodR#   R=   R>   (    (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR      s   




















































		+		Nt   raw_modec           B  s5   e  Z d  Z d d  Z d   Z d   Z d   Z RS(   u   
    ::

        with raw_mode(stdin):
            ''' the windows terminal is now in 'raw' mode. '''

    The ``fileno`` attribute is ignored. This is to be compatble with the
    `raw_input` method of `.vt100_input`.
    c         C  s   t  j j t  |  _ d  S(   N(   R   R   R   R   R   (   R   t   fileno(    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR   C  s    c         C  s<   t    } t j j |  j t |   | |  _ |  j   d  S(   N(   R   R   R   t   GetConsoleModeR   R   t   original_modet   _patch(   R   R   (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyt	   __enter__F  s    		c         C  s?   d } d } d } t  j j |  j |  j j | | B| B@ d  S(   Ni   i   i   (   R   R   t   SetConsoleModeR   R   R7   (   R   t   ENABLE_ECHO_INPUTt   ENABLE_LINE_INPUTt   ENABLE_PROCESSED_INPUT(    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR   N  s    	c         O  s   t  j j |  j |  j  d  S(   N(   R   R   R   R   R   (   R   t   at   kw(    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyt   __exit__X  s    N(   Rl   Rm   Rn   R   R   R   R   R   (    (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR   9  s
   			
t   cooked_modec           B  s   e  Z d  Z d   Z RS(   ut   
    ::

        with cooked_mode(stdin):
            ''' the pseudo-terminal stdin is now used in raw mode '''
    c         C  s>   d } d } d } t  j j |  j |  j j | | B| BB d  S(   Ni   i   i   (   R   R   R   R   R   R7   (   R   R   R   R   (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR   d  s    	(   Rl   Rm   Rn   R   (    (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyR   ]  s   (   t
   __future__R    t   ctypesR   R   t   ctypes.wintypesR   t	   six.movesR   t*   prompt_toolkit.key_binding.input_processorR   t   prompt_toolkit.keysR   t   prompt_toolkit.mouse_eventsR   t   prompt_toolkit.win32_typesR   R	   R
   R   R   R   R   R   R'   t   __all__t   objectR   R   R   (    (    (    sB   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_input.pyt   <module>   s$   (	 #$