
    g
f\                        d Z dZdZdZdZdZddlZddlZddlm	Z	 ddl
Z
 e
j                  d	d
       ddlmZ ddlmZ 	  e
j                  dd       ddlmZ dZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z"  G d d       Z# G d! d"      Z$ G d# d$      Z% e%       Z&d% Z'y# e$ r dZY zw xY w)&zMouse review mode.z$Id$z
$Revision$z$Date$z@Copyright (c) 2008 Eitan IsaacsonCopyright (c) 2016 Igalia, S.L.LGPL    N)dequeAtspiz2.0)r   )GLibWnckz3.0)r   TF   )cmdnames)debug)focus_manager)keybindings)input_event)messages)script_manager)settings_manager)AXComponent)AXObject)AXText)AXUtilitiesc                   6    e Zd ZdZd	dZd Zd Zd Zd Zd Z	y)
_StringContextz8The textual information associated with an _ItemContext.Nc                     || _         || _        || _        || _        || _        t        j                  |||      | _        y)a  Initialize the _StringContext.

        Arguments:
        - string: The human-consumable string
        - obj: The accessible object associated with this string
        - start: The start offset with respect to entire text, if one exists
        - end: The end offset with respect to the entire text, if one exists
        - script: The script associated with the accessible object
        N)_obj_script_string_start_endr   get_range_rect_rect)selfobjscriptstringstartends         3/usr/lib/python3/dist-packages/orca/mouse_review.py__init__z_StringContext.__init__?   s=     		**3s;
    c                     |d uxrj | j                   |j                   k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S N)r   r   r   r   r   others     r%   __eq__z_StringContext.__eq__Q   sg    D  (		UZZ'(-( u||+( 		UZZ'		(r'   c                 "   |y| j                   r|j                   sy| j                         }|dk(  ry|j                         }|dk(  ry|d   |d   k7  rQ| j                   |j                   k(  r8| j                  j                  d      }|r|d   |z  |d   k(  rg |dd |d   }t	        j
                         }|\  |_        |_        |_        |_	        t	        j
                         }|\  |_        |_        |_        |_	        t        j                  ||      |k7  ry| j                  r&| j                  j                         |j                  v syd| j                  d|j                  dg}t        j                  t        j                  |d	       y	)
-Returns True if this is a substring of other.F)r   r   r   r      
r   zMOUSE REVIEW: 'z' is substring of ''T)r   getBoundingBoxr   countr   Rectxywidthheightr   get_rect_intersectionstripr
   printTokens
LEVEL_INFO)r   r+   thisBoxotherBoxthisNewLineCountthisRect	otherRecttokenss           r%   isSubstringOfz_StringContext.isSubstringOfX   sg    =		ejj%%'l"'')|#
 1:!$ejj)@#||11$7GAJ1A$AXa[$P471Q<4!4::<BI?
HJJJL	FNC	Y[)/93C,,XyAXM!3!3!5!F#T\\3H%--Y\]%**FD9r'   c                     | j                   j                  | j                   j                  | j                   j                  | j                   j                  fS )z>Returns the bounding box associated with this context's range.)r   r5   r6   r7   r8   r   s    r%   r2   z_StringContext.getBoundingBox   s7     zz||TZZ\\4::+;+;TZZ=N=NNNr'   c                     | j                   S z0Returns the string associated with this context.)r   rE   s    r%   	getStringz_StringContext.getString   s     ||r'   c                    | j                   s(d}t        j                  t        j                  |d       y| j                  s(d}t        j                  t        j                  |d       y| j                   j
                  j                  | j                  | j                        }| j                   j                  j                  | j                        }t        j                         j                  | j                  | j                  | j                  t        j                         | j                   j!                  ||d       | j                   j#                  | j                  d       y)"Presents this context to the user.z2MOUSE REVIEW: Not presenting due to lack of scriptTFz2MOUSE REVIEW: Not presenting due to lack of string)r    r"   )voice	interrupt)r   r
   printMessager<   r   speechGeneratorrK   r   	utilitiesadjustForRepeatsr   
