o
    DfLd                     @  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	 ddl
mZ ejdks-J es9d dlZd d	lmZ d d
lmZ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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-m.Z. ddl/m0Z0 g dZ1dZ2dZ3dZ4dZ5G dd de0Z6G dd de6Z7G dd dZ8G dd dZ9e	d-d%d&Z:e	d.d'd(Z;G d)d* d*Z<G d+d, d,e<Z=dS )/    )annotationsN)abstractmethod)get_running_loop)contextmanager   )SPHINX_AUTODOC_RUNNINGwin32)windll)Arraypointer)DWORDHANDLE)CallableContextManagerIterableIterator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)
Win32InputConsoleInputReaderraw_modecooked_modeattach_win32_inputdetach_win32_input   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 r2   S/home/ubuntu/webapp/venv/lib/python3.10/site-packages/prompt_toolkit/input/win32.py__init__=   s   z_Win32InputBase.__init__r   c                 C     d S r-   r2   r0   r2   r2   r3   handle@   s   z_Win32InputBase.handleNr+   r,   r+   r   )__name__
__module____qualname____doc__r4   propertyr   r6   r2   r2   r2   r3   r*   8   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                   s   t    t | _d S r-   )superr4   r$   console_input_reader)r1   r>   	__class__r2   r3   r4   K   s   
zWin32Input.__init__input_ready_callbackCallable[[], None]ContextManager[None]c                 C  s
   t | |S )zj
        Return a context manager that makes this input active in the current
        event loop.
        )r'   )r1   rD   r2   r2   r3   attachO      
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(   r0   r2   r2   r3   detachV   s   zWin32Input.detachlist[KeyPress]c                 C  s   t | j S r-   )listrA   readr0   r2   r2   r3   	read_keys]      zWin32Input.read_keysc                 C  r5   r-   r2   r0   r2   r2   r3   flush`      zWin32Input.flushboolc                 C     dS )NFr2   r0   r2   r2   r3   closedc   s   zWin32Input.closedc                 C     t  S r-   )r%   r0   r2   r2   r3   r%   g      zWin32Input.raw_modec                 C  rT   r-   )r&   r0   r2   r2   r3   r&   j   rU   zWin32Input.cooked_modeintc                 C  s
   t j S r-   )sysr>   filenor0   r2   r2   r3   rX   m   rH   zWin32Input.filenostrc                 C  rR   )Nzwin32-inputr2   r0   r2   r2   r3   typeahead_hasht   rP   zWin32Input.typeahead_hashc                 C  s   | j   d S r-   )rA   closer0   r2   r2   r3   r[   w   rN   zWin32Input.closer   c                 C  s   | j jS r-   )rA   r6   r0   r2   r2   r3   r6   z   s   zWin32Input.handler-   )r>   r?   r+   r,   )rD   rE   r+   rF   )r+   rF   )r+   rJ   r7   )r+   rQ   )r+   rV   )r+   rY   r8   )r9   r:   r;   r<   r4   rG   rI   rM   rO   r=   rS   r%   r&   rX   rZ   r[   r6   __classcell__r2   r2   rB   r3   r#   F   s     








r#   c                   @  s>  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@d8ZAd9ZBd`dad?d@ZCdbdAdBZDdcdDdEZEdddHdIZFdedOdPZGeHdfdSdTZIeHdgdVdWZJdhdZd[ZKdid]d^ZLd_S )jr$   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_pasterQ   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 )NzCONIN$)_fdconr   rW   r>   isattyr   r	   kernel32GetStdHandler   r6   osopenO_RDWRO_BINARYmsvcrtget_osfhandle)r1   r   r2   r2   r3   r4      s   
zConsoleInputReader.__init__c                 C  s   | j durt| j  dS dS )zClose fdcon.N)r   r   r[   r0   r2   r2   r3   r[      s   
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 )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   )timeoutNc                   s   g | ]}  |qS r2   )_insert_key_data).0keyr0   r2   r3   
<listcomp>   s    z+ConsoleInputReader.read.<locals>.<listcomp> )r   r   r   r6   r	   r   ReadConsoleInputWr   rK   	_get_keys_merge_paired_surrogatesr   	_is_pasteiter
isinstancer   r   ControlJControlMappenddatanextStopIterationr   BracketedPastejoin)	r1   	max_countrL   arrtypeinput_recordsall_keysgenkr   r2   r0   r3   rL      sL   

