
    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Zddl	Z	 e	j                  dd	       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 e       Zd Zy)zManages the Orca modifier key.z$Id$z
$Revision$z$Date$zGCopyright (c) 2023 Igalia, S.L.Copyright (c) 2023 GNOME Foundation Inc.LGPL    NAtspiz2.0)r      )debug)keybindings)
orca_state)settings_managerc                   f    e Zd ZdZd Zed        Zd Zd Zd Z	d Z
d Zdd	Zd
 Zd ZddZd Zy)OrcaModifierManagerzManages the Orca modifier.c                 <    i | _         d| _        d| _        d| _        y )N F)_grabbed_modifiers_original_xmodmap_caps_lock_cleared_need_to_restore_orca_modifier)selfs    </usr/lib/python3/dist-packages/orca/orca_modifier_manager.py__init__zOrcaModifierManager.__init__0   s$    "$ "$"'.3+    c                 L    | t        j                         j                  d      v S )zAReturns True if modifier is one of the user's Orca modifier keys.orcaModifierKeys)r	   
getManager
getSetting)modifiers    r   is_orca_modifierz$OrcaModifierManager.is_orca_modifier8   s%     +668CCDVWWWr   c                     || j                   v S )z7Returns True if there is an existing grab for modifier.)r   r   r   s     r   is_modifier_grabbedz'OrcaModifierManager.is_modifier_grabbed>   s     42222r   c                 v    t        j                         j                  d      D ]  }| j                  |        y)z4Adds grabs for all of the user's Orca modifier keys.r   N)r	   r   r   add_modifier_grabr   s     r   add_grabs_for_orca_modifiersz0OrcaModifierManager.add_grabs_for_orca_modifiersC   s6     )335@@AST 	-H""8,	-r   c                 v    t        j                         j                  d      D ]  }| j                  |        y)z6Remove grabs for all of the user's Orca modifier keys.r   N)r	   r   r   remove_modifier_grabr   s     r   remove_grabs_for_orca_modifiersz3OrcaModifierManager.remove_grabs_for_orca_modifiersI   s6     )335@@AST 	0H%%h/	0r   c                 V   || j                   v ryt        j                  )d}t        j                  t        j
                  |dd       yt        j                         }t        j                  |      |_
        d|_        t        j                  j                  |      | j                   |<   y)zAdds a grab for modifier.Nz;WARNING: Attempting to add modifier grabs without a device.Tr   )r   r   devicer   printMessageLEVEL_WARNINGr   KeyDefinitionr   
getKeycodekeycode	modifiersadd_key_grab)r   r   msgkds       r   r    z%OrcaModifierManager.add_modifier_grabO   s     t...$OCu22CtD  " ++H5
,6,=,=,J,J2,N)r   c                    || j                   vryt        j                  )d}t        j                  t        j
                  |dd       yt        j                  j                  | j                   |          | j                   |= y)zRemoves the grab for modifier.Nz>WARNING: Attempting to remove modifier grabs without a device.T)r   r   r&   r   r'   r(   remove_key_grab)r   r   r.   s      r   r#   z(OrcaModifierManager.remove_modifier_grab_   sp     4222$RCu22CtD))$*A*A(*KL##H-r   c                    d}|r|d| z  }t        j                  t         j                  |d       | j                  |       t	        j
                  dt        j                  d   dg      | _        | j                          y)z!Refreshes the Orca modifier keys.z0ORCA MODIFIER MANAGER: Refreshing Orca modifiers: TxkbcompDISPLAY-N)
