a
    lcyd                     @   s  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sNJ e	sfd 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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e6eg df ed dd d!Z:ee6ed d"d#d$Z;G d%d& d&Z<G d'd( d(e<Z=dS ))    N)abstractmethod)contextmanager)get_event_loop   )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                   @   s4   e Zd ZdZddddZeeedddZdS )_Win32InputBasez;
    Base class for `Win32Input` and `Win32PipeInput`.
    Nreturnc                 C   s   t  | _d S N)_Win32Handleswin32_handlesself r4   V/var/www/html/django/DPS/env/lib/python3.9/site-packages/prompt_toolkit/input/win32.py__init__E   s    z_Win32InputBase.__init__c                 C   s   d S r/   r4   r2   r4   r4   r5   handleH   s    z_Win32InputBase.handle)	__name__
__module____qualname____doc__r6   propertyr   r   r7   r4   r4   r4   r5   r,   @   s
   r,   c                       s   e Zd ZdZdee dd fddZeg df ed dddZ	ed d	d
dZ
ee d	ddZdd	ddZeed	ddZed d	ddZed d	ddZed	ddZed	ddZdd	ddZeed	ddZ  ZS )r%   z<
    `Input` class that reads from the Windows console.
    N)stdinr.   c                    s   t    t | _d S r/   )superr6   r&   console_input_reader)r3   r=   	__class__r4   r5   r6   S   s    
zWin32Input.__init__)input_ready_callbackr.   c                 C   s
   t | |S )zj
        Return a context manager that makes this input active in the current
        event loop.
        )r)   )r3   rB   r4   r4   r5   attachW   s    zWin32Input.attachr-   c                 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   detach^   s    zWin32Input.detachc                 C   s   t | j S r/   )listr?   readr2   r4   r4   r5   	read_keyse   s    zWin32Input.read_keysc                 C   s   d S r/   r4   r2   r4   r4   r5   flushh   s    zWin32Input.flushc                 C   s   dS )NFr4   r2   r4   r4   r5   closedk   s    zWin32Input.closedc                 C   s   t  S r/   )r'   r2   r4   r4   r5   r'   o   s    zWin32Input.raw_modec                 C   s   t  S r/   )r(   r2   r4   r4   r5   r(   r   s    zWin32Input.cooked_modec                 C   s
   t j S r/   )sysr=   filenor2   r4   r4   r5   rK   u   s    zWin32Input.filenoc                 C   s   dS )Nzwin32-inputr4   r2   r4   r4   r5   typeahead_hash|   s    zWin32Input.typeahead_hashc                 C   s   | j   d S r/   )r?   closer2   r4   r4   r5   rM      s    zWin32Input.closec                 C   s   | j jS r/   )r?   r7   r2   r4   r4   r5   r7      s    zWin32Input.handle)N)r8   r9   r:   r;   r   r   r6   r   r   rC   rD   r   r   rG   rH   r<   boolrI   r'   r(   intrK   strrL   rM   r   r7   __classcell__r4   r4   r@   r5   r%   N   s   r%   c                "   @   s  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%eCd
dddZDd
dddZEeFeG dddZHeGeGdddZIeJdeKeG dddZLeMeNeG eKeG dddZOeMeNeG eCdddZPeQeNeG d d!d"ZReSeNeG d d#d$ZTd
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   r"         r+   TN)recognize_paster.   c                 C   sZ   d | _ || _|  tj r.ttjt	| _
n(tdtjtjB | _ tt| j | _
d S )NzCONIN$)_fdconr   rJ   r=   isattyr   r   kernel32GetStdHandler    r7   osopenO_RDWRO_BINARYmsvcrtZget_osfhandle)r3   r   r4   r4   r5   r6      s    
zConsoleInputReader.__init__r-   c                 C   s   | j durt| j  dS )zClose fdcon.N)r   r   rM   r2   r4   r4   r5   rM      s    
zConsoleInputReader.closec           	   	   #   s0  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" |r"t|}|D ]}g }|rt|jtr|jtjtjhv r||j zt|}W q ty   d}Y q0 q|rttjd|V  |dur|V  qn
|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 r4   )_insert_key_data).0keyr2   r4   r5   
<listcomp>      z+ConsoleInputReader.read.<locals>.<listcomp> )r   r   r   r7   r   r   ZReadConsoleInputWr
   rE   	_get_keys_merge_paired_surrogatesr   	_is_pasteiter