getManageremit_region_changedr   r   MOUSE_REVIEWspeakMessagedisplayBrailleMessage)r   msgrK   r"   s       r%   presentz_StringContext.present   s     ||FCu//d;||FCu//d;,,22tyy2V''88F  "66IIt{{DII}/I/I	K!!&!G**4<<<r'   )N r   r   )
__name__
__module____qualname____doc__r&   r,   rC   r2   rH   rX    r'   r%   r   r   <   s%    B<$(%NO

r'   r   c                   `    e 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 Zd Zd Zd Zy)_ItemContextz;Holds all the information of the item at a specified point.Nc                     || _         || _        || _        || _        || _        || _        | j                         | _        t        j                         | _	        t        j                  |      | _        y)a  Initialize the _ItemContext.

        Arguments:
        - x: The X coordinate
        - y: The Y coordinate
        - obj: The accessible object of interest at that coordinate
        - boundary: The accessible-text boundary type
        - frame: The containing accessible object (often a top-level window)
        - script: The script associated with the accessible object
        N)_x_yr   	_boundary_framer   _getStringContextr   time_timer   get_rectr   )r   r5   r6   r    boundaryframer!   s          r%   r&   z_ItemContext.__init__   s]     	!--/YY[
 ))#.
r'   c                     |d uxrO | j                   |j                   k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r)   )re   r   r   r*   s     r%   r,   z_ItemContext.__eq__   sP    D  .u||+.		UZZ'. -	.r'   c                    | j                   |j                   k7  s| j                  |j                  k7  r(d}t        j                  t        j                  |d       y| j                         rI|j                         r9| j                  |      s(d}t        j                  t        j                  |d       y| j                  |j                  k(  rA| j                  |j                  k(  r(d}t        j                  t        j                  |d       y| j                  |j                  z
  }|dkD  r-d|dd	}t        j                  t        j                  |d       yd
}t        j                  t        j                  |d       y)Nz0MOUSE REVIEW: Not a duplicate: different objectsTFz1MOUSE REVIEW: Not a duplicate: not a substring ofz6MOUSE REVIEW: Treating as duplicate: mouse didn't moveg      ?z#MOUSE REVIEW: Not a duplicate: was z.2fzs agoz#MOUSE REVIEW: Treating as duplicate)
r   re   r
   rN   r<   rH   _isSubstringOfrb   rc   rh   )r   priorrW   intervals       r%   _treatAsDuplicatez_ItemContext._treatAsDuplicate   s$   99

"dkkU\\&ADCu//d;>> 1$:M:Me:TECu//d;77ehh477ehh#6JCu//d;::+c>7~UKCu//d;35++S$7r'   c                 @    t        j                  | j                        S r)   )r   is_whitespace_or_emptyr   rE   s    r%   _treatAsSingleObjectz!_ItemContext._treatAsSingleObject   s    ,,TYY77r'   c                    | j                   r| j                  st        | j                        S | j                         r t        | j                  | j                         S 	 | j                   j                  j                  | j                  | j                  | j                  | j                        \  }}}|r1| j                   j                  j                  | j                  ||      }t        | j                  | j                   |||      S # t        $ rT}d| }t        j                  t        j                  |d       t        | j                  | j                         cY d}~S d}~ww xY w)z?Returns the _StringContext associated with the specified point.z/MOUSE REVIEW: Exception getting text at point: TN)r   r   r   rt   rP   textAtPointrb   rc   rd   	Exceptionr
   rN   r<   
