o
    œhÎK  ã                   @   st  d Z ddlZddlZddlZddlmZ ddlZddlmZ	 ddl
mZ dd„ ZddddddddœZd	d
„ Zdd„ Zedddƒdd„ ƒZeZejdd„ ƒZdd„ Zedƒdd„ ƒZejdd„ ƒZedƒdd„ ƒZejdd„ ƒZed ƒd!d"„ ƒZejd#d$„ ƒZed%ƒd&d'„ ƒZejd(d)„ ƒZed*ƒd+d,„ ƒZejd-d.„ ƒZed/ƒd0d1„ ƒZejd2d3„ ƒZ d4d5„ Z!d6d7„ Z"d:d8d9„Z#dS );z4Event loop integration for the ZeroMQ-based kernels.é    N)Úpartial)ÚVersion)ÚApplicationc                   C   s"   t jdkott ¡ d ƒtdƒkS )zhShould we use appnope for dealing with OS X app nap?

    Checks if we are on OS X 10.9 or greater.
    Údarwinr   z10.9)ÚsysÚplatformÚVÚmac_ver© r
   r
   úJc:\Users\shubh\Videos\agent\nova\Lib\site-packages\ipykernel/eventloops.pyÚ_use_appnope   s   "r   )ÚinlineZnbaggZwebaggÚnotebookZipymplZwidgetNc                     s   ‡ fdd„}|S )a0  Decorator to register an event loop to integrate with the IPython kernel

    The decorator takes names to register the event loop as for the %gui magic.
    You can provide alternative names for the same toolkit.

    The decorated function should take a single argument, the IPython kernel
    instance, arrange for the event loop to call ``kernel.do_one_iteration()``
    at least every ``kernel._poll_interval`` seconds, and start the event loop.

    :mod:`ipykernel.eventloops` provides and registers such functions
    for a few common event loops.
    c                    s2   ˆD ]}ˆ t |< qdd„ ˆ _‡ fdd„}|ˆ _ˆ S )z#Integration registration decorator.c                 S   s   d S ©Nr
   ©Úkernelr
   r
   r   Ú<lambda>7   s    z9register_integration.<locals>.decorator.<locals>.<lambda>c                    s
   | ˆ _ | S )zc@func.exit is now a decorator

            to register a function to be called on exit
            )Ú	exit_hook)Z	exit_func©Úfuncr
   r   Úexit_decorator9   s   z?register_integration.<locals>.decorator.<locals>.exit_decorator)Úloop_mapr   Úexit)r   Únamer   ©Útoolkitnamesr   r   Ú	decorator2   s   

z'register_integration.<locals>.decoratorr
   )r   r   r
   r   r   Úregister_integration$   s   r   c                    sì   dd l ‰ddlm} ddlm‰  zddlm‰ W n ty,   |d ƒ‡ ‡fdd„ƒ‰Y nw ‡fdd„‰‡‡fd	d
„}tˆdƒs[ˆj 	t
j¡}ˆ  |ˆdƒjˆjj¡ˆ_ˆjj |¡ nˆj d¡ ‡ ‡‡‡fdd„}|t_ˆ j d|¡ d S )Nr   )Ú	lru_cache©ÚQtCore)Úenum_helperc                    s    ˆ  |  d¡d ¡tjˆ j ƒS )NÚ.r   )Ú
attrgetterÚ
rpartitionr   ÚmodulesÚ__package__)r   )r    Úoperatorr
   r   r!   Q   s    z&_notify_stream_qt.<locals>.enum_helperc                      s   ˆ j  d¡ ˆ jj ¡  dS )úfall back to main loopFN)Ú_qt_notifierÚ
setEnabledÚappÚqt_event_loopÚquitr
   r   r
   r   Ú	exit_loopU   s   z$_notify_stream_qt.<locals>.exit_loopc                      ó   ˆj jdd�rˆ ƒ  dS dS ©z2fall back to main loop when there's a socket eventé   ©ÚlimitN©Úshell_streamÚflushr
   ©r.   r   r
   r   Úprocess_stream_eventsZ   s   
