+
    Qi:  c                  sR  a  0 t $ R t^ RIHt RtRtRtRtRt^ RI	t	^ RI
t
^ RIt^ RIHt ^ RIt]P                  ! R	R
4       ]P                  ! RR4       ^ RIHt ^ RIHt ^ RIHt ^RIHt ^RIHt ^RIHt ^RIHt ]'       d   ^RIHt  ! R R4      t]! 4       tR]R&   R R ltR# )zManages the Orca modifier key.)annotationsz$Id$z
$Revision$z$Date$zGCopyright (c) 2023 Igalia, S.L.Copyright (c) 2023 GNOME Foundation Inc.ZLGPLN)TYPE_CHECKINGAtspiz2.0Gdkz3.0)r   )GLib)r   )debug)keybindings)input_event_manager)settings_manager)KeyboardEventc                  s    ] tR t^:tRtR R ltR R ltR R ltR R	 ltR
 R lt	R R lt
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR&R R lltR R ltR&R  R! lltR" R# ltR$tR%# )'OrcaModifierManagerzManages the Orca modifier.c                   V ^8  d   QhRR/#    returnNone Zformat   "?/usr/lib/python3.14/site-packages/orca/orca_modifier_manager.py__annotate__ OrcaModifierManager.__annotate__=   s     = =$ =    c                	st   / V n         R V n        RV n        R V n        R V n        \
        P                  P                  4       pVeK   VP                  4       pVP                  RV P                  4       VP                  RV P                  4       R# Rp\        P                  ! \        P                  VR4       R# )Fr   Nzdevice-addedzdevice-removedz>ORCA MODIFIER MANAGER: Cannot listen for input device changes.T)_grabbed_modifiers_is_pressed_original_xmodmap_caps_lock_cleared_need_to_restore_orca_modifierr   ZDisplayZget_defaultZget_device_managerZconnect_on_device_changedr   print_message
LEVEL_INFO)selfdisplayZdevice_managermsgs   &   r   __init__ZOrcaModifierManager.__init__=   s    (*!& ),(-49+ ++))+$779N"">43J3JK""#3T5L5LMRC 0 0#t<r   c                    V ^8  d   QhRRRR/# )r   devicez
Gdk.Devicer   r   r   r   r   r   r   r   P   s     E E* E Er   c                s    VP                  4       pRV.p\        P                  ! \        P                  VR4       V\        P
                  P                  8X  d   V P                  R4       R# R# )zHandles device-* signals.z%ORCA MODIFIER MANAGER: Device changedTzKeyboard change detected.N)Z
