o
    w¨Êh)  ã                   @  s  U d dl mZ d dlZejdksJ ‚d dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlmZmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ g d¢ZG dd„ deƒZi Zded< ejddd„ƒZejddd„ƒZG dd„ dƒZG dd„ deƒZ dS ) é    )ÚannotationsNÚwin32)ÚAbstractEventLoopÚget_running_loop)ÚCallableÚContextManagerÚ	GeneratorÚTextIOé   )ÚKeyPressé   )ÚInput)ÚPosixStdinReader)ÚVt100Parser)Ú
Vt100InputÚraw_modeÚcooked_modec                   @  sˆ   e Zd ZU dZeƒ Zded< d$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#S )+r   zz
    Vt100 input for Posix systems.
    (This uses a posix file descriptor that can be registered in the event loop.)
    zset[int]Ú_fds_not_a_terminalÚstdinr	   ÚreturnÚNonec              
     sÐ   z|  ¡  W n tjy$ } zdtjv rt d¡|‚t d¡|‚d }~ww | ¡ }|  ¡ }|sI|tjvrId}tj 	|| ¡ tj 
¡  tj |¡ |ˆ _|  ¡ ˆ _g ˆ _tˆ j|jd�ˆ _t‡ fdd„ƒˆ _d S )Nzidlelib.runz<Stdin is not a terminal. Running from Idle is not supported.zStdin is not a terminal.z*Warning: Input is not a terminal (fd=%r).
)Úencodingc                   s   ˆ j  | ¡S ©N)Ú_bufferÚappend)Ú	key_press©Úself© úL/var/www/html/env/lib/python3.10/site-packages/prompt_toolkit/input/vt100.pyÚ<lambda>J   s    z%Vt100Input.__init__.<locals>.<lambda>)ÚfilenoÚioÚUnsupportedOperationÚsysÚmodulesÚisattyr   r   ÚstderrÚwriteÚflushÚaddr   Ú_filenor   r   r   Ústdin_readerr   Úvt100_parser)r   r   Úer&   ÚfdÚmsgr   r   r   Ú__init__$   s4   
ÿþ€ú



ÿzVt100Input.__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.
        )Ú_attached_input)r   r2   r   r   r   ÚattachM   s   
zVt100Input.attachc                 C  s   t | ƒS )z{
        Return a context manager that makes sure that this input is not active
        in the current event loop.
        )Ú_detached_inputr   r   r   r   ÚdetachT   s   zVt100Input.detachúlist[KeyPress]c                 C  s&   | j  ¡ }| j |¡ | j}g | _|S )zRead list of KeyPress.)r,   Úreadr-   Úfeedr   )r   ÚdataÚresultr   r   r   Ú	read_keys[   s
   
zVt100Input.read_keysc                 C  s   | j  ¡  | j}g | _|S )zc
        Flush pending keys and return them.
        (Used for flushing the 'escape' key.)
        )r-   r)   r   )r   r=   r   r   r   Ú
flush_keysh   s   
zVt100Input.flush_keysÚboolc                 C  s   | j jS r   )r,   Úclosedr   r   r   r   rA   v   s   zVt100Input.closedc                 C  ó   t | j ¡ ƒS r   )r   r   r!   r   r   r   r   r   z   ó   zVt100Input.raw_modec                 C  rB   r   )r   r   r!   r   r   r   r   r   }   rC   zVt100Input.cooked_modeÚintc                 C  s
   | j  ¡ S r   )r   r!   r   r   r   r   r!   €   s   
zVt100Input.filenoÚstrc                 C  s   d| j › �S )Nzfd-)r+   r   r   r   r   Útypeahead_hashƒ   s   zVt100Input.typeahead_hashN)r   r	   r   r   )r2   r3   r   r4   )r   r4   )r   r9   )r   r@   )r   rD   )r   rE   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úsetr   Ú__annotations__r1   r6   r8   r>   r?   ÚpropertyrA   r   r   r!   rF   r   r   r   r   r      s   
 

)





