
    e/                        d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
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 ddlmZ ddlmZmZmZ dZej                  Z G d de      Z  G d de!      Z"y)    )unicode_literalsN)InputStream)DummyContextin_main_thread)Input   )	EventLoopINPUT_TIMEOUT)EventLoopCallbacks)InputHookContext)PosixStdinReader)TimeIt)AutoSelectorSelector	fd_to_int)PosixEventLoopc                   V    e Zd ZdZdefdZd ZddZd Zd Z	ddZ
d	 Zd
 Zd Zd Zy)r   z9
    Event loop for posix systems (Linux, Mac os X).
    Nc                    |t        |      sJ t        |t              sJ d| _        d| _        d| _        d | _        g | _        i | _         |       | _	        t        j                         | _        t        j                  | j                  d   t        j                  t        j                         |rt!        |      | _        y d | _        y )NFr   )callable
issubclassr   runningclosed_running
_callbacks_calls_from_executor	_read_fdsselectorospipe_schedule_pipefcntlF_SETFL
O_NONBLOCKr   _inputhook_context)self	inputhookr   s      1lib/third_party/prompt_toolkit/eventloop/posix.py__init__zPosixEventLoop.__init__   s     HY$777(H---$&! 
 !ggiD''*EMM2==I BK"29"=PT    c                     t        |t              sJ t        |t              sJ  j                  rJ  j                  rt        d      d _        | _        t        |j                        t        gt        |j                               t               rt         j                        }n
t               } fd} j!                  ||        j!                   j"                  d   d       |5   j                  r j$                  rAt'               5 } fd} j$                  j)                  |       ddd       j*                  }nd}d   d}nt-        dd   |z
        } j/                  |      }	|	rCg }
g }d}|	D ]  }| j"                  d   k(  r j0                  D ]Q  \  }}||
j3                  |       |xs
 t5               }||k  r|
j3                  |       ?|j3                  ||f       S g  _        t7        j8                   j"                  d   d        j:                  j=                  |      }|s|
j3                  |        t?        j@                  |
       t?        j@                  |       |
r,|
D ]	  } |         |D ]  \  }} jC                  ||        n7|D ]  \  }} |         n%jE                          |jG                          dd<    j                  rddd        jI                  |        jI                   j"                  d          d _        y# 1 sw Y   xY w# 1 sw Y   MxY w)	z)
        The input 'event loop'.
        zEvent loop already closed.Tc                      j                         } j                  |        t        d<   j                  rj	                          yy)z Read user input. r   N)readfeedr
   r   stop)datacurrent_timeoutinputstreamr%   stdin_readers    r'   read_from_stdinz+PosixEventLoop.run.<locals>.read_from_stdinO   sF      $$&DT" "/OA ""		 #r)   r   Nc                 H    j                  | rd         g k7  S d      g k7  S )zF True when there is input ready. The inputhook should return control. r   )_ready_for_reading)waitr0   r%   s    r'   readyz!PosixEventLoop.run.<locals>.readyd   s1    #'#:#:QU?1;M#]ac#cc[\#]ac#ccr)   i   )_max_postpone_until)%
isinstancer   r   r   r   	Exceptionr   r   feed_keyr
   r   filenor   call_on_sigwinchreceived_winchr   