isinstancer   r   ControlJControlMappenddatanextStopIterationr   ZBracketedPastejoin)	r3   	max_countrF   Zarrtypeinput_recordsall_keysgenkr   r4   r2   r5   rF      s>    

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_datazArray[INPUT_RECORD])rF   r   r.   c                 c   sx   t |jD ]h}|| }|jtv r
t|jt|j }t|tkrV|jrV| 	|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valueZ	EventTyper!   getattrEventtyper   KeyDown_event_to_key_pressesr   _handle_mouse)r3   rF   r   iZirevr4   r4   r5   r   3  s    
zConsoleInputReader._get_keys)key_pressesr.   c                 c   s   d}| D ]}t |jt }|o6d|j  ko2dkn  }|oTd|j  koPdkn  }|r|r|j|j ddd}t||}n|V  d}|r|}q|V  q|r|V  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   Zbuffered_high_surrogater   Zis_textZis_high_surrogateZis_low_surrogateZfullcharr4   r4   r5   r   K  s*    z+ConsoleInputReader._merge_paired_surrogates)keysr.   c                 C   sJ   d}d}| D ],}t |jts$|d7 }|jtjkr|d7 }q|dkoH|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   Z
text_countZnewline_countr   r4   r4   r5   r   l  s    
zConsoleInputReader._is_paste)r   r.   c                 C   s  t |tkr|jsJ d}|j}|jj}|dd}|dkr\|j| jv rt	| j|j d}n:|| j
v r| j
| tjkrzd}t	| j
| |}n
t	||}|| j@ s|| j@ r|| j@ r|r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@ s4|| 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@ s8|| j@ rV|rV|j;dkrVt	tj<d}|| j@ sn|| j@ r|r|j#tjkrt	tj=d|gS |r|| 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-8r    r   
 )?r   r   r   ZControlKeyStateZuCharZUnicodeCharr   ZVirtualKeyCodekeycodesr   mappingsr   r   LEFT_CTRL_PRESSEDRIGHT_CTRL_PRESSEDSHIFT_PRESSEDLeftZControlShiftLeftRightZControlShiftRightUpZControlShiftUpDownZControlShiftDownHomeZControlShiftHomeEndZControlShiftEndInsertZControlShiftInsertPageUpZControlShiftPageUpPageDownZControlShiftPageDownr   r   ZControlLeftZControlRightZ	ControlUpZControlDownZControlHomeZ
ControlEndZControlInsertDeleteZControlDeleteZControlPageUpZControlPageDownZTabZBackTabZ	ShiftLeftZ
ShiftRightZShiftUpZ	ShiftDownZ	ShiftHomeZShiftEndZShiftInsertZShiftDeleteZShiftPageUpZShiftPageDownr   ControlSpaceEscapeLEFT_ALT_PRESSED)r3   r   resultZcontrol_key_stateZu_charZ
ascii_charmappingZmeta_pressedr4   r4   r5   r     s    

	


z(ConsoleInputReader._event_to_key_pressesc                 C   s   |j }|j}d}tj}|t@ r6|dkr.tj}qTtj}n|tkrFtj	}n|t
krTtj}|t@ rbtj}|du r|dkrzt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   ;)Z
EventFlagsZButtonStater   NONEMOUSE_WHEELEDr   Z	SCROLL_UPZSCROLL_DOWNFROM_LEFT_1ST_BUTTON_PRESSEDLEFTRIGHTMOST_BUTTON_PRESSEDRIGHTMOUSE_MOVEDZ
MOUSE_MOVEZ
MOUSE_DOWNZMOUSE_UPr   r   rP   ZMousePositionXYr   r   ZWindowsMouseEvent)r3   r   Zevent_flagsZbutton_stateZ
event_typeZbuttonr   r4   r4   r5   r     s4    

