o
    j{                     @  s  d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
 ddlmZ ejdks/J es;d dlZd d	lmZ d d
lmZmZmZ d dlmZmZ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# d dl$m%Z% d dl&m'Z'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 g dZ5dZ6dZ7dZ8dZ9dZ:G dd de2Z;G dd de;Z<G dd  d Z=G d!d" d"Z>G d#d$ d$Z?e
d5d*d+Z@e
d6d,d-ZAG d.d/ d/ZBG d0d1 d1eBZCd7d3d4ZDdS )8    )annotationsN)abstractmethod)get_running_loop)AbstractContextManagercontextmanager   )SPHINX_AUTODOC_RUNNINGwin32)windll)CallableIterableIterator)Arraybyrefpointer)DWORDHANDLE)TextIOrun_in_executor_with_context)create_win32_eventwait_for_handles)KeyPress)Keys)MouseButtonMouseEventType)INPUT_RECORDKEY_EVENT_RECORDMOUSE_EVENT_RECORDSTD_INPUT_HANDLE
EventTypes   )REVERSE_ANSI_SEQUENCES)Input)Vt100Parser)
Win32InputConsoleInputReaderraw_modecooked_modeattach_win32_inputdetach_win32_input   i   c                   @  s,   e Zd ZdZd
ddZeedddZd	S )_Win32InputBasez;
    Base class for `Win32Input` and `Win32PipeInput`.
    returnNonec                 C  s   t  | _d S N)_Win32Handleswin32_handlesself r4   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/prompt_toolkit/input/win32.py__init__B   s   z_Win32InputBase.__init__r   c                 C  s   d S r/   r4   r2   r4   r4   r5   handleE   s   z_Win32InputBase.handleNr-   r.   r-   r   )__name__
__module____qualname____doc__r6   propertyr   r7   r4   r4   r4   r5   r,   =   s    
r,   c                      s   e Zd ZdZd'd( fddZd)ddZd*ddZd+ddZd+ddZe	d,ddZ
d*ddZd*ddZd-ddZd.d d!Zd/d"d#Ze	d0d%d&Z  ZS )1r%   z<
    `Input` class that reads from the Windows console.
    NstdinTextIO | Noner-   r.   c                   s4   t    t | _|  | jrt | _d S t | _d S r/   )superr6   _is_win_vt100_input_enabled_use_virtual_terminal_inputVt100ConsoleInputReaderconsole_input_readerr&   )r3   r?   	__class__r4   r5   r6   P   s   
zWin32Input.__init__input_ready_callbackCallable[[], None]AbstractContextManager[None]c                 C  s
   t | |S )zj
        Return a context manager that makes this input active in the current
        event loop.
        )r)   )r3   rH   r4   r4   r5   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*   r2   r4   r4   r5   detachd   s   zWin32Input.detachlist[KeyPress]c                 C  s   t | j S r/   )listrE   readr2   r4   r4   r5   	read_keysk      zWin32Input.read_keysc                 C  s
   | j  S r/   )rE   
flush_keysr2   r4   r4   r5   rR   n   s   
zWin32Input.flush_keysboolc                 C     dS NFr4   r2   r4   r4   r5   closedq      zWin32Input.closedc                 C  s   t | jdS )N) use_win10_virtual_terminal_input)r'   rC   r2   r4   r4   r5   r'   u   s   zWin32Input.raw_modec                 C  s   t  S r/   )r(   r2   r4   r4   r5   r(   z   s   zWin32Input.cooked_modeintc                 C  s
   t j S r/   )sysr?   filenor2   r4   r4   r5   r[   }   s   
zWin32Input.filenostrc                 C  rT   )Nzwin32-inputr4   r2   r4   r4   r5   typeahead_hash   s   zWin32Input.typeahead_hashc                 C  s   | j   d S r/   )rE   closer2   r4   r4   r5   r^      rQ   zWin32Input.closer   c                 C  s   | j jS r/   )rE   r7   r2   r4   r4   r5   r7      s   zWin32Input.handler/   )r?   r@   r-   r.   )rH   rI   r-   rJ   )r-   rJ   r-   rM   r-   rS   )r-   rY   )r-   r\   r8   r9   )r:   r;   r<   r=   r6   rK   rL   rP   rR   r>   rV   r'   r(   r[   r]   r^   r7   __classcell__r4   r4   rF   r5   r%   K   s     

	






