o
    i{d                     @  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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l0m1Z1 ddl2m3Z3 g dZ4dZ5dZ6dZ7dZ8G dd de3Z9G dd de9Z:G dd dZ;G dd dZ<e	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DictIterableIteratorListOptional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 r5   U/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/prompt_toolkit/input/win32.py__init__F   s   z_Win32InputBase.__init__r   c                 C     d S r0   r5   r3   r5   r5   r6   handleI   s   z_Win32InputBase.handleNr.   r/   r.   r   )__name__
__module____qualname____doc__r7   propertyr   r9   r5   r5   r5   r6   r-   A   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 r0   )superr7   r'   console_input_reader)r4   rA   	__class__r5   r6   r7   T   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*   )r4   rG   r5   r5   r6   attachX      
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+   r3   r5   r5   r6   detach_   s   zWin32Input.detachlist[KeyPress]c                 C  s   t | j S r0   )listrD   readr3   r5   r5   r6   	read_keysf      zWin32Input.read_keysc                 C  r8   r0   r5   r3   r5   r5   r6   flushi      zWin32Input.flushboolc                 C     dS )NFr5   r3   r5   r5   r6   closedl   s   zWin32Input.closedc                 C     t  S r0   )r(   r3   r5   r5   r6   r(   p      zWin32Input.raw_modec                 C  rW   r0   )r)   r3   r5   r5   r6   r)   s   rX   zWin32Input.cooked_modeintc                 C  s
   t j S r0   )sysrA   filenor3   r5   r5   r6   r[   v   rK   zWin32Input.filenostrc                 C  rU   )Nzwin32-inputr5   r3   r5   r5   r6   typeahead_hash}   rS   zWin32Input.typeahead_hashc                 C  s   | j   d S r0   )rD   closer3   r5   r5   r6   r^      rQ   zWin32Input.closer   c                 C  s   | j jS r0   )rD   r9   r3   r5   r5   r6   r9      s   zWin32Input.handler0   )rA   rB   r.   r/   )rG   rH   r.   rI   )r.   rI   )r.   rM   r:   )r.   rT   )r.   rY   )r.   r\   r;   )r<   r=   r>   r?   r7   rJ   rL   rP   rR   r@   rV   r(   r)   r[   r]   r^   r9   __classcell__r5   r5   rE   r6   r&   O   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_pasterT   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   rZ   rA   isattyr   r	   kernel32GetStdHandler!   r9   osopenO_RDWRO_BINARYmsvcrtget_osfhandle)r4   r   r5   r5   r6   r7      s   
zConsoleInputReader.__init__c                 C  s   | j durt| j  dS dS )zClose fdcon.N)r   r   r^   r3   r5   r5   r6   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 r5   )_insert_key_data).0keyr3   r5   r6   
<listcomp>  s    z+ConsoleInputReader.read.<locals>.<listcomp> )r   r   r   r9   r	   r   ReadConsoleInputWr   rN   	_get_keys_merge_paired_surrogatesr   	_is_pasteiter
isinstancer   r   ControlJControlMappenddatanextStopIterationr   BracketedPastejoin)	r4   	max_countrO   arrtypeinput_recordsall_keysgenkr   r5   r3   r6   rO      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   )r4   r   r   r5   r5   r6   r   &  s   z#ConsoleInputReader._insert_key_datarO   r   r   Array[INPUT_RECORD]Iterator[KeyPress]c                 c  sz    t |jD ]4}|| }|jtv r:t|jt|j }t|tkr,|jr,| 	|E dH  qt|t
kr:| |E dH  qdS )zR
        Generator that yields `KeyPress` objects from the input records.
        N)rangevalue	EventTyper"   getattrEventtyper   KeyDown_event_to_key_pressesr    _handle_mouse)r4   rO   r   iirevr5   r5   r6   r   4  s   
