
    g
f_                     r   d Z dZdZdZdZdZddlZ ej                  dd	       dd
lm	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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ZdZdZ G d d      Zd Z G d de      Z  G d  d!e      Z! G d" d#e      Z" G d$ d%      Z#y)&z+Provides support for handling input events.z$Id$z
$Revision$z$Date$zQCopyright (c) 2005-2008 Sun Microsystems Inc.Copyright (c) 2011-2016 Igalia, S.L.LGPL    NAtspiz2.0)r   )Gdk)GLib   )debug)focus_manager)keybindings)keynames)messages)
orca_state)script_manager)settings)AXObject)AXUtilitieskeyboardbraillezmouse:buttonc                   $    e Zd Zd Zd Zd Zd Zy)
InputEventc                 R    || _         t        j                         | _        d| _        y)zCCreates a new KEYBOARD_EVENT, BRAILLE_EVENT, or MOUSE_BUTTON_EVENT.r   N)typetime_clickCount)self	eventTypes     2/usr/lib/python3/dist-packages/orca/input_event.py__init__zInputEvent.__init__8   s      	IIK	    c                     | j                   S )z9Return the count of the number of clicks a user has made.)r   r   s    r   getClickCountzInputEvent.getClickCount?   s     r   c                      y):Updates the count of the number of clicks a user has made.N r    s    r   setClickCountzInputEvent.setClickCountD   s     	r   c                     | j                    S ):Returns a single-line string representation of this event.)r   r    s    r   asSingleLineStringzInputEvent.asSingleLineStringI   s     ))r   N)__name__
__module____qualname__r   r!   r%   r(   r$   r   r   r   r   6   s     

r   r   c                      ddl m}  	  | ddg      }|j                  dd      j                  d      D ]&  }|j	                  d	      s|j                  d
      c S  	 y# t        $ r Y yw xY w)Nr   )check_outputxkbsetqASCIIignore)errors