r%   c                   @  sH  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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%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j0d-ej1d.ej2d/ej3d0ej4d1ej5d2ej6d3ej7ej8ej9ej:ej;ej<d4Z=d5Z>d6Z?d7Z@d8ZAd9ZBdbdcd?d@ZCdddAdBZDdedDdEZEdfdGdHZFdgdKdLZGdhdRdSZHeIdidUdVZJeIdjdXdYZKdkd\d]ZLdld_d`ZMdaS )mr&   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   r!         r+   Trecognize_pasterS   r-   r.   c                 C  s\   d | _ || _|  tj rttjt	| _
d S tdtjtjB | _ tt| j | _
d S )NCONIN$)_fdconr   rZ   r?   isattyr   r
   kernel32GetStdHandler   r7   osopenO_RDWRO_BINARYmsvcrtget_osfhandle)r3   r   r4   r4   r5   r6      s   
zConsoleInputReader.__init__c                 C     | j durt| j  dS dS zClose fdcon.Nr   r   r^   r2   r4   r4   r5   r^         
zConsoleInputReader.closeIterable[KeyPress]c           	   	   #  sN   d}t d}t| }| }t jgddsdS tj jt||t| t 	||} fdd|D }t 
|} jr |rt|}|D ]Q}g }|rt|jtra|jtjtjhv r||j zt|}W n tyx   d}Y nw |rt|jtra|jtjtjhv sa|rttjd|V  |dur|V  qLdS |E dH  dS )
        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
           r   timeoutNc                   s   g | ]}  |qS r4   )_insert_key_data).0keyr2   r4   r5   
<listcomp>  s    z+ConsoleInputReader.read.<locals>.<listcomp> )r   r   r   r7   r
   r   ReadConsoleInputWr   rN   	_get_keys_merge_paired_surrogatesr   	_is_pasteiter
isinstancer   r   ControlJControlMappenddatanextStopIterationr   BracketedPastejoin)	r3   	max_countrO   arrtypeinput_recordsall_keysgenkr   r4   r2   r5   rO      sL   

zConsoleInputReader.readrM   c                 C  s   g S r/   r4   r2   r4   r4   r5   rR   -  rW   zConsoleInputReader.flush_keys	key_pressr   c                 C  s6   |j r|S t|jtrt|jd}nd}t|j|S )z@
        Insert KeyPress data, for vt100 compatibility.
        r   )r   r   r   r   r"   getr   )r3   r   r   r4   r4   r5   r   1  s   z#ConsoleInputReader._insert_key_datarO   r   r   Array[INPUT_RECORD]Iterator[KeyPress]c                 c  sv    t |jD ]2}|| }|jtv r8t|jt|j }t|tr+|jr+| 	|E dH  qt|t
r8| |E dH  qdS )R
        Generator that yields `KeyPress` objects from the input records.
        N)rangevalue	EventTyper    getattrEventr   r   KeyDown_event_to_key_pressesr   _handle_mouse)r3   rO   r   iirevr4   r4   r5   r   ?  s   

zConsoleInputReader._get_keyskey_pressesc                 c  s    d}| D ]K}t |jt }|od|j  kodkn  }|o+d|j  ko)dkn  }|rH|rC|j|j ddd}t||}n|V  d}|rM|}q|V  q|rX|V  dS dS )zm
        Combines consecutive KeyPresses with high and low surrogates into
        single characters
        Nu   u   u   u   z	utf-16-lesurrogatepass)r   r   r   encodedecoder   )r   buffered_high_surrogater   is_textis_high_surrogateis_low_surrogatefullcharr4   r4   r5   r   W  s*   

z+ConsoleInputReader._merge_paired_surrogateskeysc                 C  sJ   d}d}| D ]}t |jts|d7 }|jtjkr|d7 }q|dko$|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   r   r   r   )r   
text_countnewline_countr   r4   r4   r5   r   x  s   zConsoleInputReader._is_paster   r   c                 C  s  t |tr|js
J d}|j}|jj}|dd}|dkr-|j| jv r,t	| j|j d}n|| j
v rE| j
| tjkr<d}t	| j
| |}nt	||}|| j@ sT|| j@ r|| j@ r|rtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtj tj!i	}|"|j#|j#|_#|| j@ s|| j@ r|rtjtj$tjtj%tjtj&tjtj'tjtj(tjtj)tjtj*tj+tj,tjtj-tj tj.i
}|"|j#|j#|_#|| j@ r	|r	tj/tj0tjtj1tjtj2tjtj3tjtj4tjtj5tjtj6tjtj7tj+tj8tjtj9tj tj:i}|"|j#|j#|_#|| j@ s|| j@ r$|r$|j;dkr$t	tj<d}|| j@ s0|| j@ rB|rB|j#tjkrBt	tj=d|gS |rX|| j>@ }|rUt	tj=d|gS |gS g S )zU
        For this `KEY_EVENT_RECORD`, return a list of `KeyPress` instances.
        Nzutf-8r    r   
 )?r   r   r   ControlKeyStateuCharUnicodeCharr   VirtualKeyCodekeycodesr   mappingsr   r   LEFT_CTRL_PRESSEDRIGHT_CTRL_PRESSEDSHIFT_PRESSEDLeftControlShiftLeftRightControlShiftRightUpControlShiftUpDownControlShiftDownHomeControlShiftHomeEndControlShiftEndInsertControlShiftInsertPageUpControlShiftPageUpPageDownControlShiftPageDownr   r   ControlLeftControlRight	ControlUpControlDownControlHome
ControlEndControlInsertDeleteControlDeleteControlPageUpControlPageDownTabBackTab	ShiftLeft
ShiftRightShiftUp	ShiftDown	ShiftHomeShiftEndShiftInsertShiftDeleteShiftPageUpShiftPageDownr   ControlSpaceEscapeLEFT_ALT_PRESSED)r3   r   resultcontrol_key_stateu_char
ascii_charmappingmeta_pressedr4   r4   r5   r     s   

	

z(ConsoleInputReader._event_to_key_pressesr   c                 C  s   |j }|j}d}tj}|t@ r|dkrtj}ntj}n|tkr#tj	}n|t
kr*tj}|t@ r1tj}|du r@|dkr=tj}ntj}d|j|jt|jjt|jjg}ttj|gS )zK
        Handle mouse events. Return a list of KeyPress instances.
        Nr   ;)
EventFlagsButtonStater   NONEMOUSE_WHEELEDr   	SCROLL_UPSCROLL_DOWNFROM_LEFT_1ST_BUTTON_PRESSEDLEFTRIGHTMOST_BUTTON_PRESSEDRIGHTMOUSE_MOVED
MOUSE_MOVE
MOUSE_DOWNMOUSE_UPr   r   r\   MousePositionXYr   r   WindowsMouseEvent)r3   r   event_flagsbutton_state
event_typebuttonr   r4   r4   r5   r     s4   

z ConsoleInputReader._handle_mouseN)T)r   rS   r-   r.   r8   r-   r   r_   )r   r   r-   r   )rO   r   r   r   r-   r   )r   rM   r-   r   )r   rM   r-   rS   )r   r   r-   rM   )r   r   r-   rM   )Nr:   r;   r<   r=   r   r  r  ControlAControlBControlCControlDControlEControlFControlGControlHControlIr   ControlKControlLr   ControlNControlOControlPControlQControlRControlSControlTControlUControlVControlWControlXControlYControlZControlBackslashControlSquareCloseControlCircumflexControlUnderscore	Backspacer   r   r  r   r   r   r   r   r   r   r
  F1F2F3F4F5F6F7F8F9F10F11F12r   r  RIGHT_ALT_PRESSEDr   r   r   r6   r^   rO   rR   r   r   staticmethodr   r   r   r   r4   r4   r4   r5   r&      s    	
 !%	



>

 
 r&   c                   @  sB   e Zd ZdZdddZdddZdd	d
ZdddZdddZdS )rD   a  
    Similar to `ConsoleInputReader`, but for usage when
    `ENABLE_VIRTUAL_TERMINAL_INPUT` is enabled. This assumes that Windows sends
    us the right vt100 escape sequences and we parse those with our vt100
    parser.

    (Using this instead of `ConsoleInputReader` results in the "data" attribute
    from the `KeyPress` instances to be more correct in edge cases, because
    this responds to for instance the terminal being in application cursor keys
    mode.)
    r-   r.   c                   sn   d  _ g  _t fdd _  tj r!ttj	
t _d S tdtjtjB  _ tt j  _d S )Nc                   s    j | S r/   )_bufferr   )r   r2   r4   r5   <lambda>T  s    z2Vt100ConsoleInputReader.__init__.<locals>.<lambda>r   )r   rf  r$   _vt100_parserrZ   r?   r   r   r
   r   r   r   r7   r   r   r   r   r   r   r2   r4   r2   r5   r6   O  s   

z Vt100ConsoleInputReader.__init__c                 C  r   r   r   r2   r4   r4   r5   r^   `  r   zVt100ConsoleInputReader.closer   c                 C  sx   d}t d}t| }| }t| jgddsg S tj| jt||t| | ||D ]}| j	
| q+| j}g | _|S )r   r   r   r   )r   r   r   r7   r
   r   r   r   r   rh  feedrf  )r3   r   rO   r   r   key_datar  r4   r4   r5   rO   e  s   zVt100ConsoleInputReader.readrM   c                 C  s   | j   | j}g | _|S )zc
        Flush pending keys and return them.
        (Used for flushing the 'escape' key.)
        )rh  flushrf  )r3   r  r4   r4   r5   rR     s   
