o
    h1x                     @  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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l0m1Z1 ddl2m3Z3 g dZ4dZ5dZ6dZ7dZ8dZ9G dd de1Z:G dd de:Z;G dd dZ<G d d! d!Z=G d"d# d#Z>e	d4d)d*Z?e	d5d+d,Z@G d-d. d.ZAG d/d0 d0eAZBd6d2d3ZCdS )7    )annotationsN)abstractmethod)get_running_loop)contextmanager   )SPHINX_AUTODOC_RUNNINGwin32)windll)Arraybyref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)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   \/var/www/html/optinet_system/venv/lib/python3.10/site-packages/prompt_toolkit/input/win32.py__init__A   s   z_Win32InputBase.__init__r   c                 C     d S r/   r4   r2   r4   r4   r5   handleD   s   z_Win32InputBase.handleNr-   r.   r-   r   )__name__
__module____qualname____doc__r6   propertyr   r8   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   O   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)   )r3   rI   r4   r4   r5   attachZ      
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   detacha   s   zWin32Input.detachlist[KeyPress]c                 C  s   t | j S r/   )listrF   readr2   r4   r4   r5   	read_keysh      zWin32Input.read_keysc                 C  r7   r/   r4   r2   r4   r4   r5   flushk      zWin32Input.flushboolc                 C     dS NFr4   r2   r4   r4   r5   closedn   s   zWin32Input.closedc                 C  s   t | jdS )N) use_win10_virtual_terminal_input)r'   rD   r2   r4   r4   r5   r'   r   s   zWin32Input.raw_modec                 C  s   t  S r/   )r(   r2   r4   r4   r5   r(   w   s   zWin32Input.cooked_modeintc                 C  s
   t j S r/   )sysr@   filenor2   r4   r4   r5   r]   z   rM   zWin32Input.filenostrc                 C  rW   )Nzwin32-inputr4   r2   r4   r4   r5   typeahead_hash   rU   zWin32Input.typeahead_hashc                 C  s   | j   d S r/   )rF   closer2   r4   r4   r5   r`      rS   zWin32Input.closer   c                 C  s   | j jS r/   )rF   r8   r2   r4   r4   r5   r8      s   zWin32Input.handler/   )r@   rA   r-   r.   )rI   rJ   r-   rK   )r-   rK   )r-   rO   r9   r-   rV   )r-   r[   )r-   r^   r:   )r;   r<   r=   r>   r6   rL   rN   rR   rT   r?   rY   r'   r(   r]   r_   r`   r8   __classcell__r4   r4   rG   r5   r%   J   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_pasterV   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   r\   r@   isattyr   r	   kernel32GetStdHandler   r8   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   r8   r	   r   ReadConsoleInputWr   rP   	_get_keys_merge_paired_surrogatesr   	_is_pasteiter
isinstancer   r   ControlJControlMappenddatanextStopIterationr   BracketedPastejoin)	r3   	max_countrQ   arrtypeinput_recordsall_keysgenkr   r4   r2   r5   rQ      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   )r3   r   r   r4   r4   r5   r   *  s   z#ConsoleInputReader._insert_key_datarQ   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   rQ   r   iirevr4   r4   r5   r   8  s   

zConsoleInputReader._get_keyskey_pressesrO   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fullcharr4   r4   r5   r   P  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   q  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   rV   r-   r.   r9   r-   r   )r   r   r-   r   )rQ   r   r   r   r-   r   )r   rO   r-   r   )r   rO   r-   rV   )r   r   r-   rO   )r   r   r-   rO   )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   r6   r`   rQ   r   r   staticmethodr   r   r   r   r4   r4   r4   r5   r&      s    	
 !%	



>
 
 r&   c                   @  s8   e Zd ZdZdddZdddZdd	d
ZdddZdS )rE   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>M  s    z2Vt100ConsoleInputReader.__init__.<locals>.<lambda>r   )r   rg  r$   _vt100_parserr\   r@   r   r   r	   r   r   r   r8   r   r   r   r   r   r   r2   r4   r2   r5   r6   H  s   

z Vt100ConsoleInputReader.__init__c                 C  r   r   r   r2   r4   r4   r5   r`   Y  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   r8   r	   r   r   r   r   ri  feedrg  )r3   r   rQ   r   r   key_datar  r4   r4   r5   rQ   ^  s   zVt100ConsoleInputReader.readrQ   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   rQ   r   r   r   r   r   r4   r4   r5   r     s   
z!Vt100ConsoleInputReader._get_keysNr9   r;  )rQ   r   r   r   r-   rl  )r;   r<   r=   r>   r6   r`   rQ   r   r4   r4   r4   r5   rE   ;  s    


%rE   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__r8   r   callbackrJ   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  )r8   rr  rt  remove_eventr4   r5   rs    s
   z,_Win32Handles.add_win32_handle.<locals>.waitrq  r9   )r   
ValueErrorremove_win32_handler   rm  r   rn  r   )r3   r8   ro  handle_valuer4   )ro  r8   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   r8   eventr4   r4   r5   ry    s   
z!_Win32Handles.remove_win32_handleNr9   )r8   r   ro  rJ   r-   r.   )r8   r   r-   r|  )r;   r<   r=   r>   r6   r{  ry  r4   r4   r4   r5   r0     s
    

+r0   inputro  rJ   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   r8   r   rx  ry  r{  )r  ro  r1   r8   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   r8   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 | NonerZ   rV   r-   r.   c                 C  s   t tjt| _|| _d S r/   )r   r	   r   r   r   r8   rZ   )r3   r]   rZ   r4   r4   r5   r6   ,  s   
zraw_mode.__init__c                 C  s,   t  }tj| jt| || _|   d S r/   )r   r	   r   GetConsoleModer8   r   original_mode_patch)r3   r  r4   r4   r5   	__enter__2  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   rZ   ENABLE_VIRTUAL_TERMINAL_INPUTr	   r   SetConsoleModer8   )r3   ENABLE_ECHO_INPUTENABLE_LINE_INPUTENABLE_PROCESSED_INPUTnew_moder4   r4   r5   r  :  s   
zraw_mode._patchaobjectc                 G  s   t j| j| j d S r/   )r	   r   r  r8   r  )r3   r  r4   r4   r5   __exit__I  s   zraw_mode.__exit__rX   )r]   r  rZ   rV   r-   r.   r9   )r  r  r-   r.   )r;   r<   r=   r>   r6   r  r  r  r4   r4   r4   r5   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 r  )r	   r   r  r8   r  r   )r3   r  r  r  r4   r4   r5   r  V  s   
zcooked_mode._patchNr9   )r;   r<   r=   r>   r  r4   r4   r4   r5   r(   N  s    r(   rV   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   rC   c  s    rC   )r  r,   ro  rJ   r-   r  )r  r,   r-   r  ra   )D
__future__r   r   r\   abcr   asyncior   
contextlibr   utilsr   platformr   ctypesr	   r
   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#   vt100_parserr$   __all__r+  r-  r/  r(  r  r,   r%   r&   rE   r0   r)   r*   r'   r(   rC   r4   r4   r4   r5   <module>   sX    B   2`X-