
    Eg-!                     ~    d dl mZmZ dZdZd Zd Zd Z G d d      Z e       a	d Z
 G d	 d
      Z e       ad Zy)    )GObjectGLibFc                  ^    d}d}| D ]  }|s|dz  }d}|t        |      z  } t        |       y )NT z: F)strprint)argsfirstoutputargs       0/usr/share/cinnamon-screensaver/util/trackers.py_debugr      sC    EF dNF#c( 
&M    c                  "    t         r	t        |   y y N)DEBUG_TIMERSr   r	   s    r   debug_timersr      s     r   c                  "    t         r	t        |   y y r   )DEBUG_SIGNALSr   r   s    r   
debug_sigsr      s     r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TimerTrackerz
    Utility class for tracking mainloop timers - they are stored as
    [name : timeout id] pairs.  This is simply a way of managing them
    without having to individually track source ids.
    c                     i | _         y r   )timersselfs    r   __init__zTimerTracker.__init__"   s	    r   c                 6     || }|ry| j                  |       y)NTF)cancel)r   callbacknamer	   rets        r   do_callbackzTimerTracker.do_callback%   s     oDr   c           
          | j                  |       t        j                  || j                  ||g| }t	        d|d|dz  dt        |      d|       || j                  |<   y )Nadding timer of nameduration (sec)g     @@r!   id)r    r   timeout_addr$   r   r   r   r   r"   durationr!   r	   