zConsoleInputReader.read	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   )r1   r   r   r2   r2   r3   r     s   z#ConsoleInputReader._insert_key_datarL   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 )zR
        Generator that yields `KeyPress` objects from the input records.
        N)rangevalue	EventTyper   getattrEventr   r   KeyDown_event_to_key_pressesr   _handle_mouse)r1   rL   r   iirevr2   r2   r3   r   +  s   

zConsoleInputReader._get_keyskey_pressesrJ   c                 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fullcharr2   r2   r3   r   C  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   r2   r2   r3   r   d  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)r1   r   resultcontrol_key_stateu_char
ascii_charmappingmeta_pressedr2   r2   r3   r   z  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   rY   MousePositionXYr   r   WindowsMouseEvent)r1   r   event_flagsbutton_state
event_typebuttonr   r2   r2   r3   r     s4   

z ConsoleInputReader._handle_mouseN)T)r   rQ   r+   r,   r7   )r+   r   )r   r   r+   r   )rL   r   r   r   r+   r   )r   rJ   r+   r   )r   rJ   r+   rQ   )r   r   r+   rJ   )r   r   r+   rJ   )Mr9   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   r4   r[   rL   r   r   staticmethodr   r   r   r   r2   r2   r2   r3   r$      s    	
 !%	



>
 
 r$   c                   @  s.   e Zd ZdZdddZdd
dZdddZdS )r.   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_eventsr0   r2   r2   r3   r4   >  s   
z_Win32Handles.__init__r6   r   callbackrE   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   r2   )rY  r\  waitr2   r3   readyY  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  )r6   r\  r^  remove_eventr2   r3   r]  c  s
   z,_Win32Handles.add_win32_handle.<locals>.waitr[  r7   )r   
ValueErrorremove_win32_handler   rW  r   rX  r   )r1   r6   rY  handle_valuer2   )rY  r6   r\  r^  ra  r]  r3   add_win32_handleE  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   rX  popKeyErrorr	   r   SetEventrW  )r1   r6   eventr2   r2   r3   rc  p  s   
z!_Win32Handles.remove_win32_handleNr7   )r6   r   rY  rE   r+   r,   )r6   r   r+   rf  )r9   r:   r;   r<   r4   re  rc  r2   r2   r2   r3   r.   .  s
    

+r.   inputrY  rE   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.
    NrZ  r/   r6   r   rb  rc  re  )rk  rY  r/   r6   previous_callbackr2   r2   r3   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 )NrZ  rm  )rk  r/   r6   rn  r2   r2   r3   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`.
    NrX   
int | Noner+   r,   c                 C  s   t tjt| _d S r-   )r   r	   r   r   r   r6   )r1   rX   r2   r2   r3   r4     s   zraw_mode.__init__c                 C  s,   t  }tj| jt| || _|   d S r-   )r   r	   r   GetConsoleModer6   r   original_mode_patch)r1   rq  r2   r2   r3   	__enter__  s   zraw_mode.__enter__c                 C  s2   d}d}d}t j| j| jj||B |B  @  d S Nr)   r   r    r	   r   SetConsoleModer6   rq  r   r1   ENABLE_ECHO_INPUTENABLE_LINE_INPUTENABLE_PROCESSED_INPUTr2   r2   r3   rr    s   zraw_mode._patchaobjectc                 G  s   t j| j| j d S r-   )r	   r   rv  r6   rq  )r1   r{  r2   r2   r3   __exit__  s   zraw_mode.__exit__r-   )rX   ro  r+   r,   r7   )r{  r|  r+   r,   )r9   r:   r;   r<   r4   rs  rr  r}  r2   r2   r2   r3   r%     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 rt  ru  rw  r2   r2   r3   rr    s   
zcooked_mode._patchNr7   )r9   r:   r;   r<   rr  r2   r2   r2   r3   r&     s    r&   )rk  r*   rY  rE   r+   rl  )rk  r*   r+   rl  )>
__future__r   r   rW   abcr   asyncior   
contextlibr   utilsr   platformr   ctypesr	   r
   r   ctypes.wintypesr   r   typingr   r   r   r   r   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"   __all__r  r  r   r  r*   r#   r$   r.   r'   r(   r%   r&   r2   r2   r2   r3   <module>   sP    9   2X'