zSticky-Keys = OnF)
subprocessr-   decodesplit
startswithendswith	Exception)r-   outputlines      r   _getXkbStickyKeysStater=   N   sw    'xo.MM'(M;AA$G 	+D/0}}T**	+
   s   A A 	A A 	A+*A+c                       e 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Zg ej4                  ej6                  ej8                  ej:                  ej<                  ej>                  ej@                  ejB                  ejD                  ejF                  ejH                  ejJ                  ejL                  ejN                  ejP                  ejR                  ejT                  ejV                  ejX                  ejZ                  ej\                  ej^                  ej`                  ejb                  ejd                  ejf                  ejh                  ejj                  ejl                  ejn                  ejp                  ejr                  ejt                  ejv                  ejx                  ejz                  ej|                  ej~                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ZSg ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                   ej                  ej                  ej                  ej                  ej
                  ej                  ej                  ej                  ej                  Z fdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Zd7d!Zd" Zd# Zd$ Zd% Zd& Zd' Zd( Zd) Zd* Zd+ Zd, Zd- Zd. Zd/ Zd0 Zd1 Zd8d2Zd3 Zd4 Zd5 Zd6 Z xZS )9KeyboardEventr   FNunknown	printablemodifierlockingfunctionaction
navigationdiacritical
alphabeticnumericpunctuationspacec                 l   t         |   t               || _        |r t        j
                  j                  | _        nt        j
                  j                  | _        || _	        |t        j                  j                  z  | _        |dt        j                  j                  z  z  r0| xj                  dt        j                  j                  z  z  c_        || _        t        j                   |      | _        | j                  dk(  s| j                  dk(  r| j                   | _        t#        j"                         | _        | t&        j(                  t&        j*                  fv | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _         d| _!        d| _"        d| _#        | j                  s| j                   | _        tI        | j                        dkD  rR| j                  tJ        jL                  v s| j                  tJ        jN                  v rtQ        | j                        | _        | j                   jS                  d      r1| j                  dt        j                  j                  z  z  rd| _#        |rtU        jV                         jY                         | _        t[        jV                         j]                         | _        | j.                  r| j.                  j^                  | _        t[        jV                         ja                  | j2                        st[        jV                         jc                         | _        d| j2                  g}te        jf                  td        jh                  |d       t[        jV                         jk                  | j2                         t[        jV                         jm                         | _        | j2                  r| j0                  to        jp                  | j2                        k7  rtU        jV                         js                  to        jp                  | j2                              | _        | j.                  j^                  | _        d	| j.                  g}te        jf                  td        jh                  |d       n| ju                         r}t&        j*                  j.                  | _        t&        j*                  j2                  | _        t&        j*                  j4                  | _        t&        j*                  j6                  | _        ntU        jV                         jY                         | _        t[        jV                         j]                         | _        t[        jV                         jm                         | _        | j4                  | _        | j,                  rtJ        xjv                  dz  c_;        nd
tJ        _;        d| _<        to        jz                  | j4                        }|xs |t        j|                  j~                  k(  }tJ        j                  rd| j                         sTtJ        j                  sD| j                         }	|	r2|	j                  t        j                  z  r|	j                  tJ        _F        | j                         s=tJ        j                  rdtJ        _H        dtJ        _I        ndtJ        _B        dtJ        _J        | j                         r0tJ        j                  | _<        |xr t        j                  | _O        n| j                         r0tJ        j                  | _<        |xr t        j                  | _O        n| j                         rtJ        j                  | _<        |xr t        j                  | _O        | j                         r1| j,                  s$t#        j"                         }
tJ        j                  rS|r|
tJ        _V        tJ        j                  tJ        j                  dz   k  rd| _"        |sdtJ        _B        dtJ        _J        n|tJ        _G        |rdtJ        _H        |
tJ        _I        ntJ        j                  tJ        _B        tJ        j                  tJ        _J        nT| j                         r0tJ        j                  | _<        |xr t        j                  | _O        n| j                         r0tJ        j                  | _<        |xr t        j                  | _O        n| j                         rctJ        j                  | _<        t        j                  | _O        | j                  t        j                   | _O        | j                  xr || _O        na| j                         rBtJ        j                  | _<        |xr" t        j                  xs t        j                  | _O        n| j                         rAtJ        j                  | _<        |xr" t        j                  xs t        j                  | _O        n| j                         rAtJ        j                  | _<        |xr" t        j                  xs t        j                  | _O        nm| j                         rAtJ        j                  | _<        |xr" t        j                  xs t        j                  | _O        ntJ        j                  | _<        d| _O        | j                         s#| j                  xr t        j                  | _O        | j                         s| j                          t&        j                  r|rdtJ        _G        tJ        j                  r#| xj                  t        j                  z  c_        tJ        j                  rb| xj                  tJ        j                  z  c_        | j                         r$tJ        xj                  | j                  z  c_F        nd
tJ        _F        | j                         \  | _        | _        y)ah  Creates a new InputEvent of type KEYBOARD_EVENT.

        Arguments:
        - pressed: True if this is a key press, False for a release.
        - keycode: the hardware keycode.
        - keysym: the translated keysym.
        - modifiers: a bitflag giving the active modifiers.
        - text: the text that would be inserted if this key is pressed.
        r     NFKPTz1INPUT EVENT: Updating window and active window tozINPUT EVENT: Updated script tor   g      ?)ssuperr   KEYBOARD_EVENTidr   	EventTypeKEY_PRESSED_EVENTr   KEY_RELEASED_EVENThw_coder   ModifierTypeMODIFIER_MASK	modifiersNUMLOCKevent_stringkeyval_namer   	timestampr   lastInputEventlastNonModifierKeyEventis_duplicate_script_app_window_obj_obj_after_consuming_handler	_consumer_should_consume_consume_reason_did_consume_result_reason_bypassOrca_is_kp_with_numlocklenr?   GDK_PUNCTUATION_KEYSGDK_ACCENTED_LETTER_KEYSchrr8   r   
getManagergetActiveScriptr	   get_active_windowappcan_be_active_windowfind_active_windowr   printTokens
LEVEL_INFOset_active_windowget_locus_of_focusr   get_application	getScript$_isReleaseForLastNonModifierKeyEventduplicateCountkeyTypeget_roleRoleTERMINAL
stickyKeysisOrcaModifierlastOrcaModifierAlone_getDoubleClickCandidater
   ORCA_MODIFIER_MASKorcaStickyModifiersorcaModifierPressedcurrentOrcaModifierAlonecurrentOrcaModifierAloneTimelastOrcaModifierAloneTimeisNavigationKeyTYPE_NAVIGATIONr   enableNavigationKeys
shouldEchoisActionKeyTYPE_ACTIONenableActionKeysisModifierKeyTYPE_MODIFIERenableModifierKeyssecondOrcaModifierTimeisFunctionKeyTYPE_FUNCTIONenableFunctionKeysisDiacriticalKeyTYPE_DIACRITICALenableDiacriticalKeysisLockingKeyTYPE_LOCKINGpresentLockingKeysonlySpeakDisplayedTextisAlphabeticKeyTYPE_ALPHABETICenableAlphabeticKeysenableEchoByCharacterisNumericKeyTYPE_NUMERICenableNumericKeysisPunctuationKeyTYPE_PUNCTUATIONenablePunctuationKeysisSpace
TYPE_SPACEenableSpaceTYPE_UNKNOWNenableKeyEchor%   bypassNextCommandshouldConsume)r   pressedkeycodekeysymrY   texttokensrole_mayEchodoubleEventnow	__class__s              r   r   zKeyboardEvent.__init__   s    	(99DI::DI"S%5%5%C%CCU//7778NNqE$6$6$>$>>?N ??62#t'8'8C'? $ 0 0D Z%>%>%/%G%G%I I		$(!## "#(     $ 0 0D t  !A%=====AAA #DGGD
 &&t,~~e&8&8&@&@!@A+/( )446FFHDL(335GGIDL|| LL,,	$//1FFt||T#0#;#;#=#P#P#RDLQSWS_S_`F%%e&6&6E!,,.@@N &002EEGDI||		X-E-Edll-S S-88:DD,,T\\: < LL,,	:DLLI!!%"2"2FDA668%==EEDL%==EEDL"::??DI(2(J(J(_(_D%)446FFHDL(335GGIDL%002EEGDI(,		D%((A-(+,M(  +9dejj&9&99##D,?,?,A 66779K$${'E'EE 5@4I4I1""$009>6=A:6;3:>7!(88DL&H8+H+HDO(44DL&D8+D+DDO!(66DL&F8+F+FDO""$T->->iik 66?B<%<<%??#EF ,0(">C;BG?8?M5AE>EHB *BB &; *FF &?!(66DL&F8+F+FDO""$(99DL&I8+I+IDO (55DL&99DO&&.&E&E"E"oo9'DO!!#(88DL& V22Th6T6T O (55DL& S//Q83Q3Q O""$(99DL& W33Ux7U7U O\\^(33DL& M))KX-K-K O )55DL#DO  ""ooH(2H2HDO!!# ''G05M-,,NNk<<<N##NNm???N!!#11T^^C1 561595G5G5I2d2r   c                     t         j                  }t        |t              rE|j                  | j                  k(  r,| j
                  |j
                  z
  t        j                  k  r|S y N)r   r_   
isinstancer?   r[   r   r   doubleClickTimeout)r   	lastEvents     r   r   z&KeyboardEvent._getDoubleClickCandidate  sO    66	i/%%):)::yy9>>)X-H-HHr   c                    | j                         }|sd| _        y|j                         | _        | j                  ry| j                  t
        j                  j                  k(  ry| j                  dk  rv|j                  |j                  k7  rGd|j                  d|j                  g}t        j                  t        j                  |d       d| _        y| xj                  dz  c_        yd| _        y)r#   r   N   z>KEYBOARD EVENT: Resetting click count due to focus change fromtoT)r   r   r!   r`   r   r   rS   rU   rd   re   r   rx   ry   )r   r   r   s      r   r%   zKeyboardEvent.setClickCount  s     335 D&44699:::a;#C#CCZ%**D+2R2RT!!%"2"2FDA#$ !r   c                     |sy| j                   |j                   k(  r2| j                  |j                  k(  r| j                  |j                  k(  S yNF)r   rV   r]   r   others     r   __eq__zKeyboardEvent.__eq__  s=    99