z ConsoleInputReader._handle_mouse)T)Ur8   r9   r:   r;   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   r   r   r   r   r   r   r   r   r   r   ZF1ZF2ZF3ZF4ZF5ZF6ZF7ZF8ZF9ZF10ZF11ZF12r   r   ZRIGHT_ALT_PRESSEDr   r   r   rN   r6   rM   r   r   rF   r   r   r   r   staticmethodr   r   r   r   r   r   r   r4   r4   r4   r5   r&      s   '>  r&   c                   @   sT   e Zd ZdZddddZeeg df ddddZeeeg df  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`.
    Nr-   c                 C   s   i | _ i | _d S r/   )_handle_callbacks_remove_eventsr2   r4   r4   r5   r6   F  s    z_Win32Handles.__init__)r7   callbackr.   c                    s~   j }|du rtd|  t  | j|< t | j|< dd fddddfddtd dS )	z7
        Add a Win32 handle to the event loop.
        NInvalid handle.r-   c                
      s*   z   W t d nt d 0 d S )Nloopr   r4   )r   r   waitr4   r5   readya  s    z-_Win32Handles.add_win32_handle.<locals>.readyc                     s2   t  g} | u r$tj d S  d S r/   )r   r   r   ZCloseHandlecall_soon_threadsafe)r   )r7   r   r   remove_eventr4   r5   r   k  s
    z,_Win32Handles.add_win32_handle.<locals>.waitr   )r   
ValueErrorremove_win32_handler   r   r   r   r   )r3   r7   r   Zhandle_valuer4   )r   r7   r   r   r   r   r5   add_win32_handleM  s    



z_Win32Handles.add_win32_handle)r7   r.   c                 C   sj   |j du rdS z| j|j }W n ty2   Y n0 tj| z| j|j W S  tyd   Y dS 0 dS )zt
        Remove a Win32 handle from the event loop.
        Return either the registered handler or `None`.
        N)r   r   popKeyErrorr   r   ZSetEventr   )r3   r7   eventr4   r4   r5   r   x  s    
z!_Win32Handles.remove_win32_handle)
r8   r9   r:   r;   r6   r   r   r   r   r   r4   r4   r4   r5   r0   6  s   +r0   )inputr   r.   c              
   c   sz   | j }| j}|jdu rtd||}||| z$dV  W || |rv||| n|| |rt||| 0 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.
    Nr   r1   r7   r   r   r   r   )r   r   r1   r7   previous_callbackr4   r4   r5   r)     s    




r)   )r   r.   c              
   c   sZ   | j }| j}|jd u rtd||}zd V  W |rV||| n|rT||| 0 d S )Nr   r   )r   r1   r7   r   r4   r4   r5   r*     s    

r*   c                   @   sR   e Zd ZdZdee ddddZddddZddd	d
Ze	d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`.
    N)rK   r.   c                 C   s   t tjt| _d S r/   )r   r   r   r   r    r7   )r3   rK   r4   r4   r5   r6     s    zraw_mode.__init__r-   c                 C   s,   t  }tj| jt| || _|   d S r/   )r   r   r   ZGetConsoleModer7   r
   original_mode_patch)r3   r   r4   r4   r5   	__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   SetConsoleModer7   r   r   r3   ZENABLE_ECHO_INPUTZENABLE_LINE_INPUTZENABLE_PROCESSED_INPUTr4   r4   r5   r     s    zraw_mode._patch)ar.   c                 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__)N)r8   r9   r:   r;   r   rO   r6   r   r   objectr   r4   r4   r4   r5   r'     s
   
r'   c                   @   s   e Zd ZdZddddZdS )r(   zx
    ::

        with cooked_mode(stdin):
            ''' The pseudo-terminal stdin is now used in cooked mode. '''
    Nr-   c                 C   s0   d}d}d}t j| j| jj||B |B B  d S r   r   r   r4   r4   r5   r     s    
zcooked_mode._patch)r8   r9   r:   r;   r   r4   r4   r4   r5   r(     s   r(   )>r   rJ   abcr   
contextlibr   Zprompt_toolkit.eventloopr   utilsr   platformr   ctypesr   r	   r
   Zctypes.wintypesr   r   typingr   r   r   r   r   r   r   r   r   Zprompt_toolkit.eventloop.win32r   r   Z(prompt_toolkit.key_binding.key_processorr   Zprompt_toolkit.keysr   Zprompt_toolkit.mouse_eventsr   r   Zprompt_toolkit.win32_typesr   r   r   r    r!   Zansi_escape_sequencesr#   baser$   __all__r   r   r   r   r,   r%   r&   r0   r)   r*   r'   r(   r4   r4   r4   r5   <module>   sP   (9   2X'