ÿz0_notify_stream_qt.<locals>.process_stream_eventsr)   zQtCore.QSocketNotifier.TypeTc                    s\   t ˆdƒs"ˆ  ˆj¡ˆ_ˆj d¡ ˆj ˆdƒj¡ ˆjj ˆ¡ ˆj 	t
d|  ƒ¡ dS )ú2schedule fall back to main loop in [delay] secondsÚ	_qt_timerTzQtCore.Qt.TimerTypeéè  N)ÚhasattrÚQTimerr+   r:   ZsetSingleShotZsetTimerTypeZPreciseTimerÚtimeoutÚconnectÚstartÚint©Údelay)r    r!   r.   r   r
   r   Ú_schedule_exitn   s   
z)_notify_stream_qt.<locals>._schedule_exit)r'   Ú	functoolsr   ÚIPython.external.qt_for_kernelr    r!   ÚImportErrorr<   r5   Ú
getsockoptÚzmqÚFDZQSocketNotifierZReadr+   r,   r)   Z	activatedr?   r*   Úloop_qtrD   r=   Z
singleShot)r   r   r8   ÚfdrD   r
   )r    r!   r.   r   r'   r   Ú_notify_stream_qtG   s*   ý
	ÿ	rM   ÚqtÚqt5Úqt6c                 C   sL   t | ƒ d| j_| jj}t|dƒr| ¡ n
| ¡  d| j_dS  d| j_dS )z,Event loop for all supported versions of Qt.TÚexecFN)rM   r+   Ú_in_event_loopr,   r<   rQ   Úexec_)r   Úelr
   r
   r   rK   ‡   s   ÿrK   c                 C   s   | j  ¡  d S r   )r+   r   r   r
   r
   r   Úloop_qt_exitš   s   rU   c                 C   s   d| _ |  ¡  d| _ dS )zðInner-loop for running the Wx eventloop

    Pulled from guisupport.start_event_loop in IPython < 5.2,
    since IPython 5.2 only checks `get_ipython().active_eventloop` is defined,
    rather than if the eventloop is actually running.
    TFN)rR   ZMainLoop)r+   r
   r
   r   Ú_loop_wxŸ   s   
rV   Úwxc                    s®   ddl ‰tdˆj ƒ‰‡fdd„‰G ‡‡fdd„dˆjƒ‰ G ‡ ‡fdd	„d	ˆjƒ}tˆd
dƒr6tˆjˆjƒs<|dd�ˆ_ddl}t	| 
|j¡ƒsP| |j|j¡ tˆjƒ dS )z*Start a kernel with wx event loop support.r   Nr;   c                      s    ˆ j jdd�rˆ j ¡  dS dS )zwake from wxr1   r2   N)r5   r6   r+   ZExitMainLoopr
   r   r
   r   Úwake´   s   
þzloop_wx.<locals>.wakec                       s"   e Zd Z‡ ‡fdd„Zdd„ ZdS )zloop_wx.<locals>.TimerFramec                    sB   ˆj  | d d¡ ˆ | ¡| _| j ˆ ¡ |  ˆj| j¡ || _d S )Néÿÿÿÿ)	ÚFrameÚ__init__ÚTimerÚtimerZStartZBindZ	EVT_TIMERÚon_timerr   )Úselfr   ©Úpoll_intervalrW   r
   r   r[   ½   s
   
z$loop_wx.<locals>.TimerFrame.__init__c                 S   s   |   ¡  d S r   r   )r_   Úeventr
   r
   r   r^   Å   s   z$loop_wx.<locals>.TimerFrame.on_timerN)Ú__name__Ú