expandEOCs)r   r"   r#   r$   errorrW   s         r%   rf   z_ItemContext._getStringContext   s    !$)),,$$&!$))T\\::	;!%!7!7!C!C		477DGGT^^"=FE3 \\++66tyy%MFdiivucJJ  	;CE7KCu//d;!$))T\\::	;s    AD	 		E&A	E!E&!E&c                    t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j
                  t         j                  j                  t         j                  j                  t         j                  j                  gt        j                  | j                  fd      S )Nc                 2    t        j                  |       v S r)   )r   get_role)r5   roless    r%   <lambda>z,_ItemContext._getContainer.<locals>.<lambda>   s    8;L;LQ;OSX;X r'   )r   RoleDIALOGFRAMELAYERED_PANEMENUPAGE_TABTOOL_BARWINDOWr   find_ancestorr   )r   r}   s    @r%   _getContainerz_ItemContext._getContainer   s}    ""!!(($$$$""$ %%dii1XYYr'   c                 L    | j                   j                  |j                         S )r.   )r   rC   r*   s     r%   rn   z_ItemContext._isSubstringOf   s     ||))%--88r'   c                     | j                   S )z;Returns the accessible object associated with this context.)r   rE   s    r%   	getObjectz_ItemContext.getObject  s     yyr'   c                     | j                   j                         \  }}}}|sX|sV| j                  j                  | j                  j                  | j                  j
                  | j                  j                  fS ||||fS )z6Returns the bounding box associated with this context.)r   r2   r   r5   r6   r7   r8   )r   r5   r6   r7   r8   s        r%   r2   z_ItemContext.getBoundingBox  sf     #ll99;1eV::<<tzz/?/?ARARRR!UF""r'   c                 6    | j                   j                         S rG   )r   rH   rE   s    r%   rH   z_ItemContext.getString  s     ||%%''r'   c                     | j                   S )z.Returns the time associated with this context.)rh   rE   s    r%   getTimez_ItemContext.getTime  s     zzr'   c                     | j                   r|j                   syt        j                  |j                         | j                   k7  ry| j                         ryt	        j
                  |j                         S )NF)r   r   
get_parentrt   r   is_link)r   ro   s     r%   _isInlineChildz_ItemContext._isInlineChild  sT    yy

uzz*dii7$$&""5::..r'   c                 |   | |k(  s| j                  |      r(d}t        j                  t        j                  |d       y| j                  xr | j                  |j                  k7  xsO t        j                  | j                  |j                  z
  dz  | j                  |j                  z
  dz  z         dkD  }|r| j                  j                          | j                  rB| j                  |j                  k7  r)| j                  j                  | j                  ddd       | j                  j                  j                  | j                        s(d}t        j                  t        j                  |d       y| j                  r| j                  |j                  k7  rj| j                  |      sX|j                  xs | j!                         }t#        j$                         j'                  | j                  t"        j(                         | j                  j                  | j                  |d	       | j*                  j-                         t/        j0                  | j                        k(  ry| j                  j                  j3                  | j                        syt5        j6                  | j                        rK| j*                  j-                         | j                  j                  j9                  | j                        k(  ry| j*                  |j*                  k7  r| j*                  j;                         ryy)
rJ   z-MOUSE REVIEW: Not presenting due to no changeTF      )alreadyFocusedinMouseReviewrL   zAMOUSE REVIEW: Not presenting object which lacks presentable text.)mode)priorObjr   )rq   r
   rN   r<   r   mathsqrtrb   rc   r   presentationInterruptre   presentObjectrP   hasPresentableTextr   r   r   rR   rS   rT   r   rH   r   get_nameisEditableTextArear   is_table_celldisplayedTextrX   )r   ro   rW   rL   r   s        r%   rX   z_ItemContext.present%  sY    5=D2259ACu//d;II9$))uzz"9 Qyy$''EHH,q0DGGehh4F3JJKbP 	 LL..0;;4;;%,,6LL&&t{{7;6:26 ' 8
 ||%%88CUCu//d;99ejj09L9LU9Szz9T%7%7%9H$$&::		 : : ; <LL&&tyy8SW&X||%%'8+<+<TYY+GG<<))<<TYYG((3<<))+t||/E/E/S/STXT]T]/^^<<5==(T\\-A-A-Cr'   )r   r   NNNN)rZ   r[   r\   r]   r&   r,   rq   rt   rf   r   rn   r   r2   rH   r   r   rX   r^   r'   r%   r`   r`      sH    E/,.48K,Z9

#(