add_readerr    r$   r   call_inputhookdurationmaxr5   r   append_nowr   r,   r   getrandomshufflecall_from_executorflushinput_timeoutremove_reader)r%   stdin	callbacksctxr3   inputhook_timerr7   inputhook_durationremaining_timeoutfdstaskslow_priority_tasksnowfdcmax_postpone_untilhandlert_r0   r1   r2   s   `                  @@@r'   runzPosixEventLoop.run2   s    %''')%7888==  ;;899#!)"4"45(/ (7 "4#6#67C.C	 	/++A.5--**_d //>>uE	 "
 *9)A)A&)*& #1%-(,%(+Aq/ADV/V(W% --.?@  E)+&C! !4!4Q!779=9R9R 5#5#5#=$)LLO +.-C'9C'?(-Q(:(A(A1FXBY(Z :S 9;D5 GGD$7$7$:DA&*nn&8&8&<G& %W 5- "2 NN5)NN#56 !&AC "' 6H1A1 33AK]3^ 6H %7DAqC %7  %%' ++-)-OA&m -- r 	5!4..q12q "	 Ss,   6$M"L6<D
MB.M6M 	;MMc                 <    | j                   j                  |      }|S )zI
        Return the file descriptors that are ready for reading.
        )r   select)r%   timeoutrR   s      r'   r5   z!PosixEventLoop._ready_for_reading   s     mm""7+
r)   c                 2      fd} j                  |       y)zG
        Notify the event loop that SIGWINCH has been received
        c                  T     j                   r j                   j                          y y N)r   terminal_size_changedr%   s   r'   process_winchz4PosixEventLoop.received_winch.<locals>.process_winch   s    557 r)   NrH   )r%   re   s   ` r'   r>   zPosixEventLoop.received_winch   s    	8 	.r)   c                 2    fd}| j                  |       y)z
        Run a long running function in a background thread.
        (This is recommended for code that could block the event loop.)
        Similar to Twisted's ``deferToThread``.
        c                  N    t        j                         j                          y )N)target)	threadingThreadstartcallbacks   r'   start_executorz6PosixEventLoop.run_in_executor.<locals>.start_executor   s    H-335r)   Nrf   )r%   rn   ro   s    ` r'   run_in_executorzPosixEventLoop.run_in_executor   s    	6/r)   c                     |t        |t              sJ | j                  j                  ||f       | j                  r%	 t        j                  | j                  d   d       yy# t        t        t        f$ r Y yw xY w)a  
        Call this function in the main event loop.
        Similar to Twisted's ``callFromThread``.

        :param _max_postpone_until: `None` or `time.time` value. For interal
            use. If the eventloop is saturated, consider this task to be low
            priority and postpone maximum until this timestamp. (For instance,
            repaint is done using low priority.)
        Nr      x)
r9   floatr   rC   r    r   writeAttributeError
IndexErrorOSError)r%   rn   r8   s      r'   rH   z!PosixEventLoop.call_from_executor   s}     #*j9Le.TTT!!(((4G)HI,,Q/6  #J8 
 s   #A$ $A;:A;c                     d| _         y)z&
        Stop the event loop.
        FN)r   rd   s    r'   r.   zPosixEventLoop.stop   s     r)   c                     d| _         | j                  }d | _        |r0t        j                  |d          t        j                  |d          | j                  r| j                  j                          y y )NTr   r   )r   r    r   closer$   )r%   schedule_pipes     r'   rz   zPosixEventLoop.close  sc     ++"HH]1%&HH]1%&""##))+ #r)   c                 n    t        |      }|| j                  |<   | j                  j                  |       y)z- Add read file descriptor to the event loop. N)r   r   r   register)r%   rV   rn   s      r'   r?   zPosixEventLoop.add_reader  s+    r]%rr"r)   c                     t        |      }|| j                  v r| j                  |= | j                  j                  |       y)z2 Remove read file descriptor from the event loop. N)r   r   r   
unregister)r%   rV   s     r'   rK   zPosixEventLoop.remove_reader  s5    r]r"  $r)   rb   )__name__
__module____qualname____doc__r   r(   r\   r5   r>   rp   rH   r.   rz   r?   rK    r)   r'   r   r      sC     "& U(IV/$0&.,#%r)   r   c                   "    e Zd ZdZd Zd Zd Zy)r=   zv
    Context manager which Installs a SIGWINCH callback.
    (This signal occurs when the terminal size changes.)
    c                      || _         d | _        y rb   )rn   previous_callback)r%   rn   s     r'   r(   zcall_on_sigwinch.__init__)  s     !%r)   c                 ^     t        j                   t         j                   fd       _        y )Nc                  $    j                         S rb   rm   )ar%   s    r'   <lambda>z,call_on_sigwinch.__enter__.<locals>.<lambda>.  s    4==?r)   )signalSIGWINCHr   rd   s   `r'   	__enter__zcall_on_sigwinch.__enter__-  s    !'v@Z![r)   c                     | j                   %t        j                  t        j                  d       y t        j                  t        j                  | j                          y )Nr   )r   r   r   )r%   r   kws      r'   __exit__zcall_on_sigwinch.__exit__0  s:    !!) MM&//1-MM&//4+A+ABr)   N)r   r   r   r   r(   r   r   r   r)   r'   r=   r=   $  s    &\Cr)   r=   )#
__future__r   r!   r   rF   r   rj   time#prompt_toolkit.terminal.vt100_inputr   prompt_toolkit.utilsr   r   prompt_toolkit.inputr   baser	   r
   rM   r   r&   r   posix_utilsr   utilsr   r^   r   r   r   __all__rD   r   objectr=   r   r)   r'   <module>r      sg    '  	     ; = & * ) ' )  5 5 yyG%Y G%TCv Cr)   