"t||u}}'D>>U__44r   c                    | j                         rdx}x}x}x}x}}nH| j                  }| j                  }| j                  }| j                  }| j
                  }| j                  }d| j                  j                  j                          dd| dz   d| dz   d| dz   d| dz   d	| dz   d
| j                  z  z   dt        j                         ddz   d| dz   d| j                   dz   d| j                   dz   S )N*zKEYBOARD_EVENT:  type=r3   z                 id=z                 hw_code=z                 modifiers=z                 event_string=(z)
z                 keyval_name=(z                 timestamp=%d
z                 time=fz                 keyType=z                 clickCount=z                 shouldEcho=)_shouldObscurerR   rV   rY   r[   r\   r   r   
value_nameupperr]   r   r   r   )r   keyidrV   rY   r[   r\   key_types          r   __str__zKeyboardEvent.__str__  s_    RUUEUGUiU,UxGGEllGI,,L**K||H()=)=)C)C)E(FbI%eWB/0*7)267 -YKr:; 1cB	C
 0}C@A 2DNNBD (		Ab9: +8*B78 .d.>.>-?rB	C .doo->bA
B 
	Br   c                     | j                         ryd| j                   d| j                   d| j                   d| j                  j
                   S )r'   
(obscured)'z' (z) mods: rN   )r   r[   r\   rY   r   
value_nickr    s    r   r(   z KeyboardEvent.asSingleLineString  sW       !!"#d&6&6%7x?Oqyy##$&	
r   c                    t        j                  | j                        sy| j                         sy| j                  t
        j                  z  s:| j                  t
        j                  z  s| j                  t
        j                  z  ryy)NFT)	r   is_password_textrd   isPrintableKeyrY   r
   CTRL_MODIFIER_MASKALT_MODIFIER_MASKr   r    s    r   r   zKeyboardEvent._shouldObscure  sb    ++DII6""$>>K:::nn{<<<nn{===r   c                    t         j                  }|sy|j                         r| j                         ry| j                  |j                  k(  r2| j                  |j                  k(  r| j
                  |j
                  k(  S yr   )r   r_   isPressedKeyrR   rV   rY   )r   lasts     r   r~   z2KeyboardEvent._isReleaseForLastNonModifierKeyEvent  sb    11  "d&7&7&977dgg$,,$,,">>>T^^33r   c                    |sy|j                         r| j                         ry| j                  |j                  k(  xr | j                  |j                  k(  xr | j                  |j                  k(  xrj | j                  |j                  k(  xrO | j
                  |j
                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S )z3Return True if this is the release event for other.F)r   rR   rV   rY   r[   r\   r   r   r   s     r   isReleaseForzKeyboardEvent.isReleaseFor(  s     !!#t'8'8':ww%((" 6-6%//16 !!U%7%776   E$5$55	6
 -6   E$5$55	6r   c                 p    | j                   r| j                   t        j                  k(  S | j                  dv S )z(Return True if this is a navigation key.)LeftRightUpDownHomeEnd)r   r?   r   r[   r    s    r   r   zKeyboardEvent.isNavigationKey9  s6     <<<<=#@#@@@  :; 	;r   c                 p    | j                   r| j                   t        j                  k(  S | j                  dv S )z%Return True if this is an action key.)ReturnEscapeTab	BackSpaceDeletePage_Up	Page_Down)r   r?   r   r[   r    s    r   r   zKeyboardEvent.isActionKeyB  s8     <<<<=#<#<<<  %% 	%r   c                     | j                   r| j                   t        j                  k(  S t        | j                        dk(  sy| j                  j                         S )z)Return True if this is an alphabetic key.r   F)r   r?   r   rn   r[   isalphar    s    r   r   zKeyboardEvent.isAlphabeticKeyL  sK     <<<<=#@#@@@4$$%*  ((**r   c                     | j                   r| j                   t        j                  k(  S | j                  j	                  d      S )z5Return True if this is a non-spacing diacritical key.dead_)r   r?   r   r[   r8   r    s    r   r   zKeyboardEvent.isDiacriticalKeyW  s7     <<<<=#A#AAA  ++G44r   c                 p    | j                   r| j                   t        j                  k(  S | j                  dv S )z&Return True if this is a function key.)F1F2F3F4F5F6F7F8F9F10F11F12)r   r?   r   r[   r    s    r   r   zKeyboardEvent.isFunctionKey_  s8     <<<<=#>#>>>  44 	4r   c                     | j                   r| j                   t        j                  v S g d}| j                  |vryt        j
                  s(| j                  s| j                  t        j                  vS y)z%Return True if this is a locking key.)	Caps_Lock
Shift_LockNum_LockScroll_LockFT)	r   r?   r   r[   r   r   rl   r   orcaModifierKeys)r   lockingKeyss     r   r   zKeyboardEvent.isLockingKeyi  sa     <<<<=#=#===LK/++D4D4D$$H,E,EEEr   c                     | j                   r| j                   t        j                  k(  S | j                         ry| j                  dv S )z&Return True if this is a modifier key.T)	Alt_LAlt_R	Control_L	Control_RShift_LShift_RMeta_LMeta_RISO_Level3_Shift)r   r?   r   r   r[   r    s    r   r   zKeyboardEvent.isModifierKeyx  sG     <<<<=#>#>>>   !! 	!r   c                     | j                   r| j                   t        j                  k(  S t        | j                        dk(  sy| j                  j                         S )z%Return True if this is a numeric key.r   F)r   r?   r   rn   r[   	isnumericr    s    r   r   zKeyboardEvent.isNumericKey  sK     <<<<=#=#===4$$%*  **,,r   c                     |rt         j                  ry| j                  t        j                  v ry| j
                  dk(  r0dt        j                  v r| j                  t        j                  z  ryy)z-Return True if this is the Orca modifier key.FTKP_0	KP_Insert)	r   r   r[   r   r  r\   rY   r
   SHIFT_MODIFIER_MASK)r   checkBypassModes     r   r   zKeyboardEvent.isOrcaModifier  s]     z;; 9 99v%h777~~ ? ??r   c                 ^    t         j                  ry| j                  t        j                  z  S )z)Return True if this key is Orca modified.F)r   r   rY   r
   r   r    s    r   isOrcaModifiedzKeyboardEvent.isOrcaModified  s%     ''~~ > >>>r   c                     | j                   S )z5Return True if this is a key pad key with numlock on.)rm   r    s    r   isKeyPadKeyWithNumlockOnz&KeyboardEvent.isKeyPadKeyWithNumlockOn  s     '''r   c                     | j                   dv ryt        | j                         dk(  sy| j                   j                         S )z'Return True if this is a printable key.rK   rN   Tr   F)r[   rn   isprintabler    s    r   r   zKeyboardEvent.isPrintableKey  s@     .4$$%*  ,,..r   c                 P    | j                   t        j                  j                  k(  S )z"Returns True if the key is pressed)r   r   rS   rT   r    s    r   r   zKeyboardEvent.isPressedKey  s     yyEOO====r   c                 6   | j                   r| j                   t        j                  k(  S t        | j                        dk(  sy| j                         s| j                         ry| j                  j                         xr | j                  j                          S )z)Return True if this is a punctuation key.r   F)	r   r?   r   rn   r[   r   r   r   isspacer    s    r   r   zKeyboardEvent.isPunctuationKey  s|     <<<<=#A#AAA4$$%*!T%6%6%8  ,,.Rt7H7H7P7P7R3RRr   c                 p    | j                   r| j                   t        j                  k(  S | j                  dv S )z%Return True if this is the space key.r  )r   r?   r   r[   r    s    r   r   zKeyboardEvent.isSpace  s1     <<<<=#;#;;;  N22r   c                      | j                   |k(  S )z9Return True if this is associated with the specified app.)rb   )r   ru   s     r   isFromApplicationzKeyboardEvent.isFromApplication  s     yyCr   c                     | j                         syt        j                         j                         }|xr |j                  j                  |       S )zReturns True if the script will echo this event as part of
        character echo. We do this to not double-echo a given printable
        character.F)r   r   rr   rs   	utilitieswillEchoCharacter)r   scripts     r   isCharacterEchoablez!KeyboardEvent.isCharacterEchoable  sF    
 ""$**,<<>B&**<<TBBr   c                 H   | j                         sy| j                  dk(  rt        j                  j                  }nU| j                  dk(  rt        j                  j
                  }n+| j                  dk(  rt        j                  j                  }ny| j                  d|z  z   S )zReturns True if the event locked a locking key, False if the
        event unlocked a locking key, and None if we do not know or this
        is not a locking key.Nr  r  r  r   )r   r[   r   rW   	SHIFTLOCKSHIFTrZ   rY   )r   mods     r   getLockingStatezKeyboardEvent.getLockingState  s    
   "+$$..C,.$$**C*,$$,,C>>Q#X...r   c                 l    | j                         }|y|st        j                  S t        j                  S )zmReturns the string which reflects the locking state we wish to
        include when presenting a locking key.rM   )r0  r   LOCKING_KEY_STATE_OFFLOCKING_KEY_STATE_ON)r   lockeds     r   getLockingStateStringz#KeyboardEvent.getLockingStateString  s5     %%'>111,,,r   c                 @    t        j                  | j                        S )zAReturns the string to be used for presenting the key to the user.)r   
getKeyNamer[   r    s    r   r7  zKeyboardEvent.getKeyName  s     ""4#4#455r   c                     | j                   S )zAReturns the object believed to be associated with this key event.)rd   r    s    r   	getObjectzKeyboardEvent.getObject	  s     yyr   c                     | j                   S )z3Returns the handler associated with this key event.)rf   r    s    r   
getHandlerzKeyboardEvent.getHandler  s     }}r   c                 >   	 t         j                  j                  | j                  j                        }|s 	 t         j                  j                  d      }	 |j                  |       }|S # t
        $ r d }Y Cw xY w# t
        $ r d }Y 2w xY w# t
        $ r d }Y |S w xY w)Ndefault)r   keyBindingsMapgetra   r*   r:   getInputHandler)r   bindingshandlers      r   _getUserHandlerzKeyboardEvent._getUserHandler  s    	..224<<3J3JKH  #2266yA	..t4G   	H	
    
  	G	s4   3A+ A< B +A98A9<B
	B
BBc                    | j                   sy| j                  sy| j                  ryt        j                  ryt        j
                  ry| j                         xs% | j                  j                  j                  |       | _	        | j                  duxr | j                  j                         }| j                         r|dfS | j                  j                  j                         r&| j                  j                  j                  | _        y| j!                         r| j#                         sy	y
| j                  sy| j                  j                         sy|dfS )z.Returns True if this event should be consumed.)FzNo timestamp)FzNo active script when receivedFzIs duplicateFzCapturing keysFzBypass next commandNz)Is release for last non-modifier keyevent)TzIn Learn Mode)Fz#Non-Orca modifier not in Learn ModeTzOrca modifier)Fz
No handler)FzHandler is disabledzScript indication)r]   ra   r`   r   capturingKeysr   rC  keyBindingsr@  rf   
is_enabledr~   learnModePresenter	is_activehandle_eventrg   r   r   )r   scriptConsumess     r   r   zKeyboardEvent.shouldConsume&  s    ~~(||:(##*''/,,. >||''77= 	 d2Qt}}7O7O7Q446!#NNN<<**446!\\<<IIDN(&&(C(}}&}}'')/222r   c                 b    | j                   sy|j                  | j                   j                  k(  S r   )rf   __func__rD   )r   methods     r   isHandledByzKeyboardEvent.isHandledByQ  s%    }}$--"8"888r   c                     | j                         r| j                  j                          | j                  j                  j	                         ry| j                  j                  |       S r   )r   ra   presentationInterruptrL  rM  presentKeyboardEvent)r   
inputEvents     r   _presentzKeyboardEvent._presentW  sL    LL..0<<**446||0066r   c                 T   t        j                          }| j                         sd| j                  | j                  fz  }nd}| j                  rd|t
        j                  fz  }d| j                  j                  j                          d| d}t        j                  t        j                  |d       d| j                  g}t        j                  t        j                  |d	       d
| j                  g}t        j                  t        j                  |d	       d| j                   xs | j"                  g}t        j                  t        j                  |d	       d| j$                  | j&                  g}t        j                  t        j                  |d	       | j)                         \  | _        | _        d| j*                  | j,                  g}t        j                  t        j                  |d	       t/        j0                         j3                         }t        j                  t        j4                  k\  rW|U|j7                         }|j9                         D ]2  \  }}d| d| }t        j                  t        j                  |d	       4 dt        j                          |z
  d}t        j                  t        j                  |d	       d| j                  j                  j                          d| d}t        j                  t        j                  |d       | j*                  S )Processes this input event.	'%s' (%d)r   z%s DUPLICATE EVENT #%iz
vvvvv PROCESS :  vvvvvFz	HOST_APP:TzWINDOW:z	LOCATION:zCONSUME:z	CONSUMED:zINPUT EVENT: TOTAL PROCESSING TIME: .4fz^^^^^ PROCESS  ^^^^^
)r   r   r[   rV   r`   r?   r   r   r   r   r   printMessagery   rb   rx   rc   re   rd   rh   ri   _processrj   rk   r   rr   rs   
debugLevelgetTransferableAttributesitems)	r   	startTimedatamsgr   r*  
attributeskeyvalues	            r   processzKeyboardEvent.process`  s    IIK	""$$"3"3T\\!BBDD+t]5Q5Q.RRD !5!5!;!;!= >bfM5++S%8tyy)%**FD9T\\*%**FD9t88EDIIF%**FD9d22D4H4HI%**FD915.4.t00$2E2EF%**FD9**,<<>u///F4F99;J(..0 @
U%cU"UG4""5#3#3S$?@ (		i(?'DE5++S$7tyy3399;<BtfHM5++S%8   r   c                    | j                   r{| j                  dk(  s| j                  dk(  r\| j                  t        j                  j
                  k(  r5| j                          t        j                  | _	        | j                          y| t        _        | j                         s| t        _        | j                  sy| j                   ry| j                          | j#                         s| j$                  dfS t        j&                  ry| j)                         ryt        j*                  r7| j                         s&d	t        _        | j                  j-                  d
       y| j$                  sy| j.                  s| j0                  sy| j.                  s| j0                  j2                  r!t5        j6                  d| j8                         yy)rZ  r  r  )FzBypassed orca modifier)FzNo active scriptrE  zConsumed based on handlerrF  rH  Fzbypassed next commandrG  )FzShould not consume)FzNo consumer or handlerr   )TzWill be consumed)FzUnaddressed case)rl   r[   r   r   rS   rT   	_lock_modr?   r   r   rX  r   r^   r   r_   ra   r`   r   rh   rI  r   r   addKeyGrabsrg   rf   rD   r   timeout_add_consumer    s    r   rb  zKeyboardEvent._process  sR    !![0$$499 A AANN$#0#=#=DLMMO2$(
!!!#15J.||,(  "'')DDD##* (''%%'/4
,(()@A/##.$--2>>T]]33Q.+(r   c                    d }| j                   dk(  rdt        j                  j                  z  }na| j                   dk(  rdt        j                  j                  z  }n4d| j                   g}t        j                  t
        j                  |d       y t        j                  t
        j                  dd       t        j                  d || j                  |             y )Nc                       fd}|S )Nc                     	 z  r@t         j                  j                  } t        j                  t        j
                  dd       n?t         j                  j                  } t        j                  t        j
                  dd       t        j                  d|        t        j                  t        j
                  dd       y # t        $ r( t        j                  t        j
                  dd       Y y w xY w)NzUnlocking capslockTzLocking capslockrM   zDone with capslockzRCould not trigger capslock, at-spi2-core >= 2.32 is needed for triggering capslock)	r   KeySynthTypeUNLOCKMODIFIERSr   ra  ry   LOCKMODIFIERSgenerate_keyboard_eventr:   )lockrB   rY   s    r   lockitz9KeyboardEvent._lock_mod.<locals>.lock_mod.<locals>.lockit  s     8+$11AA**5+;+;=QSWX$11??**5+;+;=OQUV11(BE&&u'7'79MtT  &&u'7'7 :QRVXs   C C .C54C5r$   )rY   rB   rz  s   `` r   lock_modz)KeyboardEvent._lock_mod.<locals>.lock_mod  s     Mr   r  r   r  zUnknown locking keyTzScheduling capslock)r[   r   rW   r-  r.  r   rx   LEVEL_WARNINGra  ry   r   rp  rY   )r   r{  rB   r   s       r   rn  zKeyboardEvent._lock_mod  s    	  +E..888H,.E..444H+T->->?Fe1164@5++-BDIHT^^X>?r   c                    t        j                          }d| j                  | j                  fz  }d| j                  j                  j                          d| d}t        j                  t        j                  |d       | j                  rPd| j                  j                   }t        j                  t        j                  |d       | j                  |        n| j                  j                  r[d| j                   }t        j                  t        j                  |d       | j                  j                  | j                  |        n'd	}t        j                  t        j                  |d       t        j                         j!                         | _        | j$                  | j"                  k7  r?d
| j$                  d| j"                  g}t        j&                  t        j                  |d       dt        j                          |z
  d}t        j                  t        j                  |d       d| j                  j                  j                          d| d}t        j                  t        j                  |d       y)Nr[  z
vvvvv CONSUME r\  r]  FzKEYBOARD EVENT: Consumer is TzKEYBOARD EVENT: Handler is z&KEYBOARD EVENT: No handler or consumerz+KEYBOARD EVENT: Consumer changed focus fromr   r^  r_  z^^^^^ CONSUME r`  )r   r[   rV   r   r   r   r   ra  ry   rg   r)   rf   rD   ra   r	   rr   r{   re   rd   rx   )r   rf  rg  rh  r   s        r   rq  zKeyboardEvent._consume  s   IIK	d//>> !5!5!;!;!= >bfM5++S%8>>01H1H0IJCu//d;NN4 ]]##/?Cu//d;MM""4<<6:Cu//d;$1$<$<$>$Q$Q$S!II222CTYYPT//1Fe..='		i(?'DE5++S$7tyy3399;<BtfHM5++S%8r   )Tr   )r)   r*   r+   r=   r   r   r   r   r   r   r   r   r   r   TYPE_PRINTABLEr   r   r   r   r   r   r   r   r   r   r   	KEY_acuteKEY_ampersandKEY_apostropheKEY_asciicircumKEY_asciitildeKEY_asteriskKEY_atKEY_backslashKEY_barKEY_braceleftKEY_bracerightKEY_bracketleftKEY_bracketrightKEY_brokenbarKEY_cedillaKEY_cent	KEY_colon	KEY_commaKEY_copyrightKEY_currency
KEY_degreeKEY_diaeresis
KEY_dollarKEY_EuroSign	KEY_equal
KEY_exclamKEY_exclamdown	KEY_graveKEY_greaterKEY_guillemotleftKEY_guillemotright
KEY_hyphenKEY_less
KEY_macron	KEY_minusKEY_notsignKEY_numbersignKEY_paragraphKEY_parenleftKEY_parenrightKEY_percent
KEY_periodKEY_periodcenteredKEY_plusKEY_plusminusKEY_questionKEY_questiondownKEY_quotedblKEY_quoteleftKEY_quoterightKEY_registeredKEY_sectionKEY_semicolon	KEY_slashKEY_sterlingKEY_underscoreKEY_yenro   
KEY_Aacute
KEY_aacuteKEY_AcircumflexKEY_acircumflexKEY_AdiaeresisKEY_adiaeresis
KEY_Agrave
KEY_agrave	KEY_Aring	KEY_aring
KEY_Atilde
KEY_atildeKEY_CcedillaKEY_ccedilla
KEY_Eacute
KEY_eacuteKEY_EcircumflexKEY_ecircumflexKEY_EdiaeresisKEY_ediaeresis
KEY_Egrave
KEY_egrave
KEY_Iacute
KEY_iacuteKEY_IcircumflexKEY_icircumflexKEY_IdiaeresisKEY_idiaeresis
KEY_Igrave
KEY_igrave
KEY_Ntilde
KEY_ntilde
KEY_Oacute
KEY_oacuteKEY_OcircumflexKEY_ocircumflexKEY_OdiaeresisKEY_odiaeresis
KEY_Ograve
KEY_ograveKEY_OobliqueKEY_ooblique
KEY_Otilde
KEY_otilde
KEY_Uacute
KEY_uacuteKEY_UcircumflexKEY_ucircumflexKEY_UdiaeresisKEY_udiaeresis
KEY_Ugrave
KEY_ugrave
KEY_Yacute
KEY_yacuterp   r   r   r%   r   r   r(   r   r~   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   r&  r+  r0  r5  r7  r9  r;  rC  r   rS  rX  rl  rb  rn  rq  __classcell__r   s   @r   r?   r?   Z   s-   ')JN " $$#' !%L'N&M%L&M$K(O)(O%L)#J8)CMM 8)--8)..8)  //8)  ..	8)
  ,,8)  JJ8)  --8)  KK8)  --8)  ..8)  //8)  008)  --8)  OO8)  LL8)   MM!8)"  MM#8)$  --%8)&  ,,'8)(  NN)8)*  --+8),  NN-8).  ,,/8)0  MM18)2  NN38)4  ..58)6  MM78)8  OO98):  11;8)<  22=8)>  NN?8)@  LLA8)B  NNC8)D  MME8)F  OOG8)H  ..I8)J  --K8)L  --M8)N  ..O8)P  OOQ8)R  NNS8)T  22U8)V  LLW8)X  --Y8)Z  ,,[8)\  00]8)^  ,,_8)`  --a8)b  ..c8)d  ..e8)f  OOg8)h  --i8)j  MMk8)l  ,,m8)n  ..o8)p  KKq8)t5 0 5 0 #5 0 # 3 35 0 !$ 3 35 0 !$ 2 2	5 0
 !$ 2 25 0 !$5 0 !$5 0 !$5 0 !$5 0 !$5 0 !$5 0 !$ 0 05 0 !$ 0 05 0 !$5 0 !$5 0  !$ 3 3!5 0" !$ 3 3#5 0$ !$ 2 2%5 0& !$ 2 2'5 0( !$)5 0* !$+5 0, !$-5 0. !$/5 00 !$ 3 315 02 !$ 3 335 04 !$ 2 255 06 !$ 2 275 08 !$95 0: !$;5 0< !$=5 0> !$?5 0@ !$A5 0B !$C5 0D !$ 3 3E5 0F !$ 3 3G5 0H !$ 2 2I5 0J !$ 2 2K5 0L !$M5 0N !$O5 0P !$ 0 0Q5 0R !$ 0 0S5 0T !$U5 0V !$W5 0X !$Y5 0Z !$[5 0\ !$ 3 3]5 0^ !$ 3 3_5 0` !$ 2 2a5 0b !$ 2 2c5 0d !$e5 0f !$g5 0h !$i5 0j !$k5 0nSJj6B.	
6";%	+54!	- ?(
	/>
S3 
	C/&-6


&)3V97,!\1)f@8r   r?   c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )BrailleEventc                     t         |   t               || _        t	        j
                         j                         | _        y)zCreates a new InputEvent of type BRAILLE_EVENT.

        Arguments:
        - event: the integer BrlTTY command for this event.
        N)rP   r   BRAILLE_EVENTeventr   rr   rs   ra   r   r  r   s     r   r   zBrailleEvent.__init__  s2     	'
%002BBDr   c                 T    | j                   j                          d| j                   S )NrN   )r   r   r  r    s    r   r   zBrailleEvent.__str__	  s#    ))//#$Adjj\22r   c                    | j                   d   }d}t        j                  }| j                  j                  |v r|| j                  j                     }n	d|v r|d   }|r8||v r4||   }d| d|g}t        j                  t
        j                  |d       |S | j                  j                  j                  |      }d| d|g}t        j                  t
        j                  |d       |S )z/Returns the handler associated with this event.commandNr=  z(BRAILLE EVENT: User handler for command z isTz#BRAILLE EVENT: Handler for command )
r  r   brailleBindingsMapra   namer   rx   ry   brailleBindingsr?  )r   r  user_bindingsuser_bindings_maprB  r   s         r   r;  zBrailleEvent.getHandler  s     **Y'$77<< 11-dll.?.?@M++-i8MW5#G,G@	MwWFe..=N,,..227;7yDgN%**FD9r   c                 v   d| dg}t        j                  t         j                  |d       t        j                         }| j	                         }dt        j                         |z
  d}t        j
                  t         j                  |d       d| dg}t        j                  t         j                  |d       |S )Nz
vvvvv PROCESSvvvvvFr^  r_  z^^^^^ PROCESSz^^^^^)r   rx   ry   r   rb  ra  )r   r   
start_timeresultrh  s        r   rl  zBrailleEvent.process"  s    #T73%**FE:YY[
'		j(@'EF5++S%8!41%**FE:r   c                    | j                         }|sx| j                  j                  j                         r*d| g}t	        j
                  t        j                  |d       yd| g}t	        j
                  t        j                  |d       y	 |j                  | j                  |        y# t        $ r7}d| d| g}t	        j
                  t        j                  |d       Y d }~yd }~ww xY w)Nz+BRAILLE EVENT: Learn mode presenter handlesTz#BRAILLE EVENT: No handler found forFz$BRAILLE EVENT: Exception processing:r\  )
r;  ra   rL  rM  r   rx   ry   processInputEventr:   r|  )r   rB  r   errors       r   rb  zBrailleEvent._process/  s    //#||..88:GN!!%"2"2FDA;TBFe..=	A%%dllD9
 	  	A<dbLQFe1164@@		As   B) )	C)2-C$$C))	r)   r*   r+   r   r   r;  rl  rb  r  r  s   @r   r  r    s    E3,r   r  c                        e Zd Z	 ej                  j                         Zej                  j                  e      Zej                         Z
 fdZd Zd Z xZS # e$ r dZ
Y w xY w)MouseButtonEventNc                    t         |   t               |j                  | _        |j
                  | _        |j                  j                  d      | _	        |j                  t        d      d | _        t        j                         j                         | _        t!        j                         j#                         | _        d| _        | j                  r| j)                          | j                  syt!        j                         j+                  | j$                        s't!        j                         j-                         | _        | j$                  syt/        j0                  | j$                        | _        y)z4Creates a new InputEvent of type MOUSE_BUTTON_EVENT.pzmouse:button:N)rP   r   MOUSE_BUTTON_EVENTdetail1xdetail2yr   r9   r   rn   buttonr   rr   rs   ra   r	   rt   windowru   _validateCoordinatesrv   rw   r   r|   r  s     r   r   zMouseButtonEvent.__init__L  s     	+,zz**3/jj_!5b9%002BBD#..0BBD<<%%'||'')>>t{{K'224GGIDK{{++DKK8r   c           	         | j                   sy | j                   j                         \  }}}t        j                  | j                  |z
  dz  | j
                  |z
  dz  z         dk  ry d| j                   d| j
                   d| d| d	}t        j                  t        j                  |d       ||c| _        | _        y )N      zWARNING: Event coordinates (z, z) may be bogus. Updating to ()T)	_pointerget_positionmathsqrtr  r  r   ra  ry   )r   screenr  r  rh  s        r   r  z%MouseButtonEvent._validateCoordinatesf  s    }}}}113199dffqj1_
Q67"< +466("TVVH =3b1& 	 	5++S$7Ar   c                 L   | j                   syt        j                  }t        |t              sd| _        y| j                  |j                  z
  t        j                  k  r>|j                  | j                  k(  r%| j
                  dk  r| xj
                  dz  c_        yd| _        y)r#   Nr   r  )
r   r   r^   r   r  r   r   r   r   r  )r   r^   s     r   r%   zMouseButtonEvent.setClickCountu  s     ||#22.*:; D99~***X-H-HH%%4!#  A% r   )r)   r*   r+   r   Displayget_defaultdisplayget_default_seatseatget_pointerr  r:   r   r  r%   r  r  s   @r   r  r  C  sb    ++))+{{++G4##%94Y  s   AA A%$A%r  c                   2    e Zd ZddZd Zd Zd Zd Zd Zy)	InputEventHandlerc                 <    || _         || _        || _        || _        y)az  Creates a new InputEventHandler instance.  All bindings
        (e.g., key bindings and braille bindings) will be handled
        by an instance of an InputEventHandler.

        Arguments:
        - function: the function to call with an InputEvent instance as its
                    sole argument.  The function is expected to return True
                    if it consumes the event; otherwise it should return
                    False
        - description: a localized string describing what this InputEvent
                       does
        - learnModeEnabled: if True, the description will be spoken and
                            brailled if learn mode is enabled.  If False,
                            the function will be called no matter what.
        - enabled: Whether this hander can be used, i.e. based on mode, the
          feature being enabled/active, etc.
        N)rD   descriptionlearnModeEnabled_enabled)r   rD   r%  r&  enableds        r   r   zInputEventHandler.__init__  s"    & !& 0r   c                 :    |sy| j                   |j                   k(  S )z&Compares one input handler to another.F)rD   r   s     r   r   zInputEventHandler.__eq__  s     /0r   c                 :    | j                    d| j                   dS )Nz (enabled: r  )r%  r'  r    s    r   r   zInputEventHandler.__str__  s     ""#;t}}oQ??r   c                     d| j                    d| j                   }t        j                  t        j                  |d       | j                  S )z(Returns True if this handler is enabled.zINPUT EVENT HANDLER: z is enabled: T)r%  r'  r   ra  ry   )r   rh  s     r   rK  zInputEventHandler.is_enabled  sC     &d&6&6%7}T]]OT5++S$7}}r   c                     || _         y)z"Sets this handler's enabled state.N)r'  )r   r(  s     r   set_enabledzInputEventHandler.set_enabled  s      r   c                     | j                   syd}	 | j                  ||      }|S # t        $ r' t        j                  t        j
                         Y |S w xY w)aw  Processes an input event.

        This function is expected to return True if it consumes the
        event; otherwise it is expected to return False.

        Arguments:
        - script:     the script (if any) associated with this event
        - inputEvent: the input event to pass to the function bound
                      to this InputEventHandler instance.
        F)r'  rD   r:   r   printExceptionLEVEL_SEVERE)r   r*  rW  consumeds       r   r  z#InputEventHandler.processInputEvent  sY     }}	5}}VZ8H   	5  !3!34	5s   % ,AAN)TT)	r)   r*   r+   r   r   r   rK  r-  r  r$   r   r   r#  r#    s!     01@ 
r   r#  )$__doc____id____version____date____copyright____license__girequire_versiongi.repositoryr   r  r   r   r   rM   r   r	   r
   r   r   r   r   r   	ax_objectr   ax_utilitiesr   rQ   r  r
  r   r=   r?   r  r  r#  r$   r   r   <module>r=     s   * 27 	   7E "               %#  0
aJ aFD: DLCz CLF Fr   