__module__Ú__qualname__r[   r^   r
   r`   r
   r   Ú
TimerFrame¼   s    rf   c                       s   e Zd Z‡ ‡fdd„ZdS )zloop_wx.<locals>.IPWxAppc                    s   ˆ ˆƒ| _ | j  d¡ dS )NFT)ÚframeZShow©r_   ©rf   rX   r
   r   ÚOnInitË   s   
zloop_wx.<locals>.IPWxApp.OnInitN)rc   rd   re   rj   r
   ri   r
   r   ÚIPWxAppÊ   s    rk   r+   F)Úredirect)rW   rA   Ú_poll_intervalrZ   ZAppÚgetattrÚ
isinstancer+   ÚsignalÚcallableÚ	getsignalÚSIGINTÚdefault_int_handlerrV   )r   rk   rp   r
   )rf   r   ra   rX   rW   r   Úloop_wx«   s   ru   c                 C   s   ddl }| ¡  dS )zExit the wx loop.r   N)rW   ZExit)r   rW   r
   r
   r   Úloop_wx_exità   s   rv   Útkc           	         sö   ddl m}m} |ƒ ‰ tˆ dƒrMG dd„ dƒ}‡ ‡fdd„‰‡‡fdd	„}‡ ‡fd
d„}|t_|ˆ ƒˆ_ˆ j ˆj	 
tj¡||¡ ˆ  d|¡ ˆ  ¡  dS ddl‰ddl}| ¡  ˆj}tdˆj ƒ‰G ‡‡‡fdd„dƒ}|ˆ |ƒˆ_ˆj ¡  dS )z&Start a kernel with the Tk event loop.r   )ÚREADABLEÚTkÚcreatefilehandlerc                   @   s   e Zd Zdd„ ZdS )z loop_tk.<locals>.BasicAppWrapperc                 S   s   || _ | j  ¡  d S r   )r+   Úwithdraw)r_   r+   r
   r
   r   r[   õ   s   z)loop_tk.<locals>.BasicAppWrapper.__init__N)rc   rd   re   r[   r
   r
   r
   r   ÚBasicAppWrapperô   s    r|   c                      s.   ˆ j  ˆj tj¡¡ ˆ  ¡  ˆ  ¡  ˆ`dS )r(   N)	rw   Zdeletefilehandlerr5   rH   rI   rJ   r-   ÚdestroyÚapp_wrapperr
   )r+   r   r
   r   r.   ù   s   zloop_tk.<locals>.exit_loopc                     r/   r0   r4   )ÚaÚkwr7   r
   r   r8      s   
ÿz&loop_tk.<locals>.process_stream_eventsc                    s   ˆ   td|  ƒˆ¡ dS )r9   r;   N)ÚafterrA   rB   )r+   r.   r
   r   rD     s   zloop_tk.<locals>._schedule_exitNr;   c                       s,   e Zd Zdd„ Z‡ ‡‡fdd„Zdd„ ZdS )z loop_tk.<locals>.TimedAppWrapperc                 S   s   || _ | j  ¡  || _d S r   )r+   r{   r   )r_   r+   r   r
   r
   r   r[   #  s   

z)loop_tk.<locals>.TimedAppWrapper.__init__c                    sN   ˆ   ¡ }z	| |  ¡ ¡ W n ty   ˆj d¡ Y nw | j ˆ| j¡ d S )NzError in message handler)	Úget_event_loopÚrun_until_completer   Ú	ExceptionÚlogÚ	exceptionr+   r�   r^   )r_   Úloop©Úasyncior   ra   r
   r   r^   (  s   ÿz)loop_tk.<locals>.TimedAppWrapper.on_timerc                 S   s   |   ¡  | j ¡  d S r   )r^   r+   Úmainlooprh   r
   r
   r   r@   0  s   z&loop_tk.<locals>.TimedAppWrapper.startN)rc   rd   re   r[   r^   r@   r
   rˆ   r
   r   ÚTimedAppWrapper"  s    r‹   )Útkinterrx   ry   r<   Úloop_tkrD   r~   rw   rz   r5   rH   rI   rJ   r�   rŠ   r‰   Únest_asyncioÚapplyZdo_one_iterationrA   rm   r@   )	r   rx   ry   r|   r8   rD   rŽ   Zdoir‹   r
   )r+   r‰   r.   r   ra   r   r�   è   s,   

