B
    't\A                 @   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 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dddgZ#G dd deZ$G dd de%Z&i Z'e
dd Z(e
dd Z)G dd de%Z*G dd de*Z+dS )    )unicode_literals)windllpointer)DWORD)range)contextmanager   )REVERSE_ANSI_SEQUENCES)Input)get_event_loop)wait_for_handles)KeyPress)Keys)MouseEventType)
EventTypesKEY_EVENT_RECORDMOUSE_EVENT_RECORDINPUT_RECORDSTD_INPUT_HANDLEN
Win32InputConsoleInputReaderraw_modecooked_modeattach_win32_inputdetach_win32_inputc               @   sz   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Ze	dd Z
dd Zdd Zdd Zdd Zdd Ze	dd ZdS )r   z<
    `Input` class that reads from the Windows console.
    Nc             C   s   t  | _d S )N)r   console_input_reader)selfstdin r   9lib/python3.7/site-packages/prompt_toolkit/input/win32.py__init__#   s    zWin32Input.__init__c             C   s   t |stt| |S )zj
        Return a context manager that makes this input active in the current
        event loop.
        )callableAssertionErrorr   )r   Zinput_ready_callbackr   r   r   attach&   s    zWin32Input.attachc             C   s   t | S )z{
        Return a context manager that makes sure that this input is not active
        in the current event loop.
        )r   )r   r   r   r   detach.   s    zWin32Input.detachc             C   s   t | j S )N)listr   read)r   r   r   r   	read_keys5   s    zWin32Input.read_keysc             C   s   d S )Nr   )r   r   r   r   flush8   s    zWin32Input.flushc             C   s   dS )NFr   )r   r   r   r   closed;   s    zWin32Input.closedc             C   s   t  S )N)r   )r   r   r   r   r   ?   s    zWin32Input.raw_modec             C   s   t  S )N)r   )r   r   r   r   r   B   s    zWin32Input.cooked_modec             C   s
   t j S )N)sysr   fileno)r   r   r   r   r+   E   s    zWin32Input.filenoc             C   s   dS )Nzwin32-inputr   )r   r   r   r   typeahead_hashL   s    zWin32Input.typeahead_hashc             C   s   | j   d S )N)r   close)r   r   r   r   r-   O   s    zWin32Input.closec             C   s   | j jS )N)r   handle)r   r   r   r   r.   R   s    zWin32Input.handle)N)__name__
__module____qualname____doc__r    r#   r$   r'   r(   propertyr)   r   r   r+   r,   r-   r.   r   r   r   r   r      s   
c            "   @   sR  e Zd ZdZejejejejej	ej
ejejejejejejejejejejejejejejejejejejejejejej ej!ej"ej#ej$ej%d!Z&ej'ej(ej)ej*ej+ej,ej-ej.ej/ej0ej1ej2ej3ej4ej5ej6ej7ej8ej9ej:ej;ej<dZ=dZ>dZ?dZ@dZAdZBdd
dZCdd ZDdd ZEdd ZFdd ZGeHdd ZIdd ZJdd ZKdS )r   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   {      r            Tc             C   sN   d | _ || _tj r&tjt| _	n$t
dt
jt
jB | _ t| j | _	d S )NzCONIN$)_fdconrecognize_paster*   r   isattyr   kernel32GetStdHandler   r.   osopenO_RDWRZO_BINARYmsvcrtZget_osfhandle)r   rp   r   r   r   r       s    
zConsoleInputReader.__init__c             C   s   | j dk	rt| j  dS )z Close fdcon. N)ro   rt   r-   )r   r   r   r   r-      s    
zConsoleInputReader.closec       	   	   #   s4  d}t d}t| }| }t jgdds.dS tj jt||t| t 	||} fdd|D } j
r |rt|}x|D ]}g }xT|rt|jtjs|jtjkr||j yt|}W q tk
r   d}Y qX qW |rttjd|V  |dk	r|V  qW nx|D ]}|V  q W dS )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   )ZtimeoutNc                s   g | ]}  |qS r   )_insert_key_data).0key)r   r   r   
<listcomp>   s    z+ConsoleInputReader.read.<locals>.<listcomp> )r   r   r   r.   r   rr   ZReadConsoleInputWr   r%   	_get_keysrp   	_is_pasteiter
isinstancerz   six	text_typer   ControlJappenddatanextStopIterationr   ZBracketedPastejoin)	r   Z	max_countr&   Zarrtypeinput_recordsZall_keysgenkr   r   )r   r   r&      s6    

zConsoleInputReader.readc             C   s$   |j r
|S t|jd}t|j|S )z@
        Insert KeyPress data, for vt100 compatibility.
        r|   )r   r	   getrz   r   )r   	key_pressr   r   r   r   rx      s    z#ConsoleInputReader._insert_key_datac             c   s   xt |jD ]|}|| }|jtkrt|jt|j }t|tkrb|jrbx@| 	|D ]
}|V  qRW qt|t
krx| |D ]
}|V  qzW qW dS )zR
        Generator that yields `KeyPress` objects from the input records.
        N)r   valueZ	EventTyper   getattrZEventtyper   KeyDown_event_to_key_pressesr   _handle_mouse)r   r&   r   iZirevr   r   r   r   r}      s    