zConsoleInputReader._get_keyskey_pressesrM   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fullcharr5   r5   r6   r   L  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   r5   r5   r6   r   m  s   zConsoleInputReader._is_paster   r   c                 C  s  t |tkr	|jsJ d}|j}|jj}|dd}|dkr.|j| jv r-t	| j|j d}n|| j
v rF| j
| tjkr=d}t	| j
| |}nt	||}|| j@ sU|| 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@ s1|| j@ rC|rC|j#tjkrCt	tj=d|gS |rY|| j>@ }|rVt	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)r4   r   resultcontrol_key_stateu_char
ascii_charmappingmeta_pressedr5   r5   r6   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)r4   r   event_flagsbutton_state
event_typebuttonr   r5   r5   r6   r     s4   

z ConsoleInputReader._handle_mouseN)T)r   rT   r.   r/   r:   )r.   r   )r   r   r.   r   )rO   r   r   r   r.   r   )r   rM   r.   r   )r   rM   r.   rT   )r   r   r.   rM   )r   r    r.   rM   )Mr<   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   r7   r^   rO   r   r   staticmethodr   r   r   r   r5   r5   r5   r6   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 )r1   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 r0   )_handle_callbacks_remove_eventsr3   r5   r5   r6   r7   G  s   
z_Win32Handles.__init__r9   r   callbackrH   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   r5   )r]  r`  waitr5   r6   readyb  s   z-_Win32Handles.add_win32_handle.<locals>.readyc                    s2   t  g} | u rtj d S  d S r0   )r   r	   r   CloseHandlecall_soon_threadsafe)r  )r9   r`  rb  remove_eventr5   r6   ra  l  s
   z,_Win32Handles.add_win32_handle.<locals>.waitr_  r:   )r   
ValueErrorremove_win32_handler   r[  r   r\  r   )r4   r9   r]  handle_valuer5   )r]  r9   r`  rb  re  ra  r6   add_win32_handleN  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   r\  popKeyErrorr	   r   SetEventr[  )r4   r9   eventr5   r5   r6   rg  y  s   
z!_Win32Handles.remove_win32_handleNr:   )r9   r   r]  rH   r.   r/   )r9   r   r.   rj  )r<   r=   r>   r?   r7   ri  rg  r5   r5   r5   r6   r1   7  s
    

+r1   inputr]  rH   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.
    Nr^  r2   r9   r   rf  rg  ri  )ro  r]  r2   r9   previous_callbackr5   r5   r6   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 )Nr^  rq  )ro  r2   r9   rr  r5   r5   r6   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`.
    Nr[   
int | Noner.   r/   c                 C  s   t tjt| _d S r0   )r   r	   r   r   r!   r9   )r4   r[   r5   r5   r6   r7     s   zraw_mode.__init__c                 C  s,   t  }tj| jt| || _|   d S r0   )r   r	   r   GetConsoleModer9   r   original_mode_patch)r4   ru  r5   r5   r6   	__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   SetConsoleModer9   ru  r   r4   ENABLE_ECHO_INPUTENABLE_LINE_INPUTENABLE_PROCESSED_INPUTr5   r5   r6   rv    s   zraw_mode._patchaobjectc                 G  s   t j| j| j d S r0   )r	   r   rz  r9   ru  )r4   r  r5   r5   r6   __exit__  s   zraw_mode.__exit__r0   )r[   rs  r.   r/   r:   )r  r  r.   r/   )r<   r=   r>   r?   r7   rw  rv  r  r5   r5   r5   r6   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 rx  ry  r{  r5   r5   r6   rv    s   
zcooked_mode._patchNr:   )r<   r=   r>   r?   rv  r5   r5   r5   r6   r)     s    r)   )ro  r-   r]  rH   r.   rp  )ro  r-   r.   rp  )A
__future__r   r   rZ   abcr   asyncior   
contextlibr   utilsr   platformr   ctypesr	   r
   r   ctypes.wintypesr   r   typingr   r   r   r   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'   r1   r*   r+   r(   r)   r5   r5   r5   r6   <module>   sP    (9   2X'