z"Vt100ConsoleInputReader.flush_keysrO   r   r   r   Iterator[str]c                 c  s`    t |jD ]'}|| }|jtv r-t|jt|j }t|tr-|jr-|j	j
}|dkr-|V  qdS )r   r   N)r   r   r   r    r   r   r   r   r   r   r   )r3   rO   r   r   r   r   r  r4   r4   r5   r     s   
z!Vt100ConsoleInputReader._get_keysNr8   r:  r_   )rO   r   r   r   r-   rl  )	r:   r;   r<   r=   r6   r^   rO   rR   r   r4   r4   r4   r5   rD   B  s    



%rD   c                   @  s.   e Zd ZdZdddZdd
dZdddZdS )r0   a  
    Utility to keep track of which handles are connectod to which callbacks.

    `add_win32_handle` starts a tiny event loop in another thread which waits
    for the Win32 handle to become ready. When this happens, the callback will
    be called in the current asyncio event loop using `call_soon_threadsafe`.

    `remove_win32_handle` will stop this tiny event loop.

    NOTE: We use this technique, so that we don't have to use the
          `ProactorEventLoop` on Windows and we can wait for things like stdin
          in a `SelectorEventLoop`. This is important, because our inputhook
          mechanism (used by IPython), only works with the `SelectorEventLoop`.
    r-   r.   c                 C  s   i | _ i | _d S r/   )_handle_callbacks_remove_eventsr2   r4   r4   r5   r6     s   