get_sourcer   Zprint_tokensr   r   ZInputSourceZKEYBOARDrefresh_orca_modifiers)r   Z_device_managerr$   ZsourceZtokenss   &&&  r   r   Z&OrcaModifierManager._on_device_changedP   sZ     ""$96B5++VT:S__---''(CD .r   c               r#   r   modifierstrr   boolr   r   r   r   r   r   Y   s     	 	 	 	r   c                s    V\         P                  ! 4       P                  R4      9  d   R# VR9   d   V P                  V4      # R# )zAReturns True if modifier is one of the user's Orca modifier keys.orcaModifierKeysFTZInsertZ	KP_Insert)r   get_managerget_settingis_modifier_grabbedr   r'      &&r   is_orca_modifierZ$OrcaModifierManager.is_orca_modifierY   sB     +779EEFXYY..++H55r   c               r   )r   r   r)   r   r   r   r   r   r   d   s        4  r   c                s    V P                   # )zHReturns True if the Orca modifier has been pressed but not yet released.)r   )r      &r   get_pressed_stateZ%OrcaModifierManager.get_pressed_stated   s     r   c               r#   )r   
is_pressedr)   r   r   r   r   r   r   r   r   i   s     & &D &T &r   c                sh    RV 2p\         P                  ! \         P                  VR4       Wn        R# )z9Updates the pressed state of the modifier based on event.z0ORCA MODIFIER MANAGER: Setting pressed state to TN)r   r   r   r   )r   r4   r!      && r   set_pressed_stateZ%OrcaModifierManager.set_pressed_statei   s/     AME,,c48%r   c               r#   r&   r   r   r   r   r   r   p   s     3 3C 3D 3r   c                s    WP                   9   # )z7Returns True if there is an existing grab for modifier.)r   r/   r0   r   r.   Z'OrcaModifierManager.is_modifier_grabbedp   s     2222r   c               r   r   r   r   r   r   r   r   u   s     1 1d 1r   c                s    \         P                  ! 4       P                  R4       F  pVR9   g   K  V P                  V4       K  	  R# )z4Adds grabs for all of the user's Orca modifier keys.r*   Nr+   )r   r,   r-   add_modifier_grabr/      & r   add_grabs_for_orca_modifiersZ0OrcaModifierManager.add_grabs_for_orca_modifiersu   s=     )446BBCUVH 22&&x0	 Wr   c               r   r   r   r   r   r   r   r   ~   s     ! ! !r   c                s    \         P                  ! 4       P                  R4       F  pVR9   g   K  V P                  V4       K  	  Rp\        P
                  ! \        P                  VR4       RV n        R# )z7Removes grabs for all of the user's Orca modifier keys.r*   zFORCA MODIFIER MANAGER: Setting pressed state to False for grab removalTFNr+   )r   r,   r-   remove_modifier_grabr   r   r   r   )r   r'   r!   s   &  r   remove_grabs_for_orca_modifiersZ3OrcaModifierManager.remove_grabs_for_orca_modifiers~   se     )446BBCUVH 22))(3	 W WE,,c48 r   c               r#   r   r'   r(   r   r   r   r   r   r   r   r      s     	8 	8# 	8$ 	8r   c                s    WP                   9   d   R# \        P                  ! V4      w  r#\        P                  ! 4       P                  WV4      pVR8w  d   W@P                   V&   R# R# )zAdds a grab for modifier.Ni)r   r   Zget_keycodesr   r,   Zadd_grab_for_modifier)r   r'   ZkeyvalZkeycodegrab_id   &&   r   r7   Z%OrcaModifierManager.add_modifier_grab   s[     ...%228<%113II(\cdb=07##H- r   c               r#   r<   r   r   r   r   r   r      s     . .S .T .r   c                s    V P                   P                  V4      pVf   R# \        P                  ! 4       P	                  W4       V P                   V R# )zRemoves the grab for modifier.N)r   getr   r,   Zremove_grab_for_modifier)r   r'   r=   r5   r   r:   Z(OrcaModifierManager.remove_modifier_grab   sG     ))--h7?'')BB8U##H-r   c               r#   r   keyboard_eventr	   r   r   r   r   r   r   r   r      s     3 3m 3 3r   c                sp    VP                   R9   d   V P                  V4       R# V P                  V4       R# )zGToggles the modifier to enable double-clicking causing normal behavior.N)	Caps_Lock
Shift_Lock)keyval_name_toggle_modifier_lock_toggle_modifier_grab)r   rA   r0   r   toggle_modifierZ#OrcaModifierManager.toggle_modifier   s2     %%)DD&&~6"">2r   c               r#   r@   r   r   r   r   r   r      s     H HM Hd Hr   c                s  a  VP                  4       '       d   R# R pV 3R lpRp\        P                  ! \        P                  VR4       S P	                  VP
                  4       RVP
                   2p\        P                  ! \        P                  VR4       \        P                  ! ^W!P                  4       Rp\        P                  ! \        P                  VR4       \        P                  ! RW1P
                  4       R# )	zRToggles the grab for a modifier to enable double-clicking causing normal behavior.Nc                sf    \         P                  ! V R \         P                  P                  4       R# ) F)r   generate_keyboard_eventKeySynthTypeZPRESSRELEASE)hw_coder2   r   toggleZ9OrcaModifierManager._toggle_modifier_grab.<locals>.toggle   s#    ))'2u7I7I7V7VWr   c                s*   < SP                  V 4       R # )F)r7   )r'   r   s   &r   restore_grabZ?OrcaModifierManager._toggle_modifier_grab.<locals>.restore_grab   s    ""8,r   z/ORCA MODIFIER MANAGER: Removing grab pre-toggleTz,ORCA MODIFIER MANAGER: Scheduling toggle of z<ORCA MODIFIER MANAGER: Scheduling re-adding grab post-togglei  )	is_pressed_keyr   r   r   r:   rD   r   timeout_addrK   )r   rA   rL   rM   r!   s   f&   r   rF   Z)OrcaModifierManager._toggle_modifier_grab   s     ((**		 @E,,c48!!."<"<=<^=W=W<XYE,,c48F$:$:;LE,,c48l,F,FGr   c               r#   r@   r   r   r   r   r   r      s     H HM Hd Hr   c                s   VP                  4       '       g   R# R pVP                  R8X  d#   ^\        P                  P                  ,          pM5VP                  R8X  d#   ^\        P                  P
                  ,          pMR# Rp\        P                  ! \        P                  VR4       \        P                  ! ^W!P                  V4       R# )zRToggles the lock for a modifier to enable double-clicking causing normal behavior.Nc                s\   W,          '       dD   \         P                  P                  pR p\        P                  ! \        P
                  VR4       MB\         P                  P                  pRp\        P                  ! \        P
                  VR4       \         P                  ! VRV4       R# )z)ORCA MODIFIER MANAGER: Unlocking CapsLockTz'ORCA MODIFIER MANAGER: Locking CapsLockrH   N)r   rJ   ZUNLOCKMODIFIERSr   r   r   ZLOCKMODIFIERSrI   )	modifiersr'   Zlockr!   s   &&  r   rL   Z9OrcaModifierManager._toggle_modifier_lock.<locals>.toggle   sy    ##))99A##E$4$4c4@))77?##E$4$4c4@))(B=r   rB   rC   z-ORCA MODIFIER MANAGER: Scheduling lock changeT)rN   rD   r   ZModifierTypeZ	SHIFTLOCKZSHIFTr   r   r   r   rO   rP   )r   rA   rL   r'   r!   r>   r   rE   Z)OrcaModifierManager._toggle_modifier_lock   s     ,,..		> %%4E..888H''<7E..444H=E,,c48F$<$<hGr   c               r#   r   reasonr(   r   r   r   r   r   r   r   r      s     $ $S $$ $r   c                sJ   RpV'       d   VRV 2,          p\         P                  ! \         P                  VR4       \        P                  P                  R4      pV'       g+   Rp\         P                  ! \         P                  VR4       R# V P                  V4       \        P                  ! RVR.\        P                  \        P                  R	7      ;_uu_ 4       pVP                  4       w  V n        pRRR4       V P                  4        R#   + '       g   i     L"; i)