r   z>dict[tuple[AbstractEventLoop, int], Callable[[], None] | None]Ú_current_callbacksÚinputÚcallbackr3   r   úGenerator[None, None, None]c              
   #  sØ   � t ƒ ‰ˆ ¡ ‰t ˆˆf¡}d‡ ‡‡‡fdd„}zˆ ˆ|¡ W n	 ty*   t‚w ˆ tˆˆf< z dV  W ˆ ˆ¡ |rKˆ ˆ|¡ |tˆˆf< dS tˆˆf= dS ˆ ˆ¡ |rfˆ ˆ|¡ |tˆˆf< w tˆˆf= w )zÎ
    Context manager that makes this input active in the current event loop.

    :param input: :class:`~prompt_toolkit.input.Input` object.
    :param callback: Called when the input is ready to read.
    r   r   c                     s   ˆj rˆ ˆ¡ ˆ ƒ  dS )a:  Wrapper around the callback that already removes the reader when
        the input is closed. Otherwise, we keep continuously calling this
        callback, until we leave the context manager (which can happen a bit
        later). This fixes issues when piping /dev/null into a prompt_toolkit
        application.N)rA   Úremove_readerr   ©rP   r/   rO   Úloopr   r   Úcallback_wrapperš   s   

z)_attached_input.<locals>.callback_wrapperN©r   r   )r   r!   rN   ÚgetÚ
add_readerÚPermissionErrorÚEOFErrorrR   )rO   rP   ÚpreviousrU   r   rS   r   r5   Œ   s.   €

ø


úr5   c              
   c  s„   � t ƒ }|  ¡ }t ||f¡}|r| |¡ d t||f< zd V  W |r1| ||¡ |t||f< d S d S |rA| ||¡ |t||f< w r   )r   r!   rN   rW   rR   rX   )rO   rT   r/   r[   r   r   r   r7   ¾   s   €
þr7   c                   @  sJ   e Zd ZdZddd„Zddd	„Zeddd„ƒZeddd„ƒZddd„Z	dS )r   z©
    ::

        with raw_mode(stdin):
            ''' the pseudo-terminal stdin is now used in raw mode '''

    We ignore errors when executing `tcgetattr` fails.
    r!   rD   r   r   c                 C  s:   || _ |  z	t |¡| _W d S  tjy   d | _Y d S w r   )r!   ÚtermiosÚ	tcgetattrÚattrs_beforeÚerror)r   r!   r   r   r   r1   è   s   þzraw_mode.__init__c                 C  sz   zt  | j¡}W n t jy   Y d S w |  |tj ¡|tj< |  |tj ¡|tj< d|tj	 t j
< t  | jt j|¡ d S )Nr   )r\   r]   r!   r_   Ú_patch_lflagÚttyÚLFLAGÚ_patch_iflagÚIFLAGÚCCÚVMINÚ	tcsetattrÚTCSANOW)r   Únewattrr   r   r   Ú	__enter__ñ   s   ÿzraw_mode.__enter__Úattrsc                 C  s   |t jt jB t jB t jB  @ S r   ©r\   ÚECHOÚICANONÚIEXTENÚISIG©Úclsrk   r   r   r   r`     s   zraw_mode._patch_lflagc                 C  s$   |t jt jB t jB t jB t jB  @ S r   )r\   ÚIXONÚIXOFFÚICRNLÚINLCRÚIGNCRrq   r   r   r   rc     s   ÿüûúüzraw_mode._patch_iflagÚaÚobjectc                 G  s@   | j d urzt | jtj| j ¡ W d S  tjy   Y d S w d S r   )r^   r\   rg   r!   rh   r_   )r   rx   r   r   r   Ú__exit__  s   
ÿýzraw_mode.__exit__N)r!   rD   r   r   rV   ©rk   rD   r   rD   )rx   ry   r   r   )
rG   rH   rI   rJ   r1   rj   Úclassmethodr`   rc   rz   r   r   r   r   r   Ð   s    

	r   c                   @  s,   e Zd ZdZed
dd„ƒZed
dd„ƒZd	S )r   zú
    The opposite of ``raw_mode``, used when we need cooked mode inside a
    `raw_mode` block.  Used in `Application.run_in_terminal`.::

        with cooked_mode(stdin):
            ''' the pseudo-terminal stdin is now used in cooked mode. '''
    rk   rD   r   c                 C  s   |t jt jB t jB t jB B S r   rl   rq   r   r   r   r`   +  s   zcooked_mode._patch_lflagc                 C  s
   |t jB S r   )r\   ru   rq   r   r   r   rc   /  s   
zcooked_mode._patch_iflagNr{   )rG   rH   rI   rJ   r|   r`   rc   r   r   r   r   r   "  s    r   )rO   r   rP   r3   r   rQ   )rO   r   r   rQ   )!Ú
__future__r   r$   ÚplatformÚ
contextlibr"   r\   ra   Úasyncior   r   Útypingr   r   r   r	   Úkey_bindingr   Úbaser   Úposix_utilsr   r-   r   Ú__all__r   rN   rL   Úcontextmanagerr5   r7   r   r   r   r   r   r   Ú<module>   s.    o
þ1R