
    2                         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
Z G d de      Z G d de      Z G d de      Zy	)    )unicode_literals)windllpointer)DWORD)range)KeyPress)Keys)MouseEventType)
EventTypesKEY_EVENT_RECORDMOUSE_EVENT_RECORDINPUT_RECORDSTD_INPUT_HANDLEN)ConsoleInputReaderraw_modecooked_modec                      e Zd ZdZi dej
                  dej                  dej                  dej                  dej                  dej                  dej                  d	ej                  d
ej                  dej                  dej                  dej                   dej"                  dej$                  dej                   dej&                  dej(                  i dej*                  dej,                  dej.                  dej0                  dej2                  dej4                  dej6                  dej8                  dej:                  dej<                  dej>                  dej@                  dejB                  d ejD                  d!ejF                  d"ejH                  Z%i d#ejL                  d$ejN                  d%ejP                  d&ejR                  d'ejT                  d(ejV                  d)ejX                  d*ejZ                  d+ej\                  d,ej^                  d-ej`                  d.ejb                  d/ejd                  d0ejf                  d1ejh                  d2ejj                  d3ejl                  ejn                  ejp                  ejr                  ejt                  ejv                  d4Z<d5Z=d6Z>d7Z?d8Z@d9ZAdBd:ZBd; ZCd< ZDd= ZEeFd>        ZGd? ZHd@ ZIyA)Cr   z|
    :param recognize_paste: When True, try to discover paste actions and turn
        the event into a BracketedPaste.
                                      	   
                                                               !   "   #   $   %   &   '   (   -   .   p   q   r   s   t   u   v   )w   x   y   z   {                  c                 j   d | _         || _        t        j                  j	                         r)t
        j                  j                  t              | _	        y t        j                  dt        j                  t        j                  z        | _         t        j                  | j                         | _	        y )NzCONIN$)_fdconrecognize_pastesysstdinisattyr   kernel32GetStdHandler   handleosopenO_RDWRO_BINARYmsvcrtget_osfhandle)selfrR   s     6lib/third_party/prompt_toolkit/terminal/win32_input.py__init__zConsoleInputReader.__init__k   so    . 99 //667GHDK''(BII,CDDK ..t{{;DK    c                 \    | j                    t        j                  | j                          yy)z Close fdcon. N)rQ   rY   close)r_   s    r`   rd   zConsoleInputReader.closew   s!    ;;"HHT[[! #rb   c              #   \  K   d}t        d      }t        |z  } |       }t        j                  j	                  | j
                  t        |      |t        |             t        | j                  ||            }| j                  r	| j                  |      rt        |      }|D ]  }g }|rt        |j                  t        j                        s|j                  t         j"                  k(  rl|j%                  |j&                         	 t)        |      }|rCt        |j                  t        j                        rN|j                  t         j"                  k(  rl|r+t-        t         j.                  dj1                  |             ||  y|D ]  }|  y# t*        $ r d}Y w xY ww)z
        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   r   N )r   r   r   rV   ReadConsoleInputWrX   r   list	_get_keysrR   	_is_pasteiter
isinstancekeysix	text_typer	   ControlJappenddatanextStopIterationr   BracketedPastejoin)	r_   	max_countreadarrtypeinput_recordsall_keysgenkrr   s	            r`   rx   zConsoleInputReader.read|   sO     	Qx*	 	))KK/GDM	K
 t];<DNN8$<x.C Zs}}=UUdmm3KK'! I	 Zs}}=UUdmm3 "4#6#6FF=G "   ) ! !s<   DF,F&F,:F,/F,F,F)&F,(F))F,c              #     K   t        |j                        D ]  }||   }|j                  t        v st	        |j
                  t        |j                           }t        |      t        k(  r'|j                  r| j                  |      D ]  }|  {t        |      t        k(  s| j                  |      D ]  }|   yw)zR
        Generator that yields `KeyPress` objects from the input records.
        N)r   value	EventTyper   getattrEventtyper   KeyDown_event_to_key_pressesr   _handle_mouse)r_   rx   rz   iirev	key_presss          r`   ri   zConsoleInputReader._get_keys   s      tzz"Aq!B ||z)RXXz",,'?@ 8//BJJ%)%?%?%C	' &D "X!33%)%7%7%;	' &<# #s   0CA2C&Cc                     d}d}| D ]N  }t        |j                  t        j                        r|dz  }|j                  t        j
                  k(  sJ|dz  }P |dk\  xr |dkD  S )a<  
        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.)
        r   rL   )rl   rm   rn   ro   r	   rp   )keys