ÿr�   c              	   C   s0   z| j j ¡  | ` W dS  ttfy   Y dS w )zExit the tk loop.N)r~   r+   r}   ÚRuntimeErrorÚAttributeErrorr   r
   r
   r   Úloop_tk_exit8  s   
ÿr’   Zgtkc                 C   ó&   ddl m} || ƒ}| ¡  || _dS ©z6Start the kernel, coordinating with the GTK event loopr1   )ÚGTKEmbedN)Zgui.gtkembedr•   r@   Ú_gtk©r   r•   Z
gtk_kernelr
   r
   r   Úloop_gtkB  ó   
r˜   c                 C   ó   | j  ¡  dS )zExit the gtk loop.N©r–   Ústopr   r
   r
   r   Úloop_gtk_exitL  ó   r�   Zgtk3c                 C   r“   r”   )Zgui.gtk3embedr•   r@   r–   r—   r
   r
   r   Ú	loop_gtk3R  r™   rŸ   c                 C   rš   )zExit the gtk3 loop.Nr›   r   r
   r
   r   Úloop_gtk3_exit\  rž   r    Zosxc                    sº   ddl m}m‰ tj‰ ‡ ‡fdd„}| jjs[z:z$z|t_|| jƒ | jj	dd�r0W W W ˆ t_dS W n t
y9   ‚ w W n tyK   tdtjd� Y nw W ˆ t_nˆ t_w | jjrdS dS )	znStart the kernel, coordinating with the Cocoa CFRunLoop event loop
    via the matplotlib MacOSX backend.
    r1   )rŠ   rœ   c                    s0   ˆƒ  | t u rtdtjd� dS ˆ | ||ƒ dS )z.don't let KeyboardInterrupts look like crashesz%KeyboardInterrupt caught in CFRunLoop©ÚfileN)ÚKeyboardInterruptÚprintr   Ú
__stdout__)ÚetypeÚvalueÚtb©Zreal_excepthookrœ   r
   r   Ú
handle_intk  s   zloop_cocoa.<locals>.handle_intr2   Nz"KeyboardInterrupt caught in kernelr¡   )Ú_eventloop_macosrŠ   rœ   r   Ú
excepthookÚshellZexit_nowrm   r5   r6   ÚBaseExceptionr£   r¤   r¥   )r   rŠ   rª   r
   r©   r   Ú
loop_cocoab  s,   	

öÿýþ€îr¯   c                 C   s   ddl m} |ƒ  dS )zExit the cocoa loop.r1   )rœ   N)r«   rœ   )r   rœ   r
   r
   r   Úloop_cocoa_exit‰  s   
r°   r‰   c              
      sÞ   ddl }| ¡ ‰ ˆ  ¡ rdS ˆ  ¡ r| ¡ ‰ | ˆ ¡ dˆ _‡ fdd„}t|| jƒ}ˆ  	| j 
tj¡|¡ ˆ  |¡ 	 d}zˆ  ¡  W n tyL   Y q: ty_ } z|}W Y d}~nd}~ww ˆ jrgˆ  ¡  |durm|‚dS )z/Start a kernel with asyncio event loop support.r   NFc                    s   | j dd�rˆ  ¡  dS dS r0   )r6   rœ   )Ústream©r‡   r
   r   r8   ¢  s   ÿz+loop_asyncio.<locals>.process_stream_events)r‰   r‚   Ú
is_runningÚ	is_closedÚnew_event_loopÚset_event_loopÚ_should_closer   r5   Ú
add_readerrH   rI   rJ   Ú	call_soonÚrun_foreverr£   r„   Úclose)r   r‰   r8   ZnotifierÚerrorÚer
   r²   r   Úloop_asyncio‘  s6   

€ÿr¾   c                    sP   ddl }| ¡ ‰ ‡ fdd„}ˆ  ¡ r|ƒ  dS ˆ  ¡ s&ˆ  |¡ ˆ  ¡  dS dS )zExit hook for asyncior   Nc                     s(   �t ˆ dƒrˆ  ¡ V  dˆ _ˆ  ¡  d S )NÚshutdown_asyncgensT)r<   r¿   r·   rœ   r
   r²   r
   r   Ú
close_loopÁ  s
   €

z%loop_asyncio_exit.<locals>.close_loop)r‰   r‚   r³   r´   rƒ   r»   )r   r‰   rÀ   r
   r²   r   Úloop_asyncio_exitº  s   

þrÁ   c                 C   sú  t j dd¡}ddlm}m}m}m}m} |ƒ }|d|d|d|di}|dur<| dkr<|| | kr<t	d|| › d	�ƒ dS |durX| dkrX|| | krWt	d
| › d|› d�ƒ dS n~| dkr‹zddl
}	dt jd< W nn tyŠ   zddl}
dt jd< W n ty‡   dt jd< Y nw Y nLw | dkr¾zddl}dt jd< W n; ty½   zddl}dt jd< W n tyº   dt jd< Y nw Y nw | dkrÌdt jv rËt jd= n
t	d| › d�ƒ dS zW dS  tyü } zdt jv rñt jd= t	d|› �ƒ W Y d}~dS d}~ww )a  
    Sets the QT_API environment variable by trying to import PyQtx or PySidex.

    The user can generically request `qt` or a specific Qt version, e.g. `qt6`.
    For a generic Qt request, we let the mechanism in IPython choose the best
    available version by leaving the `QT_API` environment variable blank.

    For specific versions, we check to see whether the PyQt or PySide
    implementations are present and set `QT_API` accordingly to indicate to
    IPython which version we want. If neither implementation is present, we
    leave the environment variable set so IPython will generate a helpful error
    message.

    Notes
    -----
    - If the environment variable is already set, it will be used unchanged,
      regardless of what the user requested.
    ZQT_APINr   )ÚQT_API_PYQT5ÚQT_API_PYQT6ÚQT_API_PYSIDE2ÚQT_API_PYSIDE6Ú
loaded_apirO   rP   rN   z9Cannot switch Qt versions for this session; you must use r"   zRequest for "zC" will be ignored because `QT_API` environment variable is set to "ú"Zpyqt5Zpyside2Zpyqt6Zpyside6zUnrecognized Qt version: z". Should be "qt5", "qt6", or "qt".z$QT_API couldn't be set due to error )ÚosÚenvironÚgetZIPython.external.qt_loadersrÂ   rÃ   rÄ   rÅ   rÆ   r¤   ÚPyQt5rG   ÚPySide2ÚPyQt6ÚPySide6r„   )ÚguiZqt_apirÂ   rÃ   rÄ   rÅ   rÆ   ZloadedZ
qt_env2guirË   rÌ   rÍ   rÎ   r½   r
   r
   r   Úset_qt_api_env_from_guiÏ  sz   üÿÿûÿ€ûÿ€û
€
€ûrÐ   c                 C   sN   t |dƒrdS t| ƒ ddlm} ddlm} |dgƒ|_| |j¡|j_dS )z?Sets the `QT_API` environment variable if it isn't already set.r+   Nr   r   )Úget_app_qt4ú )	r<   rÐ   rF   r    ZIPython.lib.guisupportrÑ   r+   Z
QEventLoopr,   )rÏ   r   r    rÑ   r
   r
   r   Úmake_qt_app_for_kernel+  s   
rÓ   c                 C   sè   | t vrd| ›dt  ¡ › �}t|ƒ‚|du r,t ¡ r"tt ¡ ddƒ}|du r,d}t|ƒ‚| du rOt|dƒr:t	|dƒ t|dƒrDt	|dƒ t|dƒrNt	|dƒ n
|  
d	¡rYt| |ƒ t |  }|ro|jduro|j|urod
}t|ƒ‚||_dS )z#Enable integration with a given GUIzInvalid GUI request z, valid ones are:Nr   z\You didn't specify a kernel, and no IPython Application with a kernel appears to be running.r+   r)   r:   rN   z'Cannot activate multiple GUI eventloops)r   ÚkeysÚ
ValueErrorr   Zinitializedrn   Úinstancer�   r<   ÚdelattrÚ
startswithrÓ   Z	eventloop)rÏ   r   r½   Úmsgr‡   r
   r
   r   Ú
enable_gui<  s6   ÿ





€

ÿ
rÚ   r   )$Ú__doc__rÈ   r   r   rE   r   rI   Zpackaging.versionr   r   Ztraitlets.config.applicationr   r   r   r   rM   rK   Zloop_qt5r   rU   rV   ru   rv   r�   r’   r˜   r�   rŸ   r    r¯   r°   r¾   rÁ   rÐ   rÓ   rÚ   r
   r
   r
   r   Ú<module>   sh    
ù#
@


4

O
	
	

	

&

(
\