ó
~-¬[c           @   s  d  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	 d d l
 m Z d „  Z d „  Z i d d 6d d	 6d d
 6d d 6d d 6d d 6Z d „  Z d „  Z e d ƒ d „  ƒ Z e j d „  ƒ Z e d d ƒ d „  ƒ Z e j d „  ƒ Z d „  Z e d ƒ d „  ƒ Z e j d „  ƒ Z e d ƒ d „  ƒ Z e j d „  ƒ Z e d ƒ d „  ƒ Z e j d „  ƒ Z e d  ƒ d! „  ƒ Z e j d" „  ƒ Z e d# ƒ d$ „  ƒ Z  e  j d% „  ƒ Z! e d& ƒ d' „  ƒ Z" e" j d( „  ƒ Z# d d) „ Z$ d S(*   s4   Event loop integration for the ZeroMQ-based kernels.iÿÿÿÿN(   t   LooseVersion(   t   Application(   t   ioc           C   s/   t  j d k o. t t j ƒ  d ƒ t d ƒ k S(   sh   Should we use appnope for dealing with OS X app nap?

    Checks if we are on OS X 10.9 or greater.
    t   darwini    s   10.9(   t   syst   platformt   Vt   mac_ver(    (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   _use_appnope   s    c            sé   d d l  m } t ƒ  r5 ˆ j r5 d d l m ‰  n d d l m } | d „  ƒ ‰  ‡  ‡ ‡ f d †  } ˆ j t	 j
 ƒ } | j | | j j ˆ j ƒ } | j j | ƒ | j ˆ j ƒ } | j t ƒ | j j | ƒ | j d ƒ d  S(   Niÿÿÿÿ(   t   QtCore(   t
   nope_scope(   t   contextmanagerc           s   s	   d  Vd  S(   N(    (    (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   context    s    c              s>   x7 ˆ j  t j ƒ t j @r9 ˆ  ƒ   ˆ j ƒ  Wd  QXq Wd  S(   N(   t
   getsockoptt   zmqt   EVENTSt   POLLINt   do_one_iteration(    (   R   t   kernelt   stream(    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   process_stream_events$   s    
i    (   t   IPython.external.qt_for_kernelR	   R   t   _darwin_app_napt   appnopeR
   t
   contextlibR   R   R   t   FDt   QSocketNotifiert   Readt   appt	   activatedt   connectt   QTimert   setSingleShott   Truet   timeoutt   start(   R   R   R	   R   R   t   fdt   notifiert   timer(    (   R   R   R   s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   _notify_stream_qt   s    t   inlinet   nbaggt   notebookt   ipymplt   widgetc             s   ‡  f d †  } | S(   s0  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            sC   x ˆ D] } ˆ  t  | <q Wd „  ˆ  _ ‡  f d †  } | ˆ  _ ˆ  S(   Nc         S   s   d  S(   N(   t   None(   R   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   <lambda>S   s    c            s   |  ˆ  _  d S(   sc   @func.exit is now a decorator

            to register a function to be called on exit
            N(   t	   exit_hook(   t	   exit_func(   t   func(    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   exit_decoratorU   s    (   t   loop_mapR/   t   exit(   R1   t   nameR2   (   t   toolkitnames(   R1   s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt	   decoratorO   s    	(    (   R6   R7   (    (   R6   s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   register_integrationB   s    c         C   s    t  |  _ |  j ƒ  t |  _ d S(   sð   Inner-loop for running the Qt 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.
    N(   R!   t   _in_event_loopt   exec_t   False(   R   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   _loop_qtb   s    	
t   qt4c         C   sd   d d l  m } | d g ƒ |  _ |  j j t ƒ x |  j D] } t |  | ƒ q< Wt |  j ƒ d S(   s1   Start a kernel with PyQt4 event loop integration.iÿÿÿÿ(   t   get_app_qt4t    N(   t   IPython.lib.guisupportR>   R   t   setQuitOnLastWindowClosedR;   t   shell_streamsR'   R<   (   R   R>   t   s(    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_qt4n   s    c         C   s   |  j  j ƒ  d  S(   N(   R   R4   (   R   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_qt4_exit}   s    t   qtt   qt5c         C   s   d t  j d <t |  ƒ S(   s1   Start a kernel with PyQt5 event loop integration.t   pyqt5t   QT_API(   t   ost   environRD   (   R   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_qt5‚   s    c         C   s   |  j  j ƒ  d  S(   N(   R   R4   (   R   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_qt5_exit‰   s    c         C   s    t  |  _ |  j ƒ  t |  _ d S(   sð   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.
    N(   R!   R9   t   MainLoopR;   (   R   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   _loop_wxŽ   s    	
t   wxc            sø   d d l  ‰ t ƒ  r8 |  j r8 d d l m } | ƒ  n  |  j ‰ t d |  j ƒ ‰ d ˆ j f ‡ ‡ f d †  ƒ  Y‰  d ˆ j	 f ‡  ‡ f d †  ƒ  Y} | d	 t
 ƒ |  _ d d l } t | j | j ƒ ƒ sç | j | j | j ƒ n  t |  j ƒ d S(
   s*   Start a kernel with wx event loop support.iÿÿÿÿN(   t   nopeiè  t
   TimerFramec              s#   e  Z ‡  ‡ f d  †  Z d „  Z RS(   c            s[   ˆ j  j |  d  d ƒ ˆ j |  ƒ |  _ |  j j ˆ  ƒ |  j ˆ j |  j ƒ | |  _	 d  S(   Niÿÿÿÿ(
   t   Framet   __init__R-   t   TimerR&   t   Startt   Bindt	   EVT_TIMERt   on_timerR1   (   t   selfR1   (   t   poll_intervalRP   (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyRT   ­   s
    c         S   s   |  j  ƒ  d  S(   N(   R1   (   RZ   t   event(    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyRY   µ   s    (   t   __name__t
   __module__RT   RY   (    (   R[   RP   (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyRR   ¬   s   t   IPWxAppc              s   e  Z ‡  ‡ f d  †  Z RS(   c            s#   ˆ  ˆ ƒ |  _  |  j  j t ƒ t S(   N(   t   framet   ShowR;   R!   (   RZ   (   RR   t   doi(    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   OnInit»   s    (   R]   R^   Rc   (    (   RR   Rb   (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyR_   º   s   t   redirect(   RP   R   R   R   RQ   R   t   intt   _poll_intervalRS   t   AppR;   R   t   signalt   callablet	   getsignalt   SIGINTt   default_int_handlerRO   (   R   RQ   R_   Rh   (    (   RR   Rb   R[   RP   s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_wxš   s    
	""c         C   s   d d  l  } | j ƒ  d  S(   Niÿÿÿÿ(   RP   t   Exit(   R   RP   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_wx_exitÎ   s    t   tkc            s“   y d d l  m ‰  Wn! t k
 r7 d d l m ‰  n X|  j } t d |  j ƒ ‰ d t f ‡  ‡ f d †  ƒ  Y} | | ƒ |  _ |  j j	 ƒ  d S(   s&   Start a kernel with the Tk event loop.iÿÿÿÿ(   t   Tkiè  RU   c              s/   e  Z ‡  f d  †  Z ‡ f d †  Z d „  Z RS(   c            s&   ˆ  ƒ  |  _  |  j  j ƒ  | |  _ d  S(   N(   R   t   withdrawR1   (   RZ   R1   (   Rq   (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyRT   á   s    c            s$   |  j  ƒ  |  j j ˆ  |  j ƒ d  S(   N(   R1   R   t   afterRY   (   RZ   (   R[   (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyRY   æ   s    
c         S   s   |  j  ƒ  |  j j ƒ  d  S(   N(   RY   R   t   mainloop(   RZ   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyR#   ê   s    
(   R]   R^   RT   RY   R#   (    (   Rq   R[   (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyRU   à   s   N(
   t   tkinterRq   t   ImportErrort   TkinterR   Re   Rf   t   objectR&   R#   (   R   Rb   RU   (    (   Rq   R[   s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_tkÔ   s    	c         C   s   |  j  j j ƒ  d  S(   N(   R&   R   t   destroy(   R   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_tk_exitò   s    t   gtkc         C   s3   d d l  m } | |  ƒ } | j ƒ  | |  _ d S(   s6   Start the kernel, coordinating with the GTK event loopi   (   t   GTKEmbedN(   t   gui.gtkembedR}   R#   t   _gtk(   R   R}   t
   gtk_kernel(    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_gtk÷   s    
c         C   s   |  j  j ƒ  d  S(   N(   R   t   stop(   R   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_gtk_exit  s    t   gtk3c         C   s3   d d l  m } | |  ƒ } | j ƒ  | |  _ d S(   s6   Start the kernel, coordinating with the GTK event loopi   (   R}   N(   t   gui.gtk3embedR}   R#   R   (   R   R}   R€   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt	   loop_gtk3  s    
c         C   s   |  j  j ƒ  d  S(   N(   R   R‚   (   R   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_gtk3_exit  s    t   osxc            s¸   d d l  m } m ‰ t j ‰  ‡  ‡ f d †  } x€ |  j j s³ zc y> y- | t _ | |  j ƒ ˆ  t _ |  j ƒ  Wn
 ‚  n XWn t	 k
 r¡ t
 j d ƒ n XWd ˆ  t _ Xq4 Wd S(   sn   Start the kernel, coordinating with the Cocoa CFRunLoop event loop
    via the matplotlib MacOSX backend.
    i   (   Rt   R‚   c            s7   ˆ ƒ  |  t  k r# t j d ƒ n ˆ  |  | | ƒ d S(   s.   don't let KeyboardInterrupts look like crashess%   KeyboardInterrupt caught in CFRunLoopN(   t   KeyboardInterruptR   t	   raw_print(   t   etypet   valuet   tb(   t   real_excepthookR‚   (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt
   handle_int  s    s"   KeyboardInterrupt caught in kernelN(   t   _eventloop_macosRt   R‚   R   t
   excepthookt   shellt   exit_nowRf   R   R‰   R   RŠ   (   R   Rt   R   (    (   RŽ   R‚   s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt
   loop_cocoa  s     		 		c         C   s   d d l  m } | ƒ  d  S(   Ni   (   R‚   (   R   R‚   (   R   R‚   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_cocoa_exit:  s    t   asyncioc            sã   d d l  } | j ƒ  ‰ ˆ j ƒ  r( d S‡  ‡ ‡ f d †  ‰ ˆ j ˆ ƒ x’ t rÞ d } y ˆ j ƒ  Wn, t k
 r} qM n t k
 r• } | } n Xt	 ˆ d ƒ r» ˆ j
 ˆ j ƒ  ƒ n  ˆ j ƒ  | d k	 rÚ | ‚ n  PqM Wd S(   s/   Start a kernel with asyncio event loop support.iÿÿÿÿNc              s'   ˆ j  ˆ  j ƒ ˆ j ˆ  j ˆ ƒ d  S(   N(   t	   call_soonR   t
   call_laterRf   (    (   R   t   kernel_handlert   loop(    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyR™   I  s    t   shutdown_asyncgens(   R–   t   get_event_loopt
   is_runningR—   R!   R-   t   run_foreverR‰   t	   Exceptiont   hasattrt   run_until_completeR›   t   close(   R   R–   t   errort   e(    (   R   R™   Rš   s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_asyncio@  s(    	

	c         C   s;   d d l  } | j ƒ  } | j ƒ  r7 | j | j ƒ n  d S(   s   Exit hook for asyncioiÿÿÿÿN(   R–   Rœ   R   R—   R‚   (   R   R–   Rš   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   loop_asyncio_exit^  s    c         C   sÌ   |  t  k r1 d |  t  j ƒ  f } t | ƒ ‚ n  | d k r‚ t j ƒ  rd t t j ƒ  d d ƒ } n  | d k r‚ t d ƒ ‚ q‚ n  t  |  } | r¿ | j	 d k	 r¿ | j	 | k	 r¿ t d ƒ ‚ n  | | _	 d S(   s#   Enable integration with a given GUIs)   Invalid GUI request %r, valid ones are:%sR   s\   You didn't specify a kernel, and no IPython Application with a kernel appears to be running.s'   Cannot activate multiple GUI eventloopsN(
   R3   t   keyst
   ValueErrorR-   R   t   initializedt   getattrt   instancet   RuntimeErrort	   eventloop(   t   guiR   R¤   Rš   (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt
   enable_guig  s    
$(%   t   __doc__RJ   R   R   R   t   distutils.versionR    R   t   traitlets.config.applicationR   t   IPython.utilsR   R   R'   R-   R3   R8   R<   RD   R4   RE   RL   RM   RO   Rm   Ro   Ry   R{   R   Rƒ   R†   R‡   R”   R•   R¥   R¦   R¯   (    (    (    s3   lib/python2.7/site-packages/ipykernel/eventloops.pyt   <module>   sH   		!
	 		4

%	