/)r'   r`   c                   x    e Zd ZdZd ZddZddZd Zd Zd Z	d Z
d	 ZddZd Zd ZddZd Zd Zd Zd Zy
)MouseReviewerz(Main class for the mouse-review feature.c                 &   t        j                         j                  d      | _        t	               | _        d | _        g | _        g | _        i | _	        t        j                  j                  | j                        | _        d| _        t!               | _        | j%                  d      | _        t)        j*                         | _        t.        s(d}t1        j2                  t0        j4                  |d       y | j                  sy | j7                          y )NenableMouseReviewFT)MOUSE REVIEW ERROR: Wnck is not available)r   rR   
getSetting_activer`   _currentMouseOver
_workspace_windows_all_windows_handlerIdsr   EventListenernew	_listener_eventListenerinMouseEventr   _event_queueget_handlers	_handlersr   KeyBindings	_bindings_mouseReviewCapabler
   rN   r<   activater   rW   s     r%   r&   zMouseReviewer.__init__T  s    '224??@ST!-#1155dnnE!!G**40$002"=Cu//d;||r'   c                     |rCd}t        j                  t         j                  |d       | j                          | j                  S | j                  j                         r| j                          | j                  S )z%Returns the mouse-review keybindings.z"MOUSE REVIEW: Refreshing bindings.T)r
   rN   r<   _setup_bindingsr   isEmpty)r   refresh
is_desktoprW   s       r%   get_bindingszMouseReviewer.get_bindingsk  sd     6Cu//d;  " ~~ ^^##%  "~~r'   c                     |r7d}t        j                  t         j                  |d       | j                          | j                  S )z"Returns the mouse-review handlers.z"MOUSE REVIEW: Refreshing handlers.T)r
   rN   r<   _setup_handlersr   )r   r   rW   s      r%   r   zMouseReviewer.get_handlersw  s:     6Cu//d;  "~~r'   c                     i | _         t        j                  | j                  t        j
                        | j                   d<   d}t        j                  t        j                  |d       y)z.Sets up the mouse-review input event handlers.toggleMouseReviewHandlerzMOUSE REVIEW: Handlers set up.TN)	r   r   InputEventHandlertoggler	   MOUSE_REVIEW_TOGGLEr
   rN   r<   r   s     r%   r   zMouseReviewer._setup_handlers  sY      )),,. 	12
 /5++S$7r'   c           
      P   t        j                         | _        | j                  j                  t        j                  dt         j
                  t         j                  | j                  j                  d                   d}t        j                  t        j                  |d       y)z&Sets up the mouse-review key bindings.rY   r   zMOUSE REVIEW: Bindings set up.TN)r   r   r   add
KeyBindingdefaultModifierMaskNO_MODIFIER_MASKr   getr
   rN   r<   r   s     r%   r   zMouseReviewer._setup_bindings  s}     %002""//,,""#=>	@	A /5++S$7r'   c                 b   t         s(d}t        j                  t        j                  |d       yt	        j
                         j                         }d}d}|r7t        j
                         j                  t        j                  |      |      }|r|j                  j                  |      }t        |||      | _        | j                  j!                  d       t"        j$                  j'                         }|r|j)                         }|r|j+                          || _        |j/                         | _        | j0                  r| j3                          |j5                  d| j6                        }|| j8                  |<   |j5                  d| j:                        }|| j8                  |<   d| _        y)zActivates mouse review.r   TN)r    rk   r!   	mouse:abszwindow-stacking-changedzactive-workspace-changed)r   r
   rN   r<   r   rR   get_locus_of_focusr   	getScriptr   get_applicationrP   topLevelObjectr`   r   r   registerr   Screenget_defaultget_windows_stackedreverser   get_active_workspacer   _update_workspace_windowsconnect_on_stacking_changedr   _on_workspace_changedr   )r   rW   r    r!   rk   screenstackedis           r%   r   zMouseReviewer.activate  se    #=Cu//d; &&(;;=#..0::8;S;STW;XZ]^F$$33C8E!-#U6!R$$[1((*
 002G!$+!$99;DO..08$:S:STA"(DQ94;U;UVA"(DQr'   c                    | j                   j                  d       | j                  j                         D ]  \  }}|j	                  |        i | _        d| _        g | _        g | _        | j                  j                          d| _
        y)zDeactivates mouse review.r   NF)r   