r   r'   
LEVEL_INFOunset_orca_modifiers
subprocesscheck_outputosenvironr   _create_orca_xmodmap)r   reasonr.   s      r   refresh_orca_modifiersz*OrcaModifierManager.refresh_orca_modifiersm   st     ARx= C5++S$7!!&)!+!8!8)RZZPYEZ\_9`!a!!#r   c                 B   d}t        j                  t         j                  |d       | j                  |j                        r(t
        j                  r| j                          d| _        y| j                  r)t
        j                  s| j                          d| _        yyy)zFUnsupported convenience method to call sad hacks which should go away.z'ORCA MODIFIER MANAGER: Updating key mapTNF)
r   r'   r7   r   event_stringr   bypassNextCommandr8   r   r=   )r   keyboard_eventr.   s      r   update_key_mapz"OrcaModifierManager.update_key_mapy   s    
 85++S$7  !<!<=*B^B^%%'26D/..z7S7S%%'27D/ 8T.r   c                    d}t        j                  t         j                  |d       | j                  d      s| j                  d      r| j	                  d       d| _        y| j
                  r| j	                  d       d| _        yy)z?Makes an Orca-specific Xmodmap so that the Orca modifier works.z,ORCA MODIFIER MANAGER: Creating Orca xmodmapT	Caps_Lock
Shift_LockFN)r   r'   r7   r   set_caps_lock_as_orca_modifierr   )r   r.   s     r   r=   z(OrcaModifierManager._create_orca_xmodmap   sv     =5++S$7  -1F1F|1T//5&*D#$$//6&+D# %r   c                    d}|r|d| z  }t        j                  t         j                  |d       | j                  s(d}t        j                  t         j                  |d       yd| _        t        j                  ddd	t        j                  d
   gt
        j                  dd      }|j                  | j                         d}t        j                  t         j                  |d       y)z:Turns the Orca modifiers back into their original purpose.z=ORCA MODIFIER MANAGER: Attempting to restore original xmodmapr3   Tz.ORCA MODIFIER MANAGER: No stored xmodmap foundNFr4   -w0r6   r5   stdinstdoutstderrz0ORCA MODIFIER MANAGER: Original xmodmap restored)r   r'   r7   r   r   r9   Popenr;   r<   PIPEcommunicate)r   r>   r.   ps       r   r8   z(OrcaModifierManager.unset_orca_modifiers   s     NRx= C5++S$7%%BCu//d;"'iRZZ	5JK//$t=	d,,-@5++S$7r   c                 <   d}t        j                  t         j                  |d       t        j                  dt        j
                        }t        j                  dt        j
                        }t        j                  dt        j
                        }t        j                  dt        j
                        }t        j                  dt        j
                        }d}d	}	d
}
| j                  j                  d      j                  d      }d}d}d}t        |      D ]  \  }}|s+|s)|j                  |      rd}|j                  |      s0d}3|rH|r|j                  |      r |
||<   d}n|j                  |      r|||<   d}|j                  d      szd}}|s|r|j                  |      r |
||<   d}n|j                  |      r|	||<   d}|j                  d      sd} |rd}t        j                  t         j                  |d       t        j                  dddt        j                  d   gt        j                   dd      }|j#                  t%        dj'                  |      d             yd}t        j                  t         j                  |d       y)zCEnable or disable use of the caps lock key as an Orca modifier key.z=ORCA MODIFIER MANAGER: Setting caps lock as the Orca modifierTz=^\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-8
F}z'ORCA MODIFIER MANAGER: Updating xmodmapr4   rJ   r6   r5   NrK   z+ORCA MODIFIER MANAGER: Not updating xmodmap)r   r'   r7   recompileIr   decodesplit	enumeratematchfindr9   rO   r;   r<   rP   rQ   bytesjoin)r   enabler.   interpret_caps_line_prognormal_caps_line_proginterpret_shift_line_prognormal_shift_line_progdisabled_mod_line_prognormal_caps_linenormal_shift_linedisabled_mod_linelinesfound_caps_interpret_sectionfound_shift_interpret_sectionmodifiedilinerR   s                     r   rH   z2OrcaModifierManager.set_caps_lock_as_orca_modifier   s[    N5++S$7#%::Lbdd$T  "

QSUSWSW!Y$&JJ[]_]a]a%c!!#RTVTXTX"Z!#:BDD"BFH9&&--g6<<TB',$(-% ' 	:GAt/8U+11$7370.44T:481-,2248#4a#'-33D9#3a#'99S>380.-33D9#4a#'-33D9#4a#'99S>4917	:8 ;Cu//d;  )UCI9N!O ood4AAMM%		% 0':;?Cu//d;r   N)r   )__name__
__module____qualname____doc__r   staticmethodr   r   r!   r$   r    r#   r?   rD   r=   r8   rH    r   r   r   r   -   sS    $4 X X
3
-0O .
$8",8*;<r   r   c                      t         S )N)_managerrt   r   r   r   r      s    Or   )rr   __id____version____date____copyright____license__r;   rV   r9   girequire_versiongi.repositoryr   r   r   r   r   r	   r   rv   r   rt   r   r   <module>r      sn   , %; 	 	  	   7E "     z< z<z  r   