z!Refreshes the Orca modifier keys.z0ORCA MODIFIER MANAGER: Refreshing Orca modifiers: TDISPLAYzCORCA MODIFIER MANAGER: DISPLAY not set, skipping xkbcomp operationsNxkbcomp-)stdoutstderr)r   r   r   osenvironr?   unset_orca_modifiers
subprocessPopenPIPEZDEVNULLcommunicater   _create_orca_xmodmap)r   rR   r!   r    pZ_s   &&    r   r%   Z*OrcaModifierManager.refresh_orca_modifiers   s     ARx= CE,,c48**..+WC 0 0#t<!!&)y'37%/__Z=O=OQ QTU()%D"AQ 	!!#Q Qs   DD"	c               r   r   r   r   r   r   r   r      s     , ,d ,r   c                s>   Rp\         P                  ! \         P                  VR4       V P                  R4      '       g   V P                  R4      '       d   V P	                  R4       RV n        R# V P
                  '       d   V P	                  R4       RV n        R# R# )z?Makes an Orca-specific Xmodmap so that the Orca modifier works.z,ORCA MODIFIER MANAGER: Creating Orca xmodmapTrB   rC   FN)r   r   r   r1   set_caps_lock_as_orca_modifierr   )r   r!   r8   r   r`   Z(OrcaModifierManager._create_orca_xmodmap   s     =E,,c48  --1F1F|1T1T//5&*D#$$$//6&+D# %r   c               r#   rQ   r   r   r   r   r   r     s     9 93 9 9r   c                s   RpV'       d   VRV 2,          p\         P                  ! \         P                  VR4       V P                  '       g+   Rp\         P                  ! \         P                  VR4       R# \        P
                  P                  R4      pV'       g+   Rp\         P                  ! \         P                  VR4       R# RV n        \        P                  ! R	R