deregisterr   items
disconnectr   r   r   r   clearr   )r   keyvalues      r%   
deactivatezMouseReviewer.deactivate  s     	&&{3**002 	"JCS!	"!r'   c                    t         sy| j                  sy| j                  j                         }t	        j                         | j                  j                         z
  dkD  r+d|dg}t        j                  t        j                  |d       y|S )z-Returns the accessible object being reviewed.Ng?zMOUSE REVIEW: Treatingzas staleT)	r   r   r   r   rg   r   r
   r;   r<   )r   r    rB   s      r%   getCurrentItemzMouseReviewer.getCurrentItem  sv     #||$$..099;//7799C?.Z@Fe..=
r'   Nc                    t         sy| j                   | _        t        j                         j	                  d| j                         | j                  s!| j                          t        j                  }n | j                          t        j                  }t        j                         j                         }||j                  |       yy)z!Toggle mouse reviewing on or off.Nr   )r   r   r   rR   
setSettingr   r   MOUSE_REVIEW_DISABLEDr   MOUSE_REVIEW_ENABLEDr   getActiveScriptpresentMessage)r   r!   eventrW   s       r%   r   zMouseReviewer.toggle  s     #<<'##%001DdllS||OO00CMMO//C**,<<>!!#& r'   c                     | j                   D cg c]  }|j                  | j                        r|! c}| _        y c c}w r)   )r   is_on_workspacer   r   )r   ws     r%   r   z'MouseReviewer._update_workspace_windows  s;    $($5$5 @q--doo>  @ @s   $<c                     |j                         }|j                          || _        | j                  r| j	                          yy)z3Callback for Wnck's window-stacking-changed signal.N)r   r   r   r   r   )r   r   r   s      r%   r   z"MouseReviewer._on_stacking_changed  s<     ,,.#??**, r'   c                 N    |j                         | _        | j                          y)z4Callback for Wnck's active-workspace-changed signal.N)r   r   r   )r   r   prev_wss      r%   r   z#MouseReviewer._on_workspace_changed  s      !557&&(r'   c                    d}| j                   D ]O  }|j                         r|j                         \  }}}}||cxk  r	||z   k  s8n ;||cxk  r	||z   k  sJn M|} n |sy|j                         }	|	syt	        j
                  |	j                               }
|
sy|z
  |z
  t        j                  |
fd      D cg c]  }| }}t        |      dk(  r|d   fS |j                         }|D cg c]  }t        j                  |      |k(  s| }}t        |      dk(  r|d   fS |D cg c]  }t	        j                  |      s| }}t        |      dk(  r|d   fS yc c}w c c}w c c}w )zVReturns the accessible window and window based coordinates for the screen coordinates.N)NrM   rM   c                 2    t        j                  |       S r)   )r   object_contains_point)r5   	relativeX	relativeYs    r%   r~   z;MouseReviewer._accessible_window_at_point.<locals>.<lambda>*  s    ;<<Q	9U r'   r   r   )r   is_minimizedget_client_window_geometryr   r   get_application_with_pidget_pidr   iter_childrenlenr   	is_active)r   pXpYwindowr   r5   r6   r7   r8   	windowAppappo
candidatesnamematchesr   r   s                  @@r%   _accessible_window_at_pointz)MouseReviewer._accessible_window_at_point  s     	A~~"#">">"@Aq%B#!e)#R(=1v:(=	 **,	2293D3D3FG F	F	!)!7!7U"W XAa X
 Xz?aa=)Y66 (IH,=,=a,@D,H1IIw<11:y)33%B)>)>q)A1BBw<11:y)33X J Cs   	E0:E5E58E:E:c                    |j                   |j                  }}| j                  ||      \  }}}d| d| d|g}t        j                  t        j
                  |d       |syt        j                         j                  t        j                  |            }|syt        j                         j                         }	t        j                  |	      rd}
n<t        j                  |	      r|	}
n$t        j                   |	t        j                        }
d}|
rIt#        j$                  |
||      }d|
d| d| d|g}t        j                  t        j
                  |d       |It#        j$                  |||      }d|d| d| d|g}t        j                  t        j
                  |d       t        j                         j                  t        j                  |      |      }|
rh|rft        j                   |t        j                        sBt#        j&                  ||
      r,d|d	|