z_Win32Handles.__init__r7   r   callbackrI   c                   sv   j }|du rtd|  t  | j|< t | j|< d
 fddd
fddtd	 dS )z7
        Add a Win32 handle to the event loop.
        NInvalid handle.r-   r.   c                
     s(   z   W t d d S t d w )Nloopr   r4   )ro  rr  waitr4   r5   ready  s   z-_Win32Handles.add_win32_handle.<locals>.readyc                    s2   t  g} | u rtj d S  d S r/   )r   r
   r   CloseHandlecall_soon_threadsafe)r  )r7   rr  rt  remove_eventr4   r5   rs    s
   z,_Win32Handles.add_win32_handle.<locals>.waitrq  r8   )r   
ValueErrorremove_win32_handler   rm  r   rn  r   )r3   r7   ro  handle_valuer4   )ro  r7   rr  rt  rw  rs  r5   add_win32_handle  s   



z_Win32Handles.add_win32_handleCallable[[], None] | Nonec                 C  sf   |j du rdS z	| j|j }W n	 ty   Y nw tj| z| j|j W S  ty2   Y dS w )zt
        Remove a Win32 handle from the event loop.
        Return either the registered handler or `None`.
        N)r   rn  popKeyErrorr
   r   SetEventrm  )r3   r7   eventr4   r4   r5   ry    s   