text_countnewline_countr}   s       r`   rj   zConsoleInputReader._is_paste   sc     
A!%%/a
uu%"	  !4j1n4rb   c                 d   t        |      t        k(  r|j                  sJ d}|j                  j                  }|j                  d      }|dk(  r<|j                  | j                  v rzt        | j                  |j                     d      }nV|| j                  v r<| j                  |   t        j                  k(  rd}t        | j                  |   |      }nt        ||      }|j                  | j                  z  s|j                  | j                  z  r|r|j                  t        j                   k(  rt        j"                  |_        |j                  t        j$                  k(  rt        j&                  |_        |j                  t        j(                  k(  rt        j*                  |_        |j                  t        j,                  k(  rt        j.                  |_        |j                  | j0                  z  r4|r2|j                  t        j2                  k(  rt        j4                  |_        |j                  | j                  z  s|j                  | j                  z  r+|r)|j6                  dk(  rt        t        j8                  d      }|j                  | j                  z  s|j                  | j                  z  r;|r9|j                  t        j                  k(  rt        t        j:                  d      |gS |r:|j                  | j<                  z  }|rt        t        j:                  d      |gS |gS g S )zU
        For this `KEY_EVENT_RECORD`, return a list of `KeyPress` instances.
        Nzutf-8 rf   
 )r   r   r   uCharUnicodeCharencodeVirtualKeyCodekeycodesr   mappingsr	   rp   ControlKeyStateLEFT_CTRL_PRESSEDRIGHT_CTRL_PRESSEDrm   LeftControlLeftRightControlRightUp	ControlUpDownControlDownSHIFT_PRESSEDTabBackTabrr   ControlSpaceEscapeLEFT_ALT_PRESSED)r_   r   resultu_char
ascii_charmeta_presseds         r`   r   z(ConsoleInputReader._event_to_key_presses   sl    Bx++

::%%]]7+
 V  DMM1!$--0A0A"BBGT]]*==,=!F!$--
";VD!&&1 !7!77""T%<%<<&zzTYY&!--
zzTZZ'!..
zzTWW$!^^
zzTYY&!--
  2 22vzzTXX%!\\
 !7!77""T%<%<<&V[[\_M_d//5F !7!77""T%<%<<&

dmm+T[["-v66 --0E0EEL b16::x Irb   c                 d   d}g }|j                   |k(  rt        j                  t        j                  fD ]y  }dj	                  |t        |j                  j                        t        |j                  j                        g      }|j                  t        t        j                  |             { |S )zK
        Handle mouse events. Return a list of KeyPress instances.
        rL   ;)ButtonStater
   
MOUSE_DOWNMOUSE_UPrv   strMousePositionXYrq   r   r	   WindowsMouseEvent)r_   r   FROM_LEFT_1ST_BUTTON_PRESSEDr   
event_typerr   s         r`   r   z ConsoleInputReader._handle_mouse#  s     (+$ >>99-88.:Q:QR
xxr''))*r''))*! 
 ht'='=tDE S rb   N)T)J__name__
__module____qualname____doc__r	   r   r   ControlAControlBControlCControlDControlEControlFControlGControlHControlIrp   ControlKControlLControlNControlOControlPControlQControlRControlSControlTControlUControlVControlWControlXControlYControlZControlBackslashControlSquareCloseControlCircumflexControlUnderscore	Backspacer   PageUpPageDownEndHomer   r   r   r   InsertDeleteF1F2F3F4F5F6F7F8F9F10F11F12r   r   RIGHT_ALT_PRESSEDr   r   r   ra   rd   rx   ri   staticmethodrj   r   r    rb   r`   r   r      s   
&& 	""& 		&
 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&  	!&& 	'&( 	)&* 	+&, 	-&. 	/&0 	1&2 	3&4 	5&6 	7&8 	9&: 	;&< 	=&> 	?&B 	&&C&D 	((E&F 	''G&H 	''I&J 	K&HR
DKK 	DMM 	DHH	
 	DII 	DII 	DGG 	DJJ 	DII 	DKK 	DKK" 	TWW#$ 	TWW%& 	TWW'( 	TWW)* 	TWW+, 	TWW-. 	TWW/0 WWWWXXXXXX9H> M
<"
)V(0 5 5*L\rb   r   c                   *    e Zd ZdZddZd Zd Zd Zy)r   z
    ::

        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`.
    Nc                 T    t         j                  j                  t              | _        y N)r   rV   rW   r   rX   )r_   filenos     r`   ra   zraw_mode.__init__C  s    oo223CDrb   c                     t               }t        j                  j                  | j                  t        |             || _        | j                          y r   )r   r   rV   GetConsoleModerX   r   original_mode_patch)r_   r   s     r`   	__enter__zraw_mode.__enter__F  s7    &&t{{GM4JK*rb   c                     d}d}d}t         j                  j                  | j                  | j                  j
                  ||z  |z   z         y NrO   rK   rL   r   rV   SetConsoleModerX   r   r   r_   ENABLE_ECHO_INPUTENABLE_LINE_INPUTENABLE_PROCESSED_INPUTs       r`   r   zraw_mode._patchN  sT    ""!'&&KK++11"336LLMN	Orb   c                 l    t         j                  j                  | j                  | j                         y r   )r   rV   r   rX   r   )r_   akws      r`   __exit__zraw_mode.__exit__X  s     &&t{{D4F4FGrb   r   )r   r   r   r   ra   r   r   r  r   rb   r`   r   r   9  s    EOHrb   r   c                       e Zd ZdZd Zy)r   zt
    ::

        with cooked_mode(stdin):
            ''' the pseudo-terminal stdin is now used in raw mode '''
    c                     d}d}d}t         j                  j                  | j                  | j                  j
                  ||z  |z  z         y r   r   r   s       r`   r   zcooked_mode._patchd  sQ    ""!'&&KK++11!225KKM	Nrb   N)r   r   r   r   r   r   rb   r`   r   r   ]  s    Nrb   r   )
__future__r   ctypesr   r   ctypes.wintypesr   	six.movesr   *prompt_toolkit.key_binding.input_processorr   prompt_toolkit.keysr	   prompt_toolkit.mouse_eventsr
   prompt_toolkit.win32_typesr   r   r   r   r   r]   rY   rS   rn   __all__objectr   r   r   r   rb   r`   <module>r     s_    ' " !  ? $ 6 w w  	 
 
_ _D	!Hv !HHN( Nrb   