timeout_ids         r   startzTimerTracker.start.   sm    D((43C3CXt[VZ[
+T3CXPVEVXbdghpdqsw  zD  	E&Dr   c           
          | j                  |       t        j                  || j                  ||g| }t	        d|d|dt        |      d|       || j                  |<   y )Nr&   r'   r!   r(   )r    r   timeout_add_secondsr$   r   r   r   r*   s         r   start_secondszTimerTracker.start_seconds5   s`    D004;K;KXW[c^bc
+T3CXz[^_g[hjnpz{&Dr   c                     | j                  |       t        j                  | j                  ||g| }t	        d|dt        |      d|       || j                  |<   y )Nzadding idle callback of namer!   r(   )r    r   idle_addr$   r   r   r   )r   r"   r!   r	   idle_ids        r   add_idlezTimerTracker.add_idle<   sT    D""4#3#3XtKdK3T:s8}VZ\cd#Dr   c                    	 | j                   |   rt        j                  j                         j	                  | j                   |         r>t        j                  | j                   |          t        d|d| j                   |          nt        d|d| j                   |          | j                   |= y y # t        $ r Y y w xY w)Nzcancel succeeded forz	source idz"cancel failed (not a valid id) for)	r   r   MainContextdefaultfind_source_by_idr   source_remover   KeyError)r   r"   s     r   r    zTimerTracker.cancelC   s    
	{{4 ##++-??D@QR))$++d*;< !7{DKKX\L]^ !Et[Z^ZeZefjZklKK% !  		s   B/B3 3	B?>B?c                     t        d       t        d       t        d       t        d       t        d       t        d       d}| j                  D ]  }t        |       |dz  } t        d|z         t        d       y )	Nr   C/******************************************************************zC * There should be no timers leftover here                        *D ******************************************************************/zTimer tracker dump:r      z%d timers total)r   r   )r   itimers      r   dump_timer_listzTimerTracker.dump_timer_listP   ss    b	STSTTUb	#$[[ 	E%LFA	 	!#$b	r   N)__name__
__module____qualname____doc__r   r$   r-   r0   r4   r    rA    r   r   r   r      s*    
''$r   r   c                      t         S r   )timer_trackerrF   r   r   timer_tracker_getrI   d   s    r   c                   R    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)ConnectionTrackera  
    Utility class for tracking GObject signal connections.  It is tracked in
    [ name : (source id, instance) ] pairs.  The name is generated as a magic
    string consisting of "instance hash+signal name+callback hash".

    As a convenience, we hang a weak reference on both the signal caller's instance
    as well as the callback's instance.  If either of these instances are destroyed
    we will receive a notification and automatically attempt to disconnect the original
    signal connection.  This will frequently fail, depending on what gets destroyed first
    (destruction of the source instance will usually mean implicit destruction of the
    callback.)
    c                     i | _         y r   )connectionsr   s    r   r   zConnectionTracker.__init__u   s
    r   c           	      b    t        t        |            d|dt        t        |            }|S )N-)r   hashr   instancesignalr!   r"   s        r   _namezConnectionTracker._namex   s%     h0&#d8n:MNr   c                 D   	 | j                   |   rd| j                   |   \  }}t        j                  ||      r |j                  |       t	        d|d|       nt	        d|d|       | j                   |= y y # t
        $ r }t	        d|t        |             Y d }~y d }~ww xY w)Nz!_disconnect_by_name succeeded forr(   z/_disconnect_by_name failed (not a valid id) forzE_disconnect_by_name failed (not being tracked or already disco'd) for)rM   r   signal_handler_is_connected
disconnectr   r:   r   )r   r"   	source_idrR   es        r   _disconnect_by_namez%ConnectionTracker._disconnect_by_name}   s    	n%(,(8(8(>%H66xK''	2BD$PYZPRVX\^gh$$T* &  	n^`dfijkflmm	ns   A2A6 6	B?BBc                    d }	 |j                   }|rCt        |t        j                        r)|j                  | j                  |d       t        d|       |j                  | j                  |d       t        d|       y #  Y .xY w)Ncallback_instancez'_connect_to_dispose (callback_instance)rR   z_connect_to_dispose (instance))__self__
isinstancer   weak_ref_cleanup_disposedr   )r   r"   rR   r!   r\   s        r   _connect_to_disposez%ConnectionTracker._connect_to_dispose   s}     	 ( 1 1 Z0A7??%S!**4+A+A4I\]DdK 	$00$
C3T:		s   AA? ?Bc                 @    t        d||       | j                  |       y )Nr`   )r   rZ   )r   r"   	type_names      r   r`   z#ConnectionTracker._cleanup_disposed   s    &	48  &r   c                    | j                  |||      }| j                  |       |r |j                  ||g| }n|j                  ||      }||f| j                  |<   t	        d|d|       | j                  |||       y)z0
        Wrapper for instance.connect()
        	connectedr(   N)rT   rZ   connectrM   r   ra   r   rR   rS   r!   datar"   rX   s          r   rf   zConnectionTracker.connect   s     zz(FH5  &(((ADAI ((:I"+X!6;dI6  x:r   c                     | j                  |||      }| j                  |       |r|j                  |||      }n|j                  ||      }||f| j                  |<   t	        d|d|       | j                  |||       y)z6
        Wrapper for instance.connect_after()
        zconnected afterr(   N)rT   rZ   connect_afterrM   r   ra   rg   s          r   rj   zConnectionTracker.connect_after   s     zz(FH5  & ..vxFI ..vx@I"+X!6$dD)<  x:r   c                     | j                  |||      }| j                  |   r2| j                  |   d   j                  | j                  |   d          yy)z7
        Wrapper for g_signal_handler_block().
        r>   r   N)rT   rM   handler_blockrQ   s        r   rl   zConnectionTracker.handler_block   sW     zz(FH5D!T"1%33D4D4DT4J14MN "r   c                     | j                  |||      }| j                  |   r2| j                  |   d   j                  | j                  |   d          yy)z8
        Wrapper for g_signal_handler_unblock()
        r>   r   N)rT   rM   handler_unblockrQ   s        r   rn   z!ConnectionTracker.handler_unblock   sW     zz(FH5D!T"1%55d6F6Ft6LQ6OP "r   c                 d    | j                  |||      }t        d|       | j                  |       y)z3
        Wrapper for instance.disconnect()
        rW   N)rT   r   rZ   rQ   s        r   rW   zConnectionTracker.disconnect   s.     zz(FH5<&  &r   c                    t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d	       t        d       t        | j                        d
kD  rt        d       t        d       d}| j                  D ]  }t        |       |dz  } t        d|z         t        d       y )Nr   r<   zC * Currently only these signals should remain after deactivation: *zC * g-signal - mediaPlayerWatcher.py (player listener)             *zC * idle-changed - manager.py (idle listener for GnomeSession)     *zC * lock - singletons.py (logind/consolekit listeners              *zC * unlock - singletons.py (logind/consolekit listeners            *zC * active - singletons.py (logind/consolekit listeners            *r=      z!****** Leftover signal handlers!!zConnection tracker dump:r   r>   z%d connections total)r   lenrM   )r   r?   
connections      r   dump_connections_listz'ConnectionTracker.dump_connections_list   s    b	STSTSTSTSTSTSTTUb	t 1$56()** 	J*FA	 	$q()b	r   N)rB   rC   rD   rE   r   rT   rZ   ra   r`   rf   rj   rl   rn   rW   rt   rF   r   r   rK   rK   h   sA    
n ;';";"OQ'r   rK   c                      t         S r   )connection_trackerrF   r   r   con_tracker_getrw      s    r   N)gi.repositoryr   r   r   r   r   r   r   r   rH   rI   rK   rv   rw   rF   r   r   <module>ry      s[    (	
C CL J JX '( r   