z!_Win32Handles.remove_win32_handleNr8   )r7   r   ro  rI   r-   r.   )r7   r   r-   r|  )r:   r;   r<   r=   r6   r{  ry  r4   r4   r4   r5   r0     s
    

+r0   inputro  rI   r-   Iterator[None]c              
   c  s    | j }| j}|jdu rtd||}||| zdV  W || |r/||| dS dS || |r?||| w w )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.
    Nrp  r1   r7   r   rx  ry  r{  )r  ro  r1   r7   previous_callbackr4   r4   r5   r)     s"   




r)   c              
   c  s`    | j }| j}|jd u rtd||}zd V  W |r$||| d S d S |r/||| w w )Nrp  r  )r  r1   r7   r  r4   r4   r5   r*   %  s   

r*   c                   @  s<   e Zd ZdZ	ddd
dZdddZdddZd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`.
    NFr[   
int | NonerX   rS   r-   r.   c                 C  s   t tjt| _|| _d S r/   )r   r
   r   r   r   r7   rX   )r3   r[   rX   r4   r4   r5   r6   A  s   
zraw_mode.__init__c                 C  s,   t  }tj| jt| || _|   d S r/   )r   r
   r   GetConsoleModer7   r   original_mode_patch)r3   r  r4   r4   r5   	__enter__G  s   zraw_mode.__enter__c                 C  sD   d}d}d}| j j||B |B  @ }| jr|tO }tj| j| d S Nr+   r   r!   )r  r   rX   ENABLE_VIRTUAL_TERMINAL_INPUTr
   r   SetConsoleModer7   )r3   ENABLE_ECHO_INPUTENABLE_LINE_INPUTENABLE_PROCESSED_INPUTnew_moder4   r4   r5   r  O  s   
zraw_mode._patchaobjectc                 G  s   t j| j| j d S r/   )r
   r   r  r7   r  )r3   r  r4   r4   r5   __exit__^  s   zraw_mode.__exit__rU   )r[   r  rX   rS   r-   r.   r8   )r  r  r-   r.   )r:   r;   r<   r=   r6   r  r  r  r4   r4   r4   r5   r'   6  s    

r'   c                   @  s   e Zd ZdZdddZdS )r(   zx
    ::

        with cooked_mode(stdin):
            ''' The pseudo-terminal stdin is now used in cooked mode. '''
    r-   r.   c                 C  s0   d}d}d}t j| j| jj||B |B B  d S r  )r
   r   r  r7   r  r   )r3   r  r  r  r4   r4   r5   r  k  s   
zcooked_mode._patchNr8   )r:   r;   r<   r=   r  r4   r4   r4   r5   r(   c  s    r(   rS   c               
   C  sf   t tjt} td}tj| t| ztj| tt	}|dkW tj| | S tj| | w )z_
    Returns True when we're running Windows and VT100 escape sequences are
    supported.
    r   r!   )
r   r
   r   r   r   r   r  r   r  r  )hconsoler  r  r4   r4   r5   rB   x  s    rB   )r  r,   ro  rI   r-   r  )r  r,   r-   r  r`   )E
__future__r   r   rZ   abcr   asyncior   
contextlibr   r   utilsr   platformr   ctypesr
   collections.abcr   r   r   r   r   r   ctypes.wintypesr   r   typingr   prompt_toolkit.eventloopr   prompt_toolkit.eventloop.win32r   r   (prompt_toolkit.key_binding.key_processorr   prompt_toolkit.keysr   prompt_toolkit.mouse_eventsr   r   prompt_toolkit.win32_typesr   r   r   r   r    ansi_escape_sequencesr"   baser#   vt100_parserr$   __all__r*  r,  r.  r'  r  r,   r%   r&   rD   r0   r)   r*   r'   r(   rB   r4   r4   r4   r5   <module>   sZ    D   6nX-