
    2                         S SK Jr  S SKJrJr  S SKJr  S SKJr  S SK	J
r
  S SKJr  S SKJr  S SKJrJrJrJrJr  S S	KrS S	KrS S	KrS S	KrS
r " S S\5      r " S S\5      r " S S\5      rg	)    )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                      \ rS rSrSr0 S\R                  _S\R                  _S\R                  _S\R                  _S\R                  _S\R                  _S	\R                  _S
\R                  _S\R                  _S\R                  _S\R                   _S\R"                  _S\R$                  _S\R&                  _S\R"                  _S\R(                  _S\R*                  _0 S\R,                  _S\R.                  _S\R0                  _S\R2                  _S\R4                  _S\R6                  _S\R8                  _S\R:                  _S\R<                  _S\R>                  _S\R@                  _S\RB                  _S \RD                  _S!\RF                  _S"\RH                  _S#\RJ                  _Er&0 S$\RN                  _S%\RP                  _S&\RR                  _S'\RT                  _S(\RV                  _S)\RX                  _S*\RZ                  _S+\R\                  _S,\R^                  _S-\R`                  _S.\Rb                  _S/\Rd                  _S0\Rf                  _S1\Rh                  _S2\Rj                  _S3\Rl                  _S4\Rn                  _\Rp                  \Rr                  \Rt                  \Rv                  \Rx                  S5.Er=S6r>S7r?S8r@S9rAS:rBSDS; jrCS< rDS= rES> rF\GS? 5       rHS@ rISA rJSBrKgC)Er      zp
: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                 v   S U l         Xl        [        R                  R	                  5       (       a)  [
        R                  R                  [        5      U l	        g [        R                  " S[        R                  [        R                  -  5      U l         [        R                  " U R                   5      U l	        g )NzCONIN$)_fdconrecognize_pastesysstdinisattyr   kernel32GetStdHandler   handleosopenO_RDWRO_BINARYmsvcrtget_osfhandle)selfrS   s     6lib/third_party/prompt_toolkit/terminal/win32_input.py__init__ConsoleInputReader.__init__k   sp    . 99 //667GHDK''(BII,CDDK ..t{{;DK    c                 `    U R                   b!  [        R                  " U R                   5        gg)zClose fdcon. N)rR   rZ   close)r`   s    ra   rf   ConsoleInputReader.closew   s!    ;;"HHT[[! #rd   c              #     #    Sn[        S5      n[        U-  nU" 5       n[        R                  R	                  U R
                  [        U5      U[        U5      5        [        U R                  X$5      5      nU R                  (       Ga3  U R                  U5      (       Ga  [        U5      nU GH	  n/ nU(       a  [        UR                  [        R                  5      (       d  UR                  [         R"                  :X  ay  UR%                  UR&                  5         [)        U5      nU(       aK  [        UR                  [        R                  5      (       a  MY  UR                  [         R"                  :X  a  My  U(       a+  [-        [         R.                  SR1                  U5      5      v   Uc  GM  Uv   GM     gU H  nUv   M	     g! [*         a    Sn Nf = f7f)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   rW   ReadConsoleInputWrY   r   list	_get_keysrS   	_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kru   s	            ra   r{   ConsoleInputReader.read|   sX     	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GG)0GG;3G3GGGGGc              #     #    [        UR                  5       H  nX#   nUR                  [        ;   d  M  [	        UR
                  [        UR                     5      n[        U5      [        :X  a/  UR                  (       a  U R                  U5       H  nUv   M	     M  [        U5      [        :X  d  M  U R                  U5       H  nUv   M	     M     g7f)zB
Generator that yields `KeyPress` objects from the input records.
N)r   value	EventTyper   getattrEventtyper   KeyDown_event_to_key_pressesr   _handle_mouse)r`   r{   r}   iirev	key_presss          ra   rl   ConsoleInputReader._get_keys   s      tzz"A!B ||z)RXXz",,'?@ 8//BJJ%)%?%?%C	' &D "X!33%)%7%7%;	' &<# #s   /CA:C3!Cc                     SnSnU  HV  n[        UR                  [        R                  5      (       a  US-  nUR                  [        R
                  :X  d  MQ  US-  nMX     US:  =(       a    U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   rM   )ro   rp   rq   rr   r	   rs   )keys
text_countnewline_countr   s       ra   rm   ConsoleInputReader._is_paste   sf     
A!%%//a
uu%"	  !4j1n4rd   c                    [        U5      [        :X  a  UR                  (       d   eSnUR                  R                  nUR                  S5      nUS:X  a>  UR                  U R                  ;   a#  [        U R                  UR                     S5      nOWX@R                  ;   a=  U R                  U   [        R                  :X  a  Sn[        U R                  U   U5      nO[        X35      nUR                  U R                  -  (       d  UR                  U R                  -  (       a  U(       a  UR                  [        R                   :X  a  [        R"                  Ul        UR                  [        R$                  :X  a  [        R&                  Ul        UR                  [        R(                  :X  a  [        R*                  Ul        UR                  [        R,                  :X  a  [        R.                  Ul        UR                  U R0                  -  (       a:  U(       a3  UR                  [        R2                  :X  a  [        R4                  Ul        UR                  U R                  -  (       d  UR                  U R                  -  (       a1  U(       a*  UR6                  S:X  a  [        [        R8                  S5      nUR                  U R                  -  (       d  UR                  U R                  -  (       aA  U(       a:  UR                  [        R                  :X  a  [        [        R:                  S5      U/$ U(       a?  UR                  U R<                  -  nU(       a  [        [        R:                  S5      U/$ U/$ / $ )zE
For this `KEY_EVENT_RECORD`, return a list of `KeyPress` instances.
Nzutf-8 ri   
 )r   r   r   uCharUnicodeCharencodeVirtualKeyCodekeycodesr   mappingsr	   rs   ControlKeyStateLEFT_CTRL_PRESSEDRIGHT_CTRL_PRESSEDrp   LeftControlLeftRightControlRightUp	ControlUpDownControlDownSHIFT_PRESSEDTabBackTabru   ControlSpaceEscapeLEFT_ALT_PRESSED)r`   r   resultu_char
ascii_charmeta_presseds         ra   r   (ConsoleInputReader._event_to_key_presses   si    Bx++

::%%]]7+
 V  DMM1!$--0A0A"BBG]]*==,=!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 Ird   c                 j   Sn/ nUR                   U:X  a  [        R                  [        R                  4 Hz  nSR	                  U[        UR                  R                  5      [        UR                  R                  5      /5      nUR                  [        [        R                  U5      5        M|     U$ )z;
Handle mouse events. Return a list of KeyPress instances.
rM   ;)ButtonStater
   
MOUSE_DOWNMOUSE_UPry   strMousePositionXYrt   r   r	   WindowsMouseEvent)r`   r   FROM_LEFT_1ST_BUTTON_PRESSEDr   
event_typeru   s         ra   r    ConsoleInputReader._handle_mouse#  s     (+$ >>99-88.:Q:QR
xxr''))*r''))*! 
 ht'='=tDE S rd   )rR   rY   rS   N)T)L__name__
__module____qualname____firstlineno____doc__r	   r   r   ControlAControlBControlCControlDControlEControlFControlGControlHControlIrs   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   rb   rf   r{   rl   staticmethodrm   r   r   __static_attributes__ rd   ra   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\rd   r   c                   4    \ rS rSrSrS	S jrS rS rS rSr	g)
r   i9  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    [         R                  R                  [        5      U l        g N)r   rW   rX   r   rY   )r`   filenos     ra   rb   raw_mode.__init__C  s    oo223CDrd   c                     [        5       n[        R                  R                  U R                  [        U5      5        Xl        U R                  5         g r   )r   r   rW   GetConsoleModerY   r   original_mode_patch)r`   r  s     ra   	__enter__raw_mode.__enter__F  s5    &&t{{GM4JK*rd   c                     SnSnSn[         R                  R                  U R                  U R                  R
                  X-  U-  ) -  5        g NrP   rL   rM   r   rW   SetConsoleModerY   r  r   r`   ENABLE_ECHO_INPUTENABLE_LINE_INPUTENABLE_PROCESSED_INPUTs       ra   r  raw_mode._patchN  sQ    ""!'&&KK++1136LLMN	Ord   c                 l    [         R                  R                  U R                  U R                  5        g r   )r   rW   r  rY   r  )r`   akws      ra   __exit__raw_mode.__exit__X  s     &&t{{D4F4FGrd   )rY   r  r   )
r   r   r   r   r   rb   r  r  r  r   r   rd   ra   r   r   9  s    EOHrd   r   c                       \ rS rSrSrS rSrg)r   i]  zd
::

    with cooked_mode(stdin):
        ''' the pseudo-terminal stdin is now used in raw mode '''
c                     SnSnSn[         R                  R                  U R                  U R                  R
                  X-  U-  -  5        g r  r  r	  s       ra   r  cooked_mode._patchd  sN    ""!'&&KK++1125KKM	Nrd   r   N)r   r   r   r   r   r  r   r   rd   ra   r   r   ]  s    Nrd   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^   rZ   rT   rq   __all__objectr   r   r   r   rd   ra   <module>r      s_    ' " !  ? $ 6 w w  	 
 
_ _D	!Hv !HHN( Nrd   