
    f
                     N   d Z ddlmZmZmZ ddlZddlZ ej                  e      Z	ddl
mZ  e        	 ddlmZ ddlmZmZmZmZ ddlmZ dd	lmZ  e       Z G d
 d      Z G d d      Z G d de      Z G d d      Zy# e$ rZe	j!                  d       Y dZ[ddZ[ww xY w)z GTK specific keyboard class     )divisionprint_functionunicode_literalsN)require_gi_versions)Atspiz,Atspi typelib missing, auto-show unavailable)RectEventSourceProcessunicode_str)Timer)Configc                   6   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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ed        Zd Zd Zd1dZ d Z!d  Z"d2d!Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d3d*Z,d+ Z-d, Z.d- Z/d. Z0d/ Z1d0 Z2y)4CachedAccessiblec                      || _         i | _        y N)_accessible_stateself
accessibles     ;/usr/lib/python3/dist-packages/Onboard/AtspiStateTracker.py__init__zCachedAccessible.__init__,   s    %    c                 >    |d uxr | j                   |j                   u S r   r   r   others     r   __eq__zCachedAccessible.__eq__1   s#    D JT%5%59J9J%JJr   c                 >    |d u xs | j                   |j                   uS r   r   r   s     r   __ne__zCachedAccessible.__ne__4   s"    }I 0 08I8I IIr   c                     | j                   S )z$ All cached state of the accessible )r   r   s    r   	get_statezCachedAccessible.get_state7   s    {{r   c                    | j                          | j                          | j                          | j                          | j	                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j!                          | j#                          | j%                          | j'                          | j(                  S )z~
        Return _state filled with all kinds of properties, for easy printint
        as debug output in TextContext.
        )get_roleget_role_nameget_nameget_state_setget_idget_attributesget_interfacesget_descriptionget_pidget_process_nameget_toolkit_nameget_toolkit_versionget_editable_text_ifaceget_app_nameget_app_descriptionget_extents	get_frameget_frame_extents	is_urlbaris_byobur   r"   s    r   get_all_statezCachedAccessible.get_all_state;   s    
 	  "$$&$$&  " {{r   c                 N    | j                  d| j                  j                        S )Nrole)
_get_valuer   r%   r"   s    r   r%   zCachedAccessible.get_roleY   $    v#//88: 	:r   c                 N    | j                  d| j                  j                        S )Nz	role-name)r<   r   r&   r"   s    r   r&   zCachedAccessible.get_role_name]   $    {#//==? 	?r   c                 N    | j                  d| j                  j                        S )Nname)r<   r   r'   r"   s    r   r'   zCachedAccessible.get_namea   r=   r   c                 &    | j                  d       y Nz	state-set
invalidater"   s    r   invalidate_state_setz%CachedAccessible.invalidate_state_sete   s    $r   c                 N    | j                  d| j                  j                        S rC   )r<   r   r(   r"   s    r   r(   zCachedAccessible.get_state_seth   r?   r   c                 N    | j                  d| j                  j                        S )Nid)r<   r   r)   r"   s    r   r)   zCachedAccessible.get_idl   s$    t#//668 	8r   c                 P    | j                  d| j                  j                  i       S )N
attributes)r<   r   r*   r"   s    r   r*   zCachedAccessible.get_attributesp   (    |#//>>D 	Dr   c                 P    | j                  d| j                  j                  g       S )N
interfaces)r<   r   r+   r"   s    r   r+   zCachedAccessible.get_interfacest   rL   r   c                 N    | j                  d| j                  j                        S )Ndescription)r<   r   r,   r"   s    r   r,   z CachedAccessible.get_descriptionx   s&    }#//??A 	Ar   c                 N    | j                  d| j                  j                        S )Npid)r<   r   get_process_idr"   s    r   r-   zCachedAccessible.get_pid|   s&    u#//>>@ 	@r   c                 Z    | j                         dk7  r| j                  dfd      S y )Nzprocess-namec                  .    t        j                         S r   )r
   r.   )rR   s   r   <lambda>z3CachedAccessible.get_process_name.<locals>.<lambda>   s    11#6 r   )r-   _get_value_noex)r   rR   s    @r   r.   z!CachedAccessible.get_process_name   s3    lln"9''68 8 r   c                 N    | j                  d| j                  j                        S )Nztoolkit-name)r<   r   r/   r"   s    r   r/   z!CachedAccessible.get_toolkit_name   s&    ~#//@@B 	Br   c                 N    | j                  d| j                  j                        S )Nztoolkit-version)r<   r   r0   r"   s    r   r0   z$CachedAccessible.get_toolkit_version   s'    0#//CCE 	Er   c                 N    | j                  d| j                  j                        S )Nzeditable-text-iface)r<   r   r1   r"   s    r   r1   z(CachedAccessible.get_editable_text_iface   s'    4#//GGI 	Ir   c                 4      fd} j                  d|d      S )Nc                  X    j                   j                         } | j                         S r   )r   get_applicationr'   appr   s    r   funcz+CachedAccessible.get_app_name.<locals>.func   s#    ""224C<<>!r   zapp-name r<   r   ra   s   ` r   r2   zCachedAccessible.get_app_name   s    	" z444r   c                 4      fd} j                  d|d      S )Nc                  X    j                   j                         } | j                         S r   )r   r^   r,   r_   s    r   ra   z2CachedAccessible.get_app_description.<locals>.func   s&    ""224C&&((r   zapp-descriptionrb   rc   rd   s   ` r   r3   z$CachedAccessible.get_app_description   s    	) 0$;;r   c                 &    | j                  d       y )NextentsrD   r"   s    r   invalidate_extentsz#CachedAccessible.invalidate_extents   s    	"r   c                      t         j                  dk7  r& j                         rdndt         j                  z   fd} j                  d|t	                     S )z,
        Screen rect after scaling.
              ?c                      j                   j                  t        j                  j                        } t        | j                  z  | j                  z  | j                  z  | j                  z        S r   )