zConsoleInputReader._get_keysc             C   sP   d}d}x6| D ].}t |jtjr(|d7 }|jtjkr|d7 }qW |dkoN|dk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   r   )r   rz   r   r   r   ControlM)keysZ
text_countZnewline_countr   r   r   r   r~     s    
zConsoleInputReader._is_pastec             C   s  t |tkr|jstd}|jj}|d}|dkrT|j| jkrt	| j|j d}n:|| j
kr| j
| tjkrrd}t	| j
| |}n
t	||}|j| j@ s|j| j@ r|r|jtjkrtj|_|jtjkrtj|_|jtjkrtj|_|jtjkrtj|_|j| j@ r$|r$|jtjkr$tj|_|j| j@ s@|j| j@ r^|r^|jdkr^t	tjd}|j| j@ sz|j| j@ r|r|jtjkrt	tjd|gS |r|j| j@ }|rt	tjd|gS |gS ng S dS )zU
        For this `KEY_EVENT_RECORD`, return a list of `KeyPress` instances.
        Nzutf-8 r|   
 ) r   r   r   r"   ZuCharZUnicodeCharencodeZVirtualKeyCodekeycodesr   mappingsr   r   ZControlKeyStateLEFT_CTRL_PRESSEDRIGHT_CTRL_PRESSEDrz   LeftZControlLeftRightZControlRightUpZ	ControlUpDownZControlDownSHIFT_PRESSEDZTabZBackTabr   ControlSpaceEscapeLEFT_ALT_PRESSED)r   r   resultZu_charZ
ascii_charZmeta_pressedr   r   r   r   )  sL    


 
z(ConsoleInputReader._event_to_key_pressesc             C   s^   d}g }|j |krZxFtjtjgD ]6}d|t|jjt|jjg}|	t
tj| q W |S )zK
        Handle mouse events. Return a list of KeyPress instances.
        r   ;)ZButtonStater   Z
MOUSE_DOWNZMOUSE_UPr   strZMousePositionXYr   r   r   ZWindowsMouseEvent)r   r   ZFROM_LEFT_1ST_BUTTON_PRESSEDr   Z
event_typer   r   r   r   r   w  s    

z ConsoleInputReader._handle_mouseN)T)Lr/   r0   r1   r2   r   r   r   ZControlAZControlBZControlCZControlDZControlEZControlFZControlGZControlHZControlIr   ZControlKZControlLr   ZControlNZControlOZControlPZControlQZControlRZControlSZControlTZControlUZControlVZControlWZControlXZControlYZControlZZControlBackslashZControlSquareCloseZControlCircumflexZControlUnderscoreZ	Backspacer   ZPageUpZPageDownZEndZHomer   r   r   r   ZInsertZDeleteZF1ZF2ZF3ZF4ZF5ZF6ZF7ZF8ZF9ZF10ZF11ZF12r   r   ZRIGHT_ALT_PRESSEDr   r   r   r    r-   r&   rx   r}   staticmethodr~   r   r   r   r   r   r   r   W   s   


7
Nc          
   c   s   t | tstt|stt }t|}|| j| |t|< z
dV  W d|	| j |rt|| j| |t|< nt|= X dS )z
    Context manager that makes this input active in the current event loop.

    :param input: :class:`~prompt_toolkit.input.Input` object.
    :param input_ready_callback: Called when the input is ready to read.
    N)
r   r
   r"   r!   r   _current_callbacksr   add_win32_handler.   remove_win32_handle)inputcallbackloopZprevious_callbackr   r   r   r     s    


c          
   c   sb   t | tstt }t|}|r6|| j d t|< z
d V  W d |r\|| j| |t|< X d S )N)	r   r
   r"   r   r   r   r   r.   r   )r   r   Zpreviousr   r   r   r     s    

c               @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )r   z
    ::

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

    The ``fileno`` attribute is ignored. This is to be compatible with the
    `raw_input` method of `.vt100_input`.
    Nc             C   s   t jt| _d S )N)r   rr   rs   r   r.   )r   r+   r   r   r   r      s    zraw_mode.__init__c             C   s,   t  }tj| jt| || _|   d S )N)r   r   rr   ZGetConsoleModer.   r   original_mode_patch)r   r   r   r   r   	__enter__  s    zraw_mode.__enter__c             C   s2   d}d}d}t j| j| jj||B |B  @  d S )Nrn   rk   r   )r   rr   SetConsoleModer.   r   r   )r   ENABLE_ECHO_INPUTENABLE_LINE_INPUTENABLE_PROCESSED_INPUTr   r   r   r     s    
zraw_mode._patchc             O   s   t j| j| j d S )N)r   rr   r   r.   r   )r   akwr   r   r   __exit__  s    zraw_mode.__exit__)N)r/   r0   r1   r2   r    r   r   r   r   r   r   r   r     s
   	

c               @   s   e Zd ZdZdd ZdS )r   zx
    ::

        with cooked_mode(stdin):
            ''' The pseudo-terminal stdin is now used in cooked mode. '''
    c             C   s0   d}d}d}t j| j| jj||B |B B  d S )Nrn   rk   r   )r   rr   r   r.   r   r   )r   r   r   r   r   r   r   r     s    
zcooked_mode._patchN)r/   r0   r1   r2   r   r   r   r   r   r     s   ),Z
__future__r   Zctypesr   r   Zctypes.wintypesr   Z	six.movesr   
contextlibr   Zansi_escape_sequencesr	   baser
   Zprompt_toolkit.eventloopr   Zprompt_toolkit.eventloop.win32r   Z(prompt_toolkit.key_binding.key_processorr   Zprompt_toolkit.keysr   Zprompt_toolkit.mouse_eventsr   Zprompt_toolkit.win32_typesr   r   r   r   r   rw   rt   r*   r   __all__r   objectr   r   r   r   r   r   r   r   r   r   <module>   s>   8  8$