o
    :a0                     @   s   d 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	 ddl
mZmZmZ eeZde e e f Zdadd Zd	d
 ZG dd de	ZG dd deZG dd dejZG dd dejejZG dd deZdS )z)
Common code for GTK3 and GTK4 backends.
    N)backend_toolscbook)_BackendNavigationToolbar2	TimerBase)GioGLibGtkz%s.%s.%sc                 C   s$   |   D ]}|  qd| _d ad S NT)Zget_windowsclose_created_by_matplotlib_application)appwin r   B/usr/lib/python3/dist-packages/matplotlib/backends/_backend_gtk.py_shutdown_application   s   
r   c                  C   s   t d u r?tj } | d u st| ddr=tj stdt	j
dtjja t ddd  t dt t   t  t S | a t S )	Nr   FzInvalid DISPLAY variablezorg.matplotlib.Matplotlib3Zactivatec                  _   s   d S Nr   )argskwargsr   r   r   <lambda>7   s    z%_create_application.<locals>.<lambda>Zshutdown)r   r   ZApplicationget_defaultgetattrmplZ_c_internal_utilsZdisplay_is_validRuntimeErrorr	   newZApplicationFlagsZ
NON_UNIQUEZconnectr   registerr   Z_setup_new_guiapp)r   r   r   r   _create_application)   s   

r   c                       sD   e Zd ZdZ fddZdd Zdd Zdd	 Z fd
dZ  Z	S )TimerGTKz0Subclass of `.TimerBase` using GTK timer events.c                    s   d | _ t j|i | d S r   )_timersuper__init__)selfr   r   	__class__r   r   r!   D   s   zTimerGTK.__init__c                 C   s   |    t| j| j| _d S r   )_timer_stopr   Ztimeout_addZ	_interval	_on_timerr   r"   r   r   r   _timer_startH   s   zTimerGTK._timer_startc                 C   s$   | j d urt| j  d | _ d S d S r   )r   r   Zsource_remover'   r   r   r   r%   N   s   

zTimerGTK._timer_stopc                 C   s"   | j d ur|   |   d S d S r   )r   r%   r(   r'   r   r   r   _timer_set_intervalS   s   
zTimerGTK._timer_set_intervalc                    s$   t    | jr| jsdS d | _dS )NTF)r    r&   Z	callbacksZ_singler   r'   r#   r   r   r&   Y   s
   
zTimerGTK._on_timer)
__name__
__module____qualname____doc__r!   r(   r%   r)   r&   __classcell__r   r   r#   r   r   A   s    r   c                       sP   e Zd Zdd Zdd Zdd Zdd Z fd	d
Z fddZdd Z	  Z
S )_NavigationToolbar2GTKc                 C   s"   t |}| jd| d d S )Nz<small>z</small>)r   Zmarkup_escape_textmessageZ
set_markup)r"   sZescapedr   r   r   set_messagej   s   
z"_NavigationToolbar2GTK.set_messagec                 C   sJ   | j jjj}|| }|| }dd |||| || fD }| j | d S )Nc                 S   s   g | ]}t |qS r   )int).0valr   r   r   
<listcomp>r   s    z:_NavigationToolbar2GTK.draw_rubberband.<locals>.<listcomp>)canvasZfigureZbboxheight_draw_rubberband)r"   Zeventx0y0x1y1r8   Zrectr   r   r   draw_rubberbandn   s
   z&_NavigationToolbar2GTK.draw_rubberbandc                 C   s   | j d  d S r   )r7   r9   r'   r   r   r   remove_rubberbandu   s   z(_NavigationToolbar2GTK.remove_rubberbandc              	   C   s`   dD ]+\}}| j |}|r-||j || jj|k W d    n1 s(w   Y  qd S )N))ZPanZPAN)ZZoomZZOOM)_gtk_idsgetZhandler_blockZ_signal_handlerZ
set_activemodename)r"   rC   ZactiveZbuttonr   r   r   _update_buttons_checkedx   s   z._NavigationToolbar2GTK._update_buttons_checkedc                       t  j|  |   d S r   )r    panrD   r"   r   r#   r   r   rF         z_NavigationToolbar2GTK.panc                    rE   r   )r    zoomrD   rG   r#   r   r   rI      rH   z_NavigationToolbar2GTK.zoomc                 C   s`   | j jdk}| j jt| j jd k }d| jv r| jd | d| jv r.| jd | d S d S )Nr      ZBackZForward)Z
_nav_stack_poslenZ	_elementsr@   Zset_sensitive)r"   Zcan_backwardZcan_forwardr   r   r   set_history_buttons   s   

z*_NavigationToolbar2GTK.set_history_buttons)r*   r+   r,   r2   r>   r?   rD   rF   rI   rM   r.   r   r   r#   r   r/   e   s    r/   c                   @      e Zd Zdd Zdd ZdS )RubberbandGTKc                 C   s   t |  d |||| d S r   )r/   r>   "_make_classic_style_pseudo_toolbar)r"   r:   r;   r<   r=   r   r   r   r>      s   zRubberbandGTK.draw_rubberbandc                 C   s   t |   d S r   )r/   r?   rP   r'   r   r   r   r?      s   zRubberbandGTK.remove_rubberbandN)r*   r+   r,   r>   r?   r   r   r   r   rO      s    rO   c                   @   rN   )ConfigureSubplotsGTKc                 C   s   | j |S r   )r7   r$   )r"   Zfigr   r   r   _get_canvas   s   z ConfigureSubplotsGTK._get_canvasc                 G   s   t |  d  d S r   )r/   Zconfigure_subplotsrP   rG   r   r   r   trigger   s   zConfigureSubplotsGTK.triggerN)r*   r+   r,   rR   rS   r   r   r   r   rQ      s    rQ   c                   @   s   e Zd Zedd ZdS )_BackendGTKc                  C   s`   t d u rd S z&zt   W n ty'   tj } |  r&| d |  s w W d a d S d a w r
   )r   runKeyboardInterruptr   ZMainContextdefaultZpendingZ	iteration)contextr   r   r   mainloop   s   


z_BackendGTK.mainloopN)r*   r+   r,   staticmethodrY   r   r   r   r   rT      s    rT   ) r-   ZloggingZ
matplotlibr   r   r   Zmatplotlib.backend_basesr   r   r   Zgi.repositoryr   r   r	   Z	getLoggerr*   Z_logZget_major_versionZget_minor_versionZget_micro_versionZbackend_versionr   r   r   r   r/   ZRubberbandBaserO   ZConfigureSubplotsBaseZWindowrQ   rT   r   r   r   r   <module>   s$    
$+
	