r   r4   r   	CoordTypeSCREENr   xywidthheight)extscaler   s    r   ra   z*CachedAccessible.get_extents.<locals>.func   s[    ""..u/E/EFCsuuu}		E)3::+=? ?r   rh   )configwindow_scaling_factoris_toolkit_gtk3r<   r   )r   ra   rt   s   ` @r   r4   zCachedAccessible.get_extents   sV     ,,C< ##%f:::	?
 y$77r   c                 2      fd} j                  d|      S )Nc                  V    j                  j                        } | rt        |       S y r   )_get_accessible_framer   r   framer   s    r   ra   z(CachedAccessible.get_frame.<locals>.func   s*    ..t/?/?@E'..r   r|   rX   rd   s   ` r   r5   zCachedAccessible.get_frame   s    	 ##GT22r   c                 2      fd} j                  d|      S )Nc                  \    j                         } | r| j                         S t               S r   )r5   r4   r   r{   s    r   ra   z0CachedAccessible.get_frame_extents.<locals>.func   s(    NN$E((**6Mr   frame_extentsr}   rd   s   ` r   r6   z"CachedAccessible.get_frame_extents   s    	 ##OT::r   c                 .   d}t         j                  d       	 | }	 |j                         }|s	 |S |j                         }t         j                  dj	                  |             |t
        j                  j                  k(  sW|t
        j                  j                  k(  s:|t
        j                  j                  k(  s|t
        j                  j                  k(  r|}	 |S # t        $ r,}t         j                  dt        |      z          Y d}~|S d}~ww xY w)zA Accessible of the top level window to which accessible belongs. Nz1_get_accessible_frame(): searching for top level:z
parent: {}z8Invalid accessible, failed to get top level accessible: )_loggeratspi
get_parentr%   formatr   RoleFRAMEDIALOGWINDOWNOTIFICATION	Exceptionr   )r   r|   parentr;   exs        r   rz   z&CachedAccessible._get_accessible_frame   s     IJ	+F**,  (l11$785::+++5::,,,5::,,,5::222"E %   	+MM B%b/* + + 		+s#   C B*C C 	D(!DDc                 2      fd} j                  d|      S )z+ Is this a (most likely firefox') URL bar? c                  f    j                         } t        | xr d| j                  dd      v       S )Nurlbarclassrb   )r*   boolget)rK   r   s    r   ra   z(CachedAccessible.is_urlbar.<locals>.func   s1    ,,.J
Nx:>>'23N'NOOr   r7   r}   rd   s   ` r   r7   zCachedAccessible.is_urlbar   s    	P ##K66r   c                 2      fd} j                  d|      S )z/ Is this possibly byobu running in a terminal? c                  b    j                         } t        | xr d| j                         v       S )Nbyobu)r,   r   lower)rP   r   s    r   ra   z'CachedAccessible.is_byobu.<locals>.func   s/    ..0KF;3D3D3F(FGGr   r8   r}   rd   s   ` r   r8   zCachedAccessible.is_byobu   s    	H ##J55r   Nc                     | j                   j                  |      }|	  |       }|| j                   |<   |S # t        $ r<}t        j	                  dj                  |      t        |      z          |}Y d}~Qd}~ww xY w)' Return cached return value of func(). NzKCachedAccessible._get_value({}): invalid accessible, failed to read state: )r   r   r   r   infor   r   )r   rA   ra   defaultvaluer   s         r   r<   zCachedAccessible._get_value   sy    %=  !&DKK    J$fTl[_= >  	 s   7 	A< 2A77A<c                 l    | j                   j                  |      }| |       }|| j                   |<   |S )r   )r   r   )r   rA   ra   r   s       r   rX   z CachedAccessible._get_value_noex  s3    %=FE %DKKr   c                 >    	 | j                   |= y# t        $ r Y yw xY w)z
        Force re-reading property from the accessible.
        May cause a D-Bus round-trip on the next read-attempt.
        N)r   KeyError)r   rA   s     r   rE   zCachedAccessible.invalidate  s%    
	D! 		s    	c                 0   d }	 | j                   j                  |      }|j                  }|j                  }|dkD  r"|dkD  r||k  r|j                  |j                  f}|S # t        $ r,}t
        j                  dt        |      z          Y d }~|S d }~ww xY w)Nr   z"CachedAccessible.get_selection(): )r   get_selectionstart_offset