RV.\        P                  RRR7      ;_uu_ 4       pVP                  V P                  4       RRR4       Rp\         P                  ! \         P                  VR4       R#   + '       g   i     L:; i)z:Turns the Orca modifiers back into their original purpose.z=ORCA MODIFIER MANAGER: Attempting to restore original xmodmaprS   Tz.ORCA MODIFIER MANAGER: No stored xmodmap foundNrT   zDORCA MODIFIER MANAGER: DISPLAY not set, skipping xmodmap restorationFrU   -w0rV   ZstdinrW   rX   z0ORCA MODIFIER MANAGER: Original xmodmap restored)r   r   r   r   rY   rZ   r?   r   r\   r]   r^   r_   )r   rR   r!   r    ra   r>   r   r[   Z(OrcaModifierManager.unset_orca_modifiers  s    NRx= CE,,c48%%%BC 0 0#t<**..+XC 0 0#t<"'y%g>$.OODO ORSMM$001O AE,,c48O Os   EE#	c               r#   )r   enabler)   r   r   r   r   r   r   r   r     s     H= H=T H=d H=r   c           	     sX   Rp\         P                  ! \         P                  VR4       \        P                  P                  R4      pV'       g+   Rp\         P                  ! \         P                  VR4       R# V P                  '       g+   Rp\         P                  ! \         P                  VR4       R# \        P                  ! R\        P                  4      p\        P                  ! R\        P                  4      p\        P                  ! R	\        P                  4      p\        P                  ! R
\        P                  4      p\        P                  ! R\        P                  4      pRp	Rp
RpV P                  P                  R4      P                  R4      pRpRpRp\        V4       EF   w  ppV'       gA   V'       g9   VP                  V4      '       d   RpK2  VP                  V4      '       d   RpKM  KO  V'       da   V'       d   VP                  V4      '       d   WV&   RpMVP                  V4      '       d   WV&   RpVP                  R4      '       d   RpK  K  V'       g   K  V'       d   VP                  V4      '       d   WV&   RpMVP                  V4      '       d   WV&   RpVP                  R4      '       g   EK  RpEK#  	  V'       d   Rp\         P                  ! \         P                  VR4       \        P                   ! RRRV.\        P"                  RRR7      ;_uu_ 4       pVP%                  \'        RP)                  V4      R4      4       RRR4       R# Rp\         P                  ! \         P                  VR4       R#   + '       g   i     R# ; i)zCEnable or disable use of the caps lock key as an Orca modifier key.z=ORCA MODIFIER MANAGER: Setting caps lock as the Orca modifierTrT   z?ORCA MODIFIER MANAGER: DISPLAY not set, cannot modify caps lockNzDORCA MODIFIER MANAGER: No xmodmap available, cannot modify caps lockz=^\s*interpret\s+Caps[_+]Lock[_+]AnyOfOrNone\s*\(all\)\s*{\s*$zB^\s*action\s*=\s*LockMods\s*\(\s*modifiers\s*=\s*Lock\s*\)\s*;\s*$zL^\s*interpret\s+Shift[_+]Lock[_+]AnyOf\s*\(\s*Shift\s*\+\s*Lock\s*\)\s*{\s*$zC^\s*action\s*=\s*LockMods\s*\(\s*modifiers\s*=\s*Shift\s*\)\s*;\s*$z+^\s*action\s*=\s*NoAction\s*\(\s*\)\s*;\s*$z)        action= LockMods(modifiers=Lock);z*        action= LockMods(modifiers=Shift);z        action= NoAction();zUTF-8Z
FZ}z'ORCA MODIFIER MANAGER: Updating xmodmaprU   rc   rV   rd   z+ORCA MODIFIER MANAGER: Not updating xmodmap)r   r   r   rY   rZ   r?   r   reZcompileZIZdecodeZsplitZ	enumerateZmatchZfindr\   r]   r^   r_   ZbytesZjoin)r   re   r!   r    Zinterpret_caps_line_progZnormal_caps_line_progZinterpret_shift_line_progZnormal_shift_line_progZdisabled_mod_line_progZnormal_caps_lineZnormal_shift_lineZdisabled_mod_lineZlinesZfound_caps_interpret_sectionZfound_shift_interpret_sectionZmodifiedZiZlinera   s   &&                 r   rb   Z2OrcaModifierManager.set_caps_lock_as_orca_modifier  s    NE,,c48**..+SC 0 0#t<%%%XC 0 0#t<#%::Lbdd$T  "

QSUSWSW!Y$&JJ[]_]a]a%c!!#RTVTXTX"Z!#:BDD"BFH9&&--g6<<TB',$(-% 'GAt/8U+11$77370.44T::481 ;-,22488#4a#'-33D99#3a#'99S>>380 "..-33D99#4a#'-33D99#4a#'99S>>4917 (8 ;C 0 0#t< !!9eS'"B$.OODO ORSeDIIe$4g>?O O @C 0 0#t<O O Os   9+NN)	)r   r   r   r   r   N)rH   )Z__name__Z
__module__Z__qualname__Z__firstlineno____doc__r"   r   r1   r3   r6   r.   r9   r;   r7   r:   rG   rF   rE   r%   r`   r[   rb   Z__static_attributes__r   r   r   r
   r
   :   sd    $=&E	 
&3
1!	8.3H6H8$(,98H= H=r   r
   _managerc               r   )r   r   r
   r   r   r   r   r   r   j  s      ( r   c                 s    \         # )z*Returns the OrcaModifierManager singleton.)rh   r   r   r   r,   r,   j  s	     Or   )__conditional_annotations__rg   Z
__future__r    Z__id__Z__version__Z__date__Z__copyright__Z__license__rY   rf   r\   Ztypingr   ZgiZrequire_versionZgi.repositoryr   r   r   rH   r   r   r   r   Zinput_eventr	   r
   rh   Z__annotations__r,   )ri   s   @r   <module>rj      s   4 % #; 	 	    	   7E "   5%        ! *k= k=\	 !4 5
 5r   