g}t        j                  t        j
                  |d       y|j(                  j+                  |      }|re|j(                  j-                         rK|j(                  j/                         }||k7  r,d|d
|g}t        j                  t        j
                  |d       yd}| j0                  j3                         \  }}}}||cxk  r||z   k  r8n n5| j0                  j5                         rt6        j8                  j:                  }n|| j0                  j=                         k(  rt6        j8                  j>                  }net        j@                  |      rt6        j8                  j>                  }n5|j(                  jC                  |      rt6        j8                  j>                  }tE        | jF                        r(d}t        jH                  t        j
                  |d       ytK        ||||||      }|jM                  | j0                        r|| _        yy)zCallback for mouse:abs events.zMOUSE REVIEW: Window at (z, z) isTNzMOUSE REVIEW: Object inzat (zMOUSE REVIEW:zbelieved to be underzis not in active documentz MOUSE REVIEW: Mouse moved again.)'detail1detail2r  r
   r;   r<   r   rR   r   r   r   r   r   is_deadr   is_menur   r   get_descendant_at_pointobjects_overlaprP   getTopLevelDocumentForObjectinDocumentContentactiveDocumentr   r2   rH   r   TextBoundaryType
WORD_STARTr   
LINE_STARTis_selectableisMultiParagraphObjectr  r   rN   r`   rX   )r   r   r  r  r  windowXwindowYrB   r!   focusmenur    objDocumentdocumentrj   r5   r6   r7   r8   rW   r   s                        r%   _on_mouse_movedzMouseReviewer._on_mouse_moved9  s    B#'#C#CB#K -bTB4t<fE%**FD9**,66x7O7OPV7WX((*==?E"D  'D))%1D1DED55dGWMC/gYb	QU7VX[\Fe..=;55fgwOC/4y7)SW9XZ]^Fe..=**,66x7O7OPV7WY\]C 6 6sK<O<O P**35)30FM!!%"2"2FDA&&CCCH6++==?''668H;&)30KXV!!%"2"2FDA"44CCE1eV%1v:%$*@*@*J*J*L--88HD**4466--88H&&s+--88H44S9--88Ht  !4Cu//d;7GS(FFK;;t--.%(D" /r'   c                    | j                   sy | j                   j                         }t        | j                         ry t        j                         }d|j                  dg}t        j                  t
        j                  |d       d| _        | j                  |       d| _        dt        j                         |z
  dd}|d|j                   d	z  }t        j                  t
        j                  |d       y )
Nz
vvvvv PROCESS OBJECT EVENTvvvvvFTzTOTAL PROCESSING TIME: z.4fr0   z^^^^^ PROCESS OBJECT EVENT z ^^^^^
)r   popleftr  rg   typer
   r;   r<   r   r%  rN   )r   r   	startTimerB   rW   s        r%   _process_eventzMouseReviewer._process_event}  s      !!))+t  !IIK	0%**gF%**FE: U#!'		i(?'DBG,UZZLAA5++S%8r'   c                     |j                   j                  d      r<| j                  j                  |       t	        j
                  d| j                         yy)z(Generic listener for events of interest.r   2   N)r)  
startswithr   appendr   timeout_addr+  )r   r   s     r%   r   zMouseReviewer._listener  sE     ::  -$$U+R!4!45 .r'   )FT)F)NNr)   )rZ   r[   r\   r]   r&   r   r   r   r   r   r   r   r   r   r   r   r  r%  r+  r   r^   r'   r%   r   r   Q  sZ    2.
88'R$'(@-)+ZB)H9(6r'   r   c                      t         S r)   )	_reviewerr^   r'   r%   getReviewerr3    s    r'   )(r]   __id____version____date____copyright____license__r   rg   collectionsr   girequire_versiongi.repositoryr   r   r   r   rw   rY   r	   r
   r   r   r   r   r   r   ax_componentr   	ax_objectr   ax_textr   ax_utilitiesr   r   r`   r   r2  r3  r^   r'   r%   <module>rA     s   * 2    	   7E "   Bvu%"         %   %a aHn nbE6 E6P
 O	_    s   C CC