end_offsetr   r   r   r   )r   selection_num	selectionselstartendr   s          r   r   zCachedAccessible.get_selection  s    		*""00?C
 $$E..CqyQw| --s~~>	   	*LL=$R) * *	*s   AA   	B)!BBc                     	 | j                   j                  |       y # t        $ r+}t        j	                  dt        |      z          Y d }~y d }~ww xY w)Nz%CachedAccessible.set_caret_offset(): )r   set_caret_offsetr   r   r   r   r   offsetr   s      r   r   z!CachedAccessible.set_caret_offset.  sK    	*--f5 	*LL@$R) * *	*    	A!AAc                     	 | j                   j                  ||d      S # t        $ r+}t        j	                  dt        |      z          Y d }~yd }~ww xY w)NrU   z CachedAccessible.insert_text(): F)r   insert_textr   r   r   r   )r   positiontextr   s       r   r   zCachedAccessible.insert_text5  sU    	*##//$CC 	*LL;$R) * *	*s    	A!AAc                     	 | j                   j                  ||      S # t        $ r+}t        j	                  dt        |      z          Y d }~yd }~ww xY w)Nz CachedAccessible.delete_text(): F)r   delete_textr   r   r   r   )r   	start_posend_posr   s       r   r   zCachedAccessible.delete_text=  sS    	*##//	7CC 	*LL;$R) * *	*r   c                     	 | j                   j                         }|S # t        $ r(}t        j	                  dt        |      z          |d }~ww xY w)Nz%CachedAccessible.get_caret_offset(): )r   get_caret_offsetr   r   r   r   r   s      r   r   z!CachedAccessible.get_caret_offsetG  sT    	%%668F
 	  	LL@$R) *H	    	A#A

Ac                     	 | j                   j                         }|S # t        $ r(}t        j	                  dt        |      z          |d }~ww xY w)Nz(CachedAccessible.get_character_count(): )r   get_character_countr   r   r   r   )r   countr   s      r   r   z$CachedAccessible.get_character_countP  sT    	$$88:E
 	  	LLC$R) *H	r   c                     	 | j                   j                  ||      }|S # t        $ r(}t        j	                  dt        |      z          |d }~ww xY w)Nz'CachedAccessible.get_text_at_offset(): )r   get_text_at_offsetr   r   r   r   r   r   boundary_typer   r   s        r   r   z#CachedAccessible.get_text_at_offsetY  sX    	##66v}MD
 	  	LLB$R) *H	     	A#AAc                     	 | j                   j                  ||      }|S # t        $ r(}t        j	                  dt        |      z          |d }~ww xY w)Nz+CachedAccessible.get_text_before_offset(): )r   get_text_before_offsetr   r   r   r   r   s        r   r   z'CachedAccessible.get_text_before_offsetb  s\    	##::6;HJD 	  	LLF$R) *H	r   c                     	 t         j                  j                  | j                  ||      }|S # t        $ r(}t
        j                  dt        |      z          |d}~ww xY w)z* Text of the given accessible, no caching zCachedAccessible.get_text(): N)r   Textget_textr   r   r   r   r   )r   beginr   r   r   s        r   r   zCachedAccessible.get_textl  s^    	::&&t'7'7DD 	  	MM9%b/* +H	s   +/ 	A #AA c                     |r| j                          | j                         }|)|j                  t        j                  j
                        S yNF)rF   r(   containsr   	StateTypeFOCUSED)r   rE   	state_sets      r   
is_focusedzCachedAccessible.is_focusedz  sC    %%'&&(	 %%eoo&=&=>>r   c                    | j                         }| j                         }||t        j                  j                  t        j                  j
                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                   t        j                  j"                  fv rI|t        j                  j
                  fv s+|*|j%                  t        j&                  j(                        ryy)z4 Is this an accessible onboard should be shown for? TF)r%   r(   r   r   TEXTTERMINALDATE_EDITORPASSWORD_TEXTEDITBARENTRYDOCUMENT_TEXTDOCUMENT_FRAMEDOCUMENT_EMAILSPIN_BUTTON	COMBO_BOX	PARAGRAPHHEADERFOOTERr   r   EDITABLEr   r;   r   s      r   is_editablezCachedAccessible.is_editable  s)   MMO&&(	 



++

..

00

**

((

00

11

11

..

,,

..

,,

))

))   EJJ//00)&&u'?'?@r   c                    | j                         }| j                         }|b|t        j                  j                  t        j                  j
                  fv r,|*|j                  t        j                  j                        syy)zw
        Is this accessible unlikely to steal the focus from
        a previously focused editable accessible?
        TF)	r%   r(   r   r   r   LINKr   r   r   r   s      r   is_not_focus_stealingz&CachedAccessible.is_not_focus_stealing  so    
 MMO&&(	  

11

  (%%eoo&>&>?r   c                 |    | j                         }|xr) |j                  t        j                  j                        S )z) Is accessible a single line text entry? )r(   r   r   r   SINGLE_LINE)r   r   s     r   is_single_linezCachedAccessible.is_single_line  s0    &&(	LY//0K0KLLr   c                 F    | j                         }|xr d|v xr |d   dk(  S )z3 Are the accessible attributes from a gtk3 widget? toolkitgtk)r*   )r   rK   s     r   rw   z CachedAccessible.is_toolkit_gtk3  s:    ((*
 G#G(29(=(F	Gr   c                     	 | j                  |      }|S # t        $ r6}t        j                  dt	        |      z          t               }Y d}~|S d}~ww xY w)z( Screen rect of the character at offset z5Invalid accessible, failed to get character extents: N)_get_character_extentsr   r   r   r   r   )r   r   r   rectr   s        r   get_character_extentsz&CachedAccessible.get_character_extents  s[    	..v6D   	MM ?%b/* + 6D	s    	A+AAc                 d   t         j                  }|dk7  r&| j                         rd}ndt         j                  z  }| j                  j	                  |t
        j                  j                        }t        |j                  |z  |j                  |z  |j                  |z  |j                  |z        S )zz
        Screen rect of the character at offset of the accessible, little
        caching and exception handling.
        rk   )ru   rv   rw   r   r   r   rm   rn   r   ro   rp   rq   rr   )r   r   rt   rs   s       r   r   z'CachedAccessible._get_character_extents  s    
 ,,C< ##%f:::44V5:__5K5KM CEEEM3555=II%szzE'9; 	;r   r   )r   F)3__name__
__module____qualname__r   r   r    r#   r9   r%   r&   r'   rF   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   ri   r4   r5   r6   staticmethodrz   r7   r8   r<   rX   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   r   r    r   r   r   r   +   s   
KJ<:?:%?8DDA@BEI5<#8*3;  476 &*
8&M
G
;r   r   c                       e Zd ZdZd Zd Zy)
AsyncEventzS
    Decouple AT-SPI events from D-Bus calls to reduce the risk for deadlocks.
    c                 H    | j                   j                  |       || _        y r   )__dict__update_kwargs)r   kwargss     r   r   zAsyncEvent.__init__  s    V$r   c                     t        |       j                  dz   dj                  d | j                  j	                         D              z   dz   S )N(z, c              3   V   K   | ]!  \  }}t        |      d z   t        |      z    # yw)=N)strrepr).0keyvals      r   	<genexpr>z&AsyncEvent.__repr__.<locals>.<genexpr>  s-      <"#s #hntCy0 <s   ')))typer   joinr   itemsr"   s    r   __repr__zAsyncEvent.__repr__  sN    Dz""S(II <&*ll&8&8&:< <<  	r   N)r   r   r   __doc__r   r	  r   r   r   r   r     s    r   r   c                      e Zd ZdZdZdZdZdZeez   ez   ez   ZdZ	dZ
dZdZdZdZdZdZdZ 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 d Z!d Z"d Z#d Z$d Z%d Z&d'dZ'd Z(d Z)d Z*d  Z+d! Z,d" Z-d# Z.d$ Z/d% Z0d& Z1y)(AtspiStateTrackerza
    Keeps track of the currently active accessible by listening
    to AT-SPI focus events.
    )text-entry-activated)text-changedtext-caret-moved)key-pressed)async-focus-changedasync-text-changedasync-text-caret-movedFNg        c                     t        | d      s8t        j                  | g|i || _        | j                  j	                          | j                  S )z"
        Singleton magic.
        r   )hasattrobject__new__r   	construct)clsargsr   s      r   r  zAtspiStateTracker.__new__  sA     sF#~~c;D;F;CHHH xxr   c                      y)z8
        Called multiple times, don't use this.
        Nr   r"   s    r   r   zAtspiStateTracker.__init__  s     	r   c                 R    t        j                  | | j                         d| _        y)z8
        Singleton constructor, runs only once.
        FN)r	   r   _event_names_frozenr"   s    r   r  zAtspiStateTracker.construct   s!     	T4#4#45r   c                 P    t        j                  |        | j                  d       y r   )r	   cleanup_register_atspi_listenersr"   s    r   r   zAtspiStateTracker.cleanup(  s    D!&&u-r   c                 R    t        j                  | ||       | j                          y r   )r	   connect_update_listeners)r   
event_namecallbacks      r   r#  zAtspiStateTracker.connect,  s     D*h7 r   c                     | j                  | j                        }t        j                  | ||       | j	                          |r2| j                  | j                        st
        j                  d       y y y )Nzall listeners disconnected)has_listenersr  r	   
disconnectr$  r   r   )r   r%  r&  had_listenerss       r   r)  zAtspiStateTracker.disconnect0  sc    **4+<+<=tZ:  !3!3D4E4E!FLL56 "G=r   c                    | j                  | j                        }| j                  |       | j                  | j                        }| j	                  |       | j                  | j
                        }| j                  |       y r   )r(  _focus_event_names_register_atspi_focus_listeners_text_event_names_register_atspi_text_listeners_key_stroke_event_names#_register_atspi_keystroke_listenersr   registers     r   r$  z#AtspiStateTracker._update_listeners:  sn    %%d&=&=>,,X6%%d&<&<=++H5%%d&B&BC00:r   c                 j    | j                  |       | j                  |       | j                  |       y r   )r-  r/  r1  r2  s     r   r!  z+AtspiStateTracker._register_atspi_listenersD  s,    ,,X6++H500:r   c           	      `   dt               vry | j                  |k7  r|r| j                  dd| j                         | j                  dd| j                         | j
                  D ]8  }d|j                  dd      z   }t        j                  | |t        | |             : n| j                  j                          | j                  dd       | j                  dd       | j
                  D ]8  }d|j                  dd      z   }t        j                  | |t        | |             : || _        y y )	Nr   _listener_focusfocus_listener_object_focuszobject:state-changed:focused_on_-_)globals_focus_listeners_registeredatspi_connect_on_atspi_global_focus_on_atspi_object_focus_async_event_namesreplacer	   r#  getattr_poll_unity_timerstopatspi_disconnectr)  )r   r3  rA   handlers       r   r-  z1AtspiStateTracker._register_atspi_focus_listenersI  s8   ')#++x7""#4#*#'#>#>@ ""#;#A#'#>#>@
 !33 LD$t||C'==G''dGD'4JKL &&++-%%&7&-/%%&>&DF !33 OD$t||C'==G**4wtW7MNO 08D,5 8r   c                 x   dt               vry | j                  |k7  r|r_| j                  dd| j                         | j                  dd| j                         | j                  dd| j                         || _        y | j                  dd       | j                  dd       | j                  dd       || _        y )Nr   _listener_text_changedzobject:text-changed:insertzobject:text-changed:delete_listener_text_caret_movedzobject:text-caret-moved)r<  _text_listeners_registeredr>  _on_atspi_text_changed_on_atspi_text_caret_movedrF  r2  s     r   r/  z0AtspiStateTracker._register_atspi_text_listenersi  s    ')#**h6""#;#?#'#>#>@ ""#;#?#'#>#>@ ""#?#<#'#B#BD +3' %%&>&BD%%&>&BD%%&B&?A +3'r   c                 &   dt               vry | j                  |k7  rt        d      }|r| j                  s/t        j
                  j                  | j                  d       | _        |D ]U  }t	        j                  | j                  d |t        j                  j                  t        j                  j                         W || _        y dg}|D ]<  }t	        j                  | j                  d |t        j                  j                         > || _        y )Nr         )r<  _keystroke_listeners_registeredrange_keystroke_listenerr   DeviceListenernew_on_atspi_keystrokeregister_keystroke_listenerKeyEventTypePRESSEDKeyListenerSyncTypeSYNCHRONOUSderegister_keystroke_listener)r   r3  modifier_masksmodifier_masks       r   r1  z5AtspiStateTracker._register_atspi_keystroke_listeners  s    ')#//8;"2YN//,,001I1I157 , &4 ?M5500%**2211==??, 08, #$%3 4M7700%**22	44 08,r   c                     t        | |      rt        | |      }nd}|-t        j                  j	                  |d      }t        | ||       |j                  |       y)z
        Start listening to an AT-SPI event.
        Creates a new event listener for each event, since this seems
        to be the only way to allow reliable deregistering of events.
        N)r  rC  r   EventListenerrU  setattrr3  )r   	attributeeventr&  listeners        r   r>  zAtspiStateTracker.atspi_connect  sW     4#tY/HH**..x>HD)X.% r   c                 >    t        | |      }|j                  |       y)z1
        Stop listening to AT-SPI event.
        N)rC  
deregister)r   rb  rc  rd  s       r   rF  z"AtspiStateTracker.atspi_disconnect  s     4+E"r   c                 4    | j                  d       d| _        y)zj
        Freeze AT-SPI message processing, e.g. while displaying
        a dialog or popoup menu.
        FTN)r!  r  r"   s    r   freezezAtspiStateTracker.freeze  s    
 	&&u-r   c                 2    | j                          d| _        y)z3
        Resume AT-SPI message processing.
        FN)r$  r  r"   s    r   thawzAtspiStateTracker.thaw  s     	 r   c                 R    | j                   st        j                  | |g|i | y y r   )r  r	   
emit_async)r   r%  r  r   s       r   rl  zAtspiStateTracker.emit_async  s(    ||""4EdEfE r   c                      |rt        |      S d S r   )r   r   s     r   _get_cached_accessiblez(AtspiStateTracker._get_cached_accessible  s      
+ 	$#	$r   c                 (    | j                  |d       y )NT_on_atspi_focusr   rc  	user_datas      r   r?  z(AtspiStateTracker._on_atspi_global_focus  s    UD)r   c                 &    | j                  |       y r   rp  rr  s      r   r@  z(AtspiStateTracker._on_atspi_object_focus  s    U#r   c                     t        |      xs t        |j                        }t        | j                  |j                        |      }| j                  d|       y )N)r   focusedr  )r   detail1r   rn  sourcerl  )r   rc  focus_receivedrv  aes        r   rq  z!AtspiStateTracker._on_atspi_focus  sM    ' '& 	4#>#>u||#L ')-r2r   c                     t        | j                  |j                        |j                  |j                  |j
                        }| j                  d|       y)N)r   r  poslengthr  F)r   rn  rx  r  rw  detail2rl  r   rc  rs  rz  s       r   rL  z(AtspiStateTracker._on_atspi_text_changed  sH     4#>#>u||#L"ZZ!MM$}}. 	,b1r   c                     t        | j                  |j                        |j                        }| j	                  d|       y)N)r   caretr  F)r   rn  rx  rw  rl  r  s       r   rM  z,AtspiStateTracker._on_atspi_text_caret_moved  s8     4#>#>u||#L#mm-0"5r   c                 V   |j                   t        j                  j                  k(  rt        j                  dj                  |j                  |j                  |j                  |j                               t        |j                  |j                        }| j                  d|       y)Nzkey-stroke {} {} {} {})hw_code	modifiersr  F)r  r   	EventTypeKEY_PRESSED_EVENTr   r   r   r  r  rI   is_textr   rl  r  s       r   rV  z%AtspiStateTracker._on_atspi_keystroke  sv    :::::MM2!6%//"'--5==JK EMM&+oo7BOOM2.r   c                    |j                   }|j                  }| j                  ry | j                  ||       |sy |j	                         j                         }|dk(  r| j                  |       y | j                  |       y )Nunity)r   rv  r  _log_accessibler2   r   _handle_focus_changed_unity_handle_focus_changed_apps)r   rc  r   rv  app_names        r   _on_async_focus_changedz)AtspiStateTracker._on_async_focus_changed  ss    %%
-- <<Z1**,224w,,U3++E2r   c                 
   |j                   }|j                  }| j                  |k(  r
|sd| _        n|j                         }|r| j                  j                          |j                         r|| _        || _        n|j                         rd| _        d| _        nmt        j                         }|rW|| j                  z
  dkD  rE| j                  |k7  r6d| _        t        j                  dj                  | j                  |             | j                  }|r\|j                  d      sK| j                  j                         xr+ |j!                         t"        j$                  j&                  k(  }|sd}| j)                  |       y)z& Focus change in regular applications N      ?z0Dropping accessible due to pid change: {} != {} T)r   rv  _focused_accessibler-   rD  rE  r   _focused_pidr   time"_active_accessible_activation_timer   r   r   r   r7   r%   r   r   	MENU_ITEM_set_active_accessible)r   rc  r   rv  rR   nowactive_accessibleis_firefox_completions           r   r  z,AtspiStateTracker._handle_focus_changed_apps  s^   %%
-- ##z1+/($$&C&&++-))+/9D,(+D%
  557/3D,(,D% ))+CTDDDrI,,37;D4#MM +B+16$2C2CS+IK
 !44 ++D1 ((224 >##%)=)== " )$(!##$56r   c                     |j                   |j                  }|rЉj                         r _         j	                          fd}j                         }|j                         }t        j                  dj                  t        j                  |                   |rG|j                  t        j                  j                        r j                   j#                  d|       yyyyy)z Focus change in Unity Dash c                  <   j                         } | j                         }t        j                  dj	                  t
        j                  |                   |r)|j                  t        j                  j                        sd _        j                  d        yy)Nz polling unity dash state_set: {}FT)r5   r(   r   debugr   AtspiStateType
to_stringsr   r   r   ACTIVEr  r  )r|   r   r   r   s     r   _poll_unity_dashzGAtspiStateTracker._handle_focus_changed_unity.<locals>._poll_unity_dashk  s}    ",,.!//1	6VN55i@AC ! ))%//*@*@A/3D,//5 r   zdash focused, state_set: {}r  N)r   rv  r   r  r  r5   r(   r   r  r   r  r  r   r   r   r  rD  r   )r   rc  rv  r  r|   r   r   s   `     @r   r  z-AtspiStateTracker._handle_focus_changed_unityX  s    %%
-- !!#'1D$''
3& ((*E++-IMM-11)<=? !!%//"8"89&&,,S2BC : ? $ r   c                     | j                   |k7  rg|| _         | j                   s| j                  rG| j                  d| j                          | j                   | _        t        j                         | _        y y y )Nr  )_active_accessible_last_active_accessibleemitr  r  r   s     r   r  z(AtspiStateTracker._set_active_accessible  sg    ""j0&0D#&&++ 		0$2I2IJ/3/F/F,:>))+7 ,	 1r   c                 ,   |j                   | j                  k(  r{|j                  }|j                  d      }|j                  d      }|s|r||_        | j                  d|       y t        j                  dj                  |j                               y y )N)insertzinsert:system)deletezdelete:systemr  z/_on_async_text_changed: unknown event type '{}')	r   r  r  endswithr  r  r   warningr   )r   rc  r  r  r  s        r   _on_async_text_changedz(AtspiStateTracker._on_async_text_changed  s{    t666::D]]#>?F]]#>?F%		.%0 !:!'

!35 7r   c                 \    |j                   | j                  k(  r| j                  d|       y y )Nr  )r   r  r  )r   rc  s     r   _on_async_text_caret_movedz,AtspiStateTracker._on_async_text_caret_moved  s*    t666II(%0 7r   c           
      N   t         j                  t         j                        rdj                  |      }|dj                  |      z  }|r|j	                         }|j                         }|j                         }|j                         }|j                  }|r)|j                  t        j                  j                        nd }	|j                         }
|dj                  |t        |      |r|j                  n|t        |      |	||
      z  }t         j!                  |       y y )Nz AT-SPI focus event: focused={}, zaccessible={}, z_name={name}, role={role}({role_name}), editable={editable}, states={states}, extents={extents}])r   rA   r;   	role_nameeditablestatesrh   )r   isEnabledForLEVEL_ATSPIr   r'   r%   r&   r(   r  r   r   r   r   r4   r   
value_namer   )r   r   rv  msgrA   r;   r  r   r  r  rh   s              r   r  z!AtspiStateTracker._log_accessible  s    3 344;;GDC$++J77C!**,!**,&446	&446	"))  %--eoo.F.FG&* $002 , *4:7;DOO)-i(0&,'.  !	! MM#1 5r   r   )2r   r   r   r
  r,  r.  r0  rA  r  r=  rQ  rK  rS  r  r  r  r  r  r   rD  r  r   r  r   r#  r)  r$  r!  r-  r/  r1  r>  rF  rh  rj  rl  rn  r?  r@  rq  rL  rM  rV  r  r  r  r  r  r  r  r   r   r   r  r    s"   
 8B.9 '&'%& ,,L
 #(&+#!& L),&".!7;;
8@32#8J! #F$*$3
3(>7@/DbF51r   r  c                   $    e Zd Zg dZed        Zy)r  )*r  ANIMATEDARMEDBUSYCHECKED	COLLAPSEDDEFUNCTr   ENABLED
EXPANDABLEEXPANDED	FOCUSABLEr   HAS_TOOLTIP
HORIZONTAL	ICONIFIEDINDETERMINATEINVALIDINVALID_ENTRY
IS_DEFAULTLAST_DEFINEDMANAGES_DESCENDANTSMODALMULTISELECTABLE
MULTI_LINEOPAQUErY  REQUIRED	RESIZABLE
SELECTABLESELECTABLE_TEXTSELECTED	SENSITIVESHOWINGr   STALESUPPORTS_AUTOCOMPLETION	TRANSIENT	TRUNCATEDVERTICALVISIBLEVISITEDc                     g }| Pt         j                  D ]=  }| j                  t        t        j
                  |            s-|j                  |       ? |S r   )r  r  r   rC  r   r   append)r   resultss      r   r  zAtspiStateType.to_strings  sN     #** %%%geooq&ABMM!$% r   N)r   r   r   r  r   r  r   r   r   r  r    s    *FX  r   r  )r
  
__future__r   r   r   r  logging	getLoggerr   r   Onboard.Versionr   gi.repositoryr   ImportErrorer  Onboard.utilsr   r	   r
   r   Onboard.Timerr   Onboard.Configr   ru   r   r   r  r  r   r   r   <module>r     s   ( $ A A  
'

H
% 1  D# F E # "	t; t;n P Pf4 4I  DOOBCCDs   B B$	BB$