
    f                       d dl mZmZmZ d dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlZ ej                  e      Zd dlmZ  e        	 d dl	mZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZm Z m!Z! d dl"m#Z# d dl$m%Z%m&Z& d dl'm(Z(m)Z)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 	 d dl'm:Z:m;Z;m<Z< d dl>m?Z?  e?       Z@ G d d      ZA G d d      ZB G d d      ZC G d d      ZD G d d eE      ZF G d! d"eF      ZG G d# d$eG      ZH G d% d&      ZI G d' d(eI      ZJ G d) d*eI      ZK G d+ d,e5      ZL G d- d.eE      ZM G d/ d0eM      ZN G d1 d2eN      ZO G d3 d4eN      ZP G d5 d6eN      ZQ G d7 d8eN      ZR G d9 d:eN      ZS G d; d<eM      ZT G d= d>eM      ZU G d? d@eM      ZV G dA dBeM      ZW G dC dDeM      ZX G dE dFeM      ZY G dG dHeM      ZZ G dI dJeM      Z[ G dK dLeM      Z\ G dM dNeM      Z] G dO dPeM      Z^ G dQ dReM      Z_ G dS dTeM      Z` G dU dVeM      Za G dW dXeM      Zb G dY dZeM      Zcy# e$ rZej+                  d       Y dZ[
dZ[ww xY w# e=$ r Y w xY w)[    )divisionprint_functionunicode_literalsN)contextmanager)GdkGLib)require_gi_versions)Atspiz3Atspi typelib missing, at-spi key-synth unavailable)	KeyCommon)StickyBehavior)TouchFeedback)Sound)ClickSimulatorCSButtonMapperCSFloatingSlave)Scanner)TimerProgressiveDelayTimer)	ModifiersLABEL_MODIFIERSparse_key_combination)HandleUIMaskKeySynthEnumUINPUT_DEVICE_NAME)AutoShow)AutoHide)WordSuggestions)canonical_equivalents)
run_scriptget_keysym_from_namedictproperty)Configc                   (    e Zd ZdZ ed      \  ZZZy)	EventTypez+ enum of event types for key press/release    N)__name__
__module____qualname____doc__rangeCLICKDOUBLE_CLICKDWELL     2/usr/lib/python3/dist-packages/Onboard/Keyboard.pyr%   r%   G   s    5
 	a	r0   r%   c                   (    e Zd ZdZ ed      \  ZZZy)DockModez enum dock mode r&   N)r'   r(   r)   r*   r+   FLOATINGBOTTOMTOPr/   r0   r1   r3   r3   P   s    
 	a	r0   r3   c                   &    e Zd ZdZ ed      \  ZZy)	ModSourcez% enum of sources of modifier changes    N)r'   r(   r)   r*   r+   KEYBOARDKEYSYNTHr/   r0   r1   r8   r8   Y   s    / 	ar0   r8   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
UnpressTimerszj
    Redraw keys unpressed after a short while.
    There are multiple timers to suppurt multi-touch.
    c                      || _         i | _        y N)	_keyboard_timers)selfkeyboards     r1   __init__zUnpressTimers.__init__g   s    !r0   c                     | j                   j                  |      }|st               }|| j                   |<   |j                  t        j
                  | j                  |       y r?   )rA   getr   startconfigUNPRESS_DELAYon_timerrB   keytimers      r1   rG   zUnpressTimers.startk   sH      %GE %DLLF(($--=r0   c                 z    | j                   j                  |      }|r|j                          | j                   |= y y r?   )rA   rF   stoprK   s      r1   rO   zUnpressTimers.stopr   s3      %JJLS! r0   c                     | j                   j                         D ]!  \  }}t        j                  |       d|_        # y NF)rA   itemsr   rO   pressedrK   s      r1   
cancel_allzUnpressTimers.cancel_allx   s5    ,,,,. 	 JCJJuCK	 r0   c                     | j                   j                  |      }|r"|j                          | j                  |       y y r?   )rA   rF   rO   unpressrK   s      r1   finishzUnpressTimers.finish}   s3      %JJLLL r0   c                 H    | j                  |       | j                  |       yrQ   )rV   rO   rB   rL   s     r1   rJ   zUnpressTimers.on_timer   s    S		#r0   c                 b    |j                   r#d|_         | j                  j                  |       y y rQ   )rS   r@   on_key_unpressedrY   s     r1   rV   zUnpressTimers.unpress   s'    ;;CKNN++C0 r0   N)r'   r(   r)   r*   rD   rG   rO   rT   rW   rJ   rV   r/   r0   r1   r=   r=   a   s*    
>" 

1r0   r=   c                   4    e Zd ZdZdZeed               Zd Zy)KeySynthr   Fc               #   @   K   dt         _        d dt         _        yw)z
        Temporarily disable the keypress delay. Do not nest.
        Mainly used for single key-strokes as there are far fewer calls
        for these than the bulk text insertion calls.
        TNF)r]   _suppress_keypress_delayr/   r0   r1   no_delayzKeySynth.no_delay   s      -1)
,1)s   c                     t         j                  j                  }|rrt        j                  sDt        j
                         t        j                  z
  }||z
  }|dkD  rt        j                  |       t        j
                         t        _        yy)z|
        Pause between multiple key-strokes.
        Firefox and Thunderbird may need this to not miss key-strokes.
                N)rH   rC   inter_key_stroke_delayr]   r_   time_last_press_timesleep)rB   delayelapsed	remainings       r1   _delay_keypresszKeySynth._delay_keypress   sd    
 6644))+(A(AA!GO	s?JJy)(,		H% r0   N)	r'   r(   r)   re   r_   staticmethodr   r`   rj   r/   r0   r1   r]   r]      s-    $2  24r0   r]   c                   ^    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y)KeySynthVirtkeyz, Synthesize key strokes with python-virtkey c                      || _         || _        y r?   )r@   _vkrB   rC   vks      r1   rD   zKeySynthVirtkey.__init__   s    !r0   c                     d | _         y r?   )ro   rB   s    r1   cleanupzKeySynthVirtkey.cleanup   s	    r0   c                     t         j                  dj                  t        |                   | j                  r-| j                  j                  |      }| j                  |       y y )Nz!KeySynthVirtkey.press_unicode({}))_loggerdebugformatreprro   keysym_from_unicodepress_keysymrB   charkeysyms      r1   press_unicodezKeySynthVirtkey.press_unicode   sL    9@@dLM88XX11$7Ff% r0   c                     t         j                  dj                  t        |                   | j                  r-| j                  j                  |      }| j                  |       y y )Nz#KeySynthVirtkey.release_unicode({}))rv   rw   rx   ry   ro   rz   release_keysymr|   s      r1   release_unicodezKeySynthVirtkey.release_unicode   sL    ;BB4:NO88XX11$7F' r0   c                    t         j                  dj                  |             | j                  r\| j                  j	                  |      \  }}|r*| j
                  j                  t        j                  |       | j                  |       y y )Nz KeySynthVirtkey.press_keysym({}))
rv   rw   rx   ro   keycode_from_keysymr@   lock_temporary_modifiersr8   r;   press_keycoderB   r~   keycodemod_masks       r1   r{   zKeySynthVirtkey.press_keysym   sq    8??GH88 $ < <V DGX 77&&2 w' r0   c                    t         j                  dj                  |             | j                  rY| j                  j	                  |      \  }}| j                  |       | j                  j                  t        j                         y y )Nz"KeySynthVirtkey.release_keysym({}))
rv   rw   rx   ro   r   release_keycoder@   unlock_temporary_modifiersr8   r;   r   s       r1   r   zKeySynthVirtkey.release_keysym   se    :AA&IJ88 $ < <V DGX  )NN55i6H6HI	 r0   c                     t         j                  dj                  |             | j                  r,| j	                          | j                  j                  |       y y )Nz!KeySynthVirtkey.press_keycode({}))rv   rw   rx   ro   rj   r   rB   r   s     r1   r   zKeySynthVirtkey.press_keycode   sD    9@@IJ88  "HH""7+ r0   c                     t         j                  dj                  |             | j                  r| j                  j	                  |       y y )Nz#KeySynthVirtkey.release_keycode({}))rv   rw   rx   ro   r   r   s     r1   r   zKeySynthVirtkey.release_keycode   s8    ;BB7KL88HH$$W- r0   c                 6    | j                   j                         S r?   )ro   get_current_grouprs   s    r1   r   z!KeySynthVirtkey.get_current_group   s    xx))++r0   c                 T    | j                   r| j                   j                  |       y y r?   )ro   
lock_grouprB   groups     r1   r   zKeySynthVirtkey.lock_group   s     88HH& r0   c                 T    | j                   r| j                   j                  |       y y r?   )ro   lock_modrB   r   s     r1   r   zKeySynthVirtkey.lock_mod   s     88HHh' r0   c                 T    | j                   r| j                   j                  |       y y r?   )ro   
unlock_modr   s     r1   r   zKeySynthVirtkey.unlock_mod   s     88HH) r0   c                 `   |j                  dd      }| j                  r|D ]  }|dk(  r.t        d      }| j                  |       | j	                  |       6|dk(  r.t        d      }| j                  |       | j	                  |       i| j                  |       | j                  |        yy)zJ
        Send key presses for all characters in a unicode string.
        \n
	backspacereturnN)replacero   r!   r{   r   r   r   )rB   keystrchr~   s       r1   press_key_stringz KeySynthVirtkey.press_key_string   s     t,88 -:1+>F%%f-''/4Z 2(;F%%f-''/&&r*((,- r0   N)r'   r(   r)   r*   rD   rt   r   r   r{   r   r   r   r   r   r   r   r   r/   r0   r1   rm   rm      sG    6&(
(J,.
,'(*-r0   rm   c                   4     e Zd ZdZ fdZd Zd Zd Z xZS )KeySynthAtspia*  
    Synthesize key strokes with AT-SPI

    Not really useful anymore, as key generation there doesn't fit
    Onboard's requirements very well, e.g. there is no consistent
    separation between press and release events.

    Also some unexpected key sequences are not faithfully reproduced.
    c                 .    t         t        |   ||       y r?   )superr   rD   )rB   rC   rq   	__class__s      r1   rD   zKeySynthAtspi.__init__  s    mT+Hb9r0   c                     dt               vry | j                          t        j                  |dt        j                  j
                         y Nr
    )globalsrj   r
   generate_keyboard_eventKeySynthTypePRESSr   s     r1   r   zKeySynthAtspi.press_keycode  s9    ')#%%gr53E3E3K3KLr0   c                 |    dt               vry t        j                  |dt        j                  j                         y r   )r   r
   r   r   RELEASEr   s     r1   r   zKeySynthAtspi.release_keycode   s-    ')#%%gr53E3E3M3MNr0   c                 |    dt               vry t        j                  d|t        j                  j                         y )Nr
   r   )r   r
   r   r   STRINGrB   strings     r1   r   zKeySynthAtspi.press_key_string%  s-    ')#%%a1C1C1J1JKr0   )	r'   r(   r)   r*   rD   r   r   r   __classcell__)r   s   @r1   r   r     s    :MO
Lr0   r   c                       e Zd ZdZd Zd Zy)TextChangerz.
    Abstract base class of TextChangers.
    c                      || _         || _        y r?   rC   rq   rp   s      r1   rD   zTextChanger.__init__0  s     r0   c                      d | _         d | _        y r?   r   rs   s    r1   rt   zTextChanger.cleanup4  s    r0   N)r'   r(   r)   r*   rD   rt   r/   r0   r1   r   r   +  s    r0   r   c                   x    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dZd Zd Zy)TextChangerKeyStrokezr
    Insert and delete text with key-strokes.
    - KeySynthVirtkey
    - KeySynthAtspi (not used by default)
    c                     t         j                  | ||       t        ||      | _        t	        ||      | _        | j                          y r?   )r   rD   rm   _key_synth_virtkeyr   _key_synth_atspi_update_key_synthrp   s      r1   rD   zTextChangerKeyStroke.__init__@  s>    T8R0"1(B"? -h ; r0   c                    t        t        j                  j                        }|t         j                  k(  r0t         j
                  t         j                  t         j                  g}n|g}t        j                  dj                  |             d }d }| j                  }|D ]  }|t         j                  k(  r| j                  }|} n|st        j                  d       >| j                  }	 |t         j
                  k(  r|j                  |j                         n3|t         j                  k(  r |j                  |j                   t"               |} n t        j)                  dj                  |             || _        y # t$        j&                  $ r0}t        j                  dj                  ||             Y d }~d }~ww xY w)NzKey-synth candidates: {}z&Key-synth '{}' unavailable: vk is NonezKey-synth '{}' unavailable: {}zUsing key-synth '{}')r   rH   rC   	key_synthAUTOXTESTUINPUTATSPIrv   rw   rx   rq   r   r   select_backendBACKEND_XTESTBACKEND_UINPUTr   oskerrorinfo
_key_synth)rB   key_synth_idkey_synth_candidatesr   rq   id_exs          r1   r   z&TextChangerKeyStroke._update_key_synthH  s{   #FOO$=$=><,,,""##""$$ 
 %1> 0v23	5 	WW' 	8Cl((( 11	"MM"JK $ 7 7I
8,"4"44--b.>.>? L$7$77--b.?.?.@B'*#	8, 	+f\*	, $ 99 8&F'-vc28 88s   +A$E>>G%F<<Gc                     | j                   r!| j                   j                          d | _         | j                  r!| j                  j                          d | _        t        j                  |        y r?   )r   rt   r   r   rs   s    r1   rt   zTextChangerKeyStroke.cleanups  sX     ""##++-&*D#  !!))+$(D!D!r0   c                 :    | j                   j                  |       y r?   )r   r   rB   r}   s     r1   r   z"TextChangerKeyStroke.press_unicode  s    %%d+r0   c                 :    | j                   j                  |       y r?   )r   r   r   s     r1   r   z$TextChangerKeyStroke.release_unicode  s    ''-r0   c                 :    | j                   j                  |       y r?   )r   r   r   s     r1   r   z"TextChangerKeyStroke.press_keycode  s    %%g.r0   c                 :    | j                   j                  |       y r?   )r   r   r   s     r1   r   z$TextChangerKeyStroke.release_keycode  s    ''0r0   c                 :    | j                   j                  |       y r?   )r   r{   rB   r~   s     r1   r{   z!TextChangerKeyStroke.press_keysym  s    $$V,r0   c                 :    | j                   j                  |       y r?   )r   r   r   s     r1   r   z#TextChangerKeyStroke.release_keysym  s    &&v.r0   c                 6    | j                   j                         S r?   )r   r   rs   s    r1   r   z&TextChangerKeyStroke.get_current_group  s    0022r0   c                 :    | j                   j                  |       y r?   )r   r   r   s     r1   r   zTextChangerKeyStroke.lock_group  s    ""5)r0   c                 :    | j                   j                  |       y r?   )r   r   rB   mods     r1   r   zTextChangerKeyStroke.lock_mod  s      %r0   c                 :    | j                   j                  |       y r?   )r   r   r   s     r1   r   zTextChangerKeyStroke.unlock_mod  s    ""3'r0   c                 :    | j                   j                  |       y r?   r   r   r   s     r1   r   z%TextChangerKeyStroke.press_key_string  s    ((0r0   c                 ~    t        |      }t        |      D ]$  }| j                  |       | j                  |       & yzY
        Generate any number of full key-strokes for the given named key symbol.
        N)r!   r+   r{   r   )rB   key_namecountr~   is        r1   press_keysymsz"TextChangerKeyStroke.press_keysyms  s=     &h/u 	(Af%'	(r0   c                 :    | j                   j                  |       y)4
        Insert text at the caret position.
        Nr   )rB   texts     r1   insert_string_at_caretz+TextChangerKeyStroke.insert_string_at_caret  s     	((.r0   c                     | j                   j                         5  | j                  d       d d d        y # 1 sw Y   y xY w)Nr   )rC   suppress_modifiersr   rs   s    r1   delete_at_caretz$TextChangerKeyStroke.delete_at_caret  s5    ]]--/ 	,{+	, 	, 	,s   6?N   )r'   r(   r)   r*   rD   r   rt   r   r   r   r   r{   r   r   r   r   r   r   r   r   r   r/   r0   r1   r   r   9  s]    !)$V"",./1-/3*&(1(/,r0   r   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZd Zd Zy)TextChangerDirectInsertzs
    Insert and delete text by direct insertion/deletion.
    - Direct insertion/deletion via AtspiTextContext
    c                 D   t         j                  | ||       || _        |r|j                         nd\  }}|dz  | _        |dz  | _        t               | _        t               | _        t        j                  dj                  | j                  | j
                               y )N)i     gMbP?z+keyboard auto-repeat: delay {}, interval {})r   rD   text_changer_key_strokeget_auto_repeat_rate_auto_repeat_delay_auto_repeat_intervalr   _auto_repeat_delay_timer_auto_repeat_timerrv   rw   rx   )rB   rC   rq   tcksrg   intervals         r1   rD   z TextChangerDirectInsert.__init__  s    T8R0'+$  113  	x"'%-%-%5"(-%"''Cvd55"88:	;r0   c                 N    | j                          t        j                  |        y r?   )stop_auto_repeatr   rt   rs   s    r1   rt   zTextChangerDirectInsert.cleanup  s    D!r0   c                 .    | j                   j                  S r?   )rC   text_contextrs   s    r1   get_text_contextz(TextChangerDirectInsert.get_text_context  s    }})))r0   c                 L    | j                         }|r|j                  |       y y r?   )r  insert_text_at_caret)rB   r}   r  s      r1   _insert_unicodez'TextChangerDirectInsert._insert_unicode  s&    ,,.--d3 r0   c                 f    | j                   j                  | j                  | j                  |       y r?   )r   rG   r   _on_auto_repeat_delay_timerr   s     r1   _start_auto_repeatz*TextChangerDirectInsert._start_auto_repeat  s*    %%++D,C,C,0,L,L,0	2r0   c                 l    | j                   j                          | j                  j                          y r?   )r   rO   r   rs   s    r1   r  z(TextChangerDirectInsert.stop_auto_repeat  s&    %%**,$$&r0   c                 f    | j                   j                  | j                  | j                  |       yrQ   )r   rG   r   _on_auto_repeat_timerr   s     r1   r	  z3TextChangerDirectInsert._on_auto_repeat_delay_timer  s-    %%d&@&@&*&@&@$	Hr0   c                 &    | j                  |       yNT)r  r   s     r1   r  z-TextChangerDirectInsert._on_auto_repeat_timer  s    T"r0   c                 Z    | j                          | j                  j                  |       yzR
        Use key-strokes because of dead keys, hot keys and editing keys.
        N)r  r   r   r   s     r1   r   z%TextChangerDirectInsert.press_keycode  s$     	$$227;r0   c                 :    | j                   j                  |       y r?   )r   r   r   s     r1   r   z'TextChangerDirectInsert.release_keycode  s    $$44W=r0   c                 Z    | j                          | j                  j                  |       yr  )r  r   r{   r   s     r1   r{   z$TextChangerDirectInsert.press_keysym  s$     	$$11&9r0   c                 :    | j                   j                  |       y r?   )r   r   r   s     r1   r   z&TextChangerDirectInsert.release_keysym   s    $$33F;r0   c                 H    | j                  |       | j                  |       y r?   )r  r
  r   s     r1   r   z%TextChangerDirectInsert.press_unicode  s    T"%r0   c                 $    | j                          y r?   )r  r   s     r1   r   z'TextChangerDirectInsert.release_unicode  s    r0   c                 6    | j                   j                         S r?   )r   r   rs   s    r1   r   z)TextChangerDirectInsert.get_current_group
  s    ++==??r0   c                 :    | j                   j                  |       y r?   )r   r   r   s     r1   r   z"TextChangerDirectInsert.lock_group  s    $$//6r0   c                 :    | j                   j                  |       y)zd
        We still have to lock mods for pointer clicks with modifiers
        and hot-keys.
        N)r   r   r   s     r1   r   z TextChangerDirectInsert.lock_mod  s    
 	$$--c2r0   c                 :    | j                   j                  |       y r?   )r   r   r   s     r1   r   z"TextChangerDirectInsert.unlock_mod  s    $$//4r0   c                      y r?   r/   r   s     r1   r   z(TextChangerDirectInsert.press_key_string      r0   c                 <    | j                   j                  ||       yr   )r   r   )rB   r   r   s      r1   r   z%TextChangerDirectInsert.press_keysyms  s     	$$228UCr0   c                 j    | j                         }|j                  dd      }|j                  |       y)r   r   r   N)r  r   r  )rB   r   r  s      r1   r   z.TextChangerDirectInsert.insert_string_at_caret$  s0     ,,.||E4())$/r0   c                 F    | j                         }|j                  d       y Nr   )r  delete_text_before_caretrB   r  s     r1   r   z'TextChangerDirectInsert.delete_at_caret,  s    ,,.--a0r0   Nr   )r'   r(   r)   r*   rD   rt   r  r  r
  r  r	  r  r   r   r{   r   r   r   r   r   r   r   r   r   r   r   r/   r0   r1   r   r     sw    
; "*4
2
'

<>:<& @735D01r0   r   c            	       r   e Zd ZdZdZdZdZdZdZdZ	dddddddddZ
dddddddddZd Zd Z eee      Zd	 Zd
 Zeefd       Zd Zd Zd Zd Z eee      Zd Zd Z ee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-dd"Z.d# Z/dd$Z0d% Z1d& Z2d' Z3d( Z4d) Z5d* Z6dd+Z7d, Z8d- Z9d. Z:d/ Z;d0 Z<d1 Z=d2 Z>d3 Z?d4 Z@d5 ZAd6 ZBd7 ZCdd8ZDd9 ZEd: ZFd; ZGd< ZHd= ZId> ZJd? ZKdd@ZLddAZMddCZNdD ZOdE ZPdF ZQddBeRj                  fdGZTdH ZUdI ZVdJ ZWdK ZXdL ZYdM ZZdN Z[dO Z\dP Z]dQ Z^dR Z_dS Z`dT ZadU ZbdV ZcdW ZddBeRj                  fdXZedY ZfdZ Zgd[ Zhd\ Zid] Zjd^ Zkd_ Zld` ZmddaZndb Zodc Zpdd Zqde Zrdf Zsdg Ztdh Zudi Zvdj Zwdk Zxdl Zydm ZzddnZ{	 	 	 ddoZ|ddpZ}dq Z~dr Zds Zdt Zdu Zdv Zdw Zdx Zdy Zdz Zd{ Zd| Zd} Zd~ Zd Zd Zd Zd Zd ZddZd Zd Zd Zd Zd Z	 	 ddZd Zd ZddZd Zd Zd Zd Z	 	 ddZd Zd Zd Zd Zd Zd Zd Zd Zd Zy)Keyboardz Central keyboard model NFzkey-pressedr   )r   r9                @      c                      | j                   |   S r?   )_modsrY   s     r1   _get_modzKeyboard._get_modI  s    zz#r0   c                 B    || j                   |<   | j                          y r?   )r,  on_mods_changed)rB   rL   values      r1   _set_modzKeyboard._set_modL  s    

3r0   c                      y r?   r/   rs   s    r1   r/  zKeyboard.on_mods_changedQ  r  r0   c                 L     t         fdd t        d      D        D              S )z' Bit-mask of curently active modifers. c              3   @   K   | ]  }j                   |   r|  y wr?   )mods).0maskrB   s     r1   	<genexpr>z(Keyboard.get_mod_mask.<locals>.<genexpr>V  s#      'Diio  's   c              3   &   K   | ]	  }d |z    ywr   Nr/   r6  bits     r1   r8  z(Keyboard.get_mod_mask.<locals>.<genexpr>V  s     $B#Q#X$B   r&  )sumr+   rs   s   `r1   get_mod_maskzKeyboard.get_mod_maskT  s&     '$Bq$B ' ' 	'r0   c              #   V   K   | j                  |       d | j                          yw)z0 Turn modifiers off temporarily. May be nested. N)_push_and_clear_modifiers_pop_and_restore_modifiers)rB   	modifierss     r1   r   zKeyboard.suppress_modifiersY  s'      	&&y1
'')s   ')c                 <   | j                   j                         D ci c]  \  }}||z  r|| }}}| j                  j                  |       |j                         D ]6  \  }}|s	d| j                   |<   | j	                         j                  |       8 y c c}}w Nr   )r,  rR   _suppress_modifiers_stackappendget_text_changerr   )rB   rC  r   rL   r5  nkeyss         r1   rA  z"Keyboard._push_and_clear_modifiers`  s    *.***:*:*< $hc3? c	 $ $&&--d3**, 	8JC"#

3%%'2237	8$s   Bc                     | j                   j                         }|j                         D ]6  \  }}|s	|| j                  |<   | j	                         j                  |       8 y r?   )rF  poprR   r,  rH  r   )rB   r5  r   rI  s       r1   rB  z#Keyboard._pop_and_restore_modifiersi  sV    --113**, 	6JC"'

3%%'005	6r0   c                 "    t         j                  S r?   rH   active_layer_indexrs   s    r1   _get_active_layer_indexz Keyboard._get_active_layer_indexq  s    (((r0   c                     |t         _        y r?   rM  rB   indexs     r1   _set_active_layer_indexz Keyboard._set_active_layer_indext  s
    $)!r0   c                 t    | j                         }|sy | j                  }|dk  s|t        |      k\  rd}||   S rE  )
get_layersrN  len)rB   layersrR  s      r1   _get_active_layerzKeyboard._get_active_layery  s@    "''19V,Ee}r0   c                 v    d}t        | j                               D ]  \  }}||u s|} || _        y  || _        y rE  )	enumeraterU  rN  )rB   layerrR  r   s       r1   _set_active_layerzKeyboard._set_active_layer  sG    !$//"34 	HAu~"'		 #(r0   c                 n    | j                   }|dk  s|t        | j                               k\  rd| _         yy)zq
        Reset layer index if it is out of range. e.g. due to
        loading a layout with fewer panes.
        r   N)rN  rV  rU  rQ  s     r1   assure_valid_active_layerz"Keyboard.assure_valid_active_layer  s6    
 ''19T__%6!77&'D# 8r0   c                 2   t        j                  |        t        j                  |      | _        d | _        d| _        d| _        d | _        i | _	        g | _
        d| _        d | _        d | _        i | _        d| _        g | _        t#        |       | _        t'               | _        t+               | _        t/        |       | _        | j0                  j3                  t4        j7                                t9        |       | _        | j:                  j3                  t4        j=                                d | _        d | _         d| _!        g | _"        g | _#        g | _$        d| _%        d | _&        i | _'        tQ               | _)        d| _*        d | _+        | jY                          y )Nr   F)-r   rD   weakrefref_application_pressed_key_last_typing_time_last_typed_was_separator_temporary_modifiers_locked_temporary_modifiersrF  _capitalization_requestedlayoutscannerbutton_controllersediting_snippet_layout_viewsr=   _unpress_timersr   _touch_feedbackr   _raise_timerr   
_auto_showenablerH   is_auto_show_enabledr   
_auto_hideis_auto_hide_enabledr   text_changer_direct_insert_invalidated_ui_pressed_keys_latched_sticky_keys_locked_sticky_keys_non_modifier_released_disabled_keys_pending_modifier_redrawsr   _pending_modifier_redraws_timer_visibility_locked_visibility_requestedreset)rB   applications     r1   rD   zKeyboard.__init__  sX     &#KK4 !").&$(!+-()+&).&"$$,T2,13"4.v::<="4.v::<='+$*.' $&!#% &+#")+&/4w,"'%)"

r0   c                    t        j                  |        | j                  r| j                  j                          | j                          | j	                          | j                          t        t        j                  j                        }| j                  |       | j                          g | _        g | _        g | _        d| _        d| _        d| _        | j$                  j'                          i | _        | j+                          y)z init/reset on layout change FN)r   r  rq  stop_raise_attemptsignore_capslockrelease_latched_sticky_keysboolrH   rC   sticky_key_release_delayrelease_locked_sticky_keysrelease_pressed_keysrx  ry  rz  r{  r|  ri  r~  rO   r}  unlock_visibility)rB   release_alls     r1   r  zKeyboard.reset  s    d#??OO!!#  " 	 	((*
 6??CCD''4!!#$&!#% &+#",,113)+& r0   c                    | j                          t        j                  |        | j                  r!| j                  j                          d| _        | j                  r!| j                  j                          d| _        | j
                  r!| j
                  j                          d| _        | j                  r!| j                  j                          d| _        | j                  r"| j                  j                          d| _        yy)z final cleanup on exit N)r  r   rt   rq  rt  r   rv  
_click_simrs   s    r1   rt   zKeyboard.cleanup  s    

%??OO##%"DO??OO##%"DO''((002+/D(**++335.2D+??OO##%"DO r0   c                 "    | j                         S r?   )rb  rs   s    r1   get_applicationzKeyboard.get_application
  s      ""r0   c                 :    | j                   j                  |       y r?   )rm  rG  rB   layout_views     r1   register_viewzKeyboard.register_view  s    !!+.r0   c                 X    || j                   v r| j                   j                  |       y y r?   )rm  remover  s     r1   deregister_viewzKeyboard.deregister_view  s)    $,,,%%k2 -r0   c                 *    | j                   }|r|d   S y rE  )rm  )rB   layout_viewss     r1   get_main_viewzKeyboard.get_main_view  s    ))?"r0   c                 R    | j                   D ]  }|j                         }||c S  y r?   )rm  
is_visible)rB   viewvisibles      r1   r  zKeyboard.is_visible  s.    && 	Doo'G"	r0   c                     | j                          | j                  |       |s| j                          | j                  D ]  }|j	                  |        y r?   )r  %update_auto_show_on_visibility_changehide_touch_feedbackrm  set_visible)rB   r  r  s      r1   r  zKeyboard.set_visible   sN     227;$$&&& 	&DW%	&r0   c                 D    | j                  | j                                 y)z+ main method to show/hide onboard manually N)r  r  rs   s    r1   toggle_visiblezKeyboard.toggle_visible*  s    T__../r0   c                 N    | j                   r|| _        y| j                  |       y)z@ Request to change visibility when all keys have been released. N)r  r  r  rB   r  s     r1   request_visibilityzKeyboard.request_visibility.  s!    "")0D&W%r0   c                     | j                   r| j                  | j                  }n| j                         }| j                  |        y r?   )r  r  r  r  r  s     r1   request_visibility_togglez"Keyboard.request_visibility_toggle5  s>    ""%%100Goo'GG,r0   c                 H    d| _         | j                  | j                         y)z: Lock all showing/hiding, but remember requests to do so. TN)r  auto_show_lockLOCK_REASON_KEY_PRESSEDrs   s    r1   lock_visibilityzKeyboard.lock_visibility=  s    "&D889r0   c                      d| _         d| _        y)z Unlock all showing/hiding. FN)r  r  rs   s    r1   r  zKeyboard.unlock_visibilityB  s    "'%)"r0   c                     | j                   r/| j                  }| j                          || j                  |       | j	                  | j
                         y)z@ Unlock all showing/hiding and apply the last request to do so. N)r  r  r  r  %auto_show_unlock_and_apply_visibilityr  r  s     r1   unlock_and_apply_visibilityz$Keyboard.unlock_and_apply_visibilityG  sO    ""00G""$"  ) 	22((	*r0   c                 J    | j                   D ]  }|j                  ||        y r?   )rm  redraw)rB   keys
invalidater  s       r1   r  zKeyboard.redrawV  s%    && 	*DKKj)	*r0   c                 F    | j                   D ]  }|j                           y r?   )rm  process_updatesrB   r  s     r1   r  zKeyboard.process_updatesZ  s#    && 	#D  "	#r0   c                 H    | j                   D ]  }|j                  |        y r?   )rm  redraw_labels)rB   r  r  s      r1   r  zKeyboard.redraw_labels^  s%    && 	+Dz*	+r0   c                 J    | j                   D ]  }|j                         s y yNTF)rm  has_input_sequencesr  s     r1   r  zKeyboard.has_input_sequencesb  s+    && 	D'')	 r0   c                 F    | j                   D ]  }|j                           y r?   )rm  update_transparencyr  s     r1   r  zKeyboard.update_transparencyh  s#    && 	'D$$&	'r0   c                     | j                   D ]  }|j                           | j                          | j                          y)z- Input event source changed, tell all views. N)rm  update_input_event_sourceupdate_click_simupdate_auto_hider  s     r1   r  z"Keyboard.update_input_event_sourcel  s;    && 	-D**,	-r0   c                 F    | j                   D ]  }|j                           y)z/ Touch input mode has changed, tell all views. N)rm  update_touch_input_moder  s     r1   r  z Keyboard.update_touch_input_modes  s#    && 	+D((*	+r0   c                    t         j                         r;t        |       }|j                         s*t        j                  d       t               }n
t               }| j                  r| j                  j                          || _        | j                  j                  | j                         t        j                  dj                  t        | j                        j                               y )NzSXInput click simulator CSFloatingSlave unavailable, falling back to CSButtonMapper.zusing click simulator '{}')rH   is_event_source_xinputr   is_validrv   warningr   r  rt   state_notify_add_on_click_sim_state_notifyr   rx   typer'   )rB   clicksims     r1   r  zKeyboard.update_click_simx  s    ((* 't,H $$& !B C *+
 &'H??OO##%"(()H)HI1fT$//2;;<	>r0   c                 D    | j                          | j                          y r?   invalidate_context_uicommit_ui_updates)rB   xs     r1   r  z#Keyboard._on_click_sim_state_notify      ""$ r0   c                 J    | j                   D ]  }|j                  ||        y r?   )rm  show_touch_handles)rB   show	auto_hider  s       r1   r  zKeyboard.show_touch_handles  s'    && 	5D##D)4	5r0   c                     | j                          | j                  |       || _        || _        | j	                          y)z, set or replace the current keyboard layout N)r  set_virtkeyri  color_schemeon_layout_loaded)rB   ri  r  rq   s       r1   
set_layoutzKeyboard.set_layout  s4    

(r0   c                 d   | j                   j                          | j                          | j                          t	        j
                  |        | j                          | j                          | j                  D ]  }|j                           | j                          | j                          y)z( called when the layout has been loaded N)ro  hide_connect_button_controllersr^  r   r  update_modifiersupdate_scanner_enabledrm  invalidate_uir  r  s     r1   r  zKeyboard.on_layout_loaded  s     	!!#((*&&(((.##% && 	$D!!#	$ 	 r0   c                 &    | j                  |       y r?   )_init_text_changersrB   rq   s     r1   r  zKeyboard.set_virtkey  s      $r0   c                 ^    t        | |      | _        t        | || j                        | _        y r?   )r   r   r   rv  r  s     r1   r  zKeyboard._init_text_changers  s0     r* 	$ $D"d.J.JK 	'r0   c                 j    | j                   }|j                         r| j                  S | j                  S r?   )r  can_insert_textrv  r   r"  s     r1   rH  zKeyboard.get_text_changer  s1    (('')222///r0   c                 @   i | _         t        t        t        t        t
        t        t        t        t        t        t        t        t        t        t        t         t"        t$        t&        t(        fD ci c]  }|j*                  | }}| j,                  j/                         D ]w  }|j1                         r1t3        | |      }|j5                         |_        || j                   |<   D|j9                  |j*                        }|sb || |      | j                   |<   y yc c}w )z+ connect button controllers to button keys N)rk  BCMiddleClickBCSingleClickBCSecondaryClickBCDoubleClickBCDragClickBCHoverClickBCHideBCShowClickBCMoveBCPreferencesBCQuitBCExpandCorrectionsBCPreviousPredictionsBCNextPredictionsBCPauseLearning
BCLanguageBCStealthModeBCAutoLearnBCAutoPunctuationBCInputlineidri  iter_global_keysis_layer_buttonBCLayerget_layer_indexlayer_indexrF   )rB   r  typesrL   bcs        r1   r  z$Keyboard._connect_button_controllers  s    "$  0@l+v}f%'<#_j.?D4   ;;//1 	CC""$T3'!$!4!4!6/1'',yy(37c?D++C0	Cs   0Dc                 v    | j                          | j                  t        j                  j                         y)z9 Enable keyboard scanning if it is enabled in gsettings. N)r  enable_scannerrH   rj  enabledrs   s    r1   r  zKeyboard.update_scanner_enabled  s&    &&(FNN223r0   c                 l   |r| j                   s%t        | j                  | j                        | _         | j                  r1| j                   j                  | j                  | j                         yt        j                  d       y| j                   r"| j                   j                          d| _         yy)z Enable keyboard scanning. $Failed to update scanner. No layout.N)
rj  r   _on_scanner_redraw_on_scanner_activateri  update_layeractive_layerrv   r  finalizerB   rr  s     r1   r  zKeyboard.enable_scanner  s    <<&t'>'>'+'@'@ B{{))$++t7H7HI FG||%%'# r0   c                 D    | j                          | j                          y)z. Config callback for scanner.enabled changes. N)r  r  )rB   r  s     r1   _on_scanner_enabledzKeyboard._on_scanner_enabled  s    ##%  "r0   c                 &    | j                  |       y)z Scanner callback for redraws. N)r  rB   r  s     r1   r  zKeyboard._on_scanner_redraw  s    Dr0   c                 H    | j                  |       | j                  |       y)z& Scanner callback for key activation. N)key_downkey_uprY   s     r1   r  zKeyboard._on_scanner_activate  s    cCr0   c                 R    | j                   r| j                   j                         S g S r?   )ri  get_layer_idsrs   s    r1   rU  zKeyboard.get_layers  s!    ;;;;,,..	r0   c                 T    | j                   r| j                   j                  |      S g S )z1 iterate through all keys or all keys of a group )ri  	iter_keys)rB   
group_names     r1   r  zKeyboard.iter_keys  s#    ;;;;((44Ir0   c                 D    | j                          | j                          y r?   r  rs   s    r1   _on_mods_changedzKeyboard._on_mods_changed  r  r0   c                     | j                   S r?   )rc  rs   s    r1   get_pressed_keyzKeyboard.get_pressed_key  s       r0   c                 6    t        j                          | _        y)z* Remember it was us that just typed text. N)rd   rd  rs   s    r1   set_currently_typingzKeyboard.set_currently_typing  s    !%r0   c                     | j                         }|xr | j                  |      xs$ t        j                         | j                  z
  dk  S )z@ Is Onboard currently or was it just recently sending any text?       ?)r   _is_text_insertion_keyrd   rd  rY   s     r1   	is_typingzKeyboard.is_typing  sF    ""$7t2237 8IIK$000C7	8r0   c                     || _         y r?   re  )rB   r0  s     r1   set_last_typed_was_separatorz%Keyboard.set_last_typed_was_separator  s
    ).&r0   c                     | j                   S r?   r(  rs   s    r1   get_last_typed_was_separatorz%Keyboard.get_last_typed_was_separator"  s    ---r0   c                 *    |xr |j                         S )zA Does key actually insert any characters (not a navigation key)? )is_text_changingrY   s     r1   r%  zKeyboard._is_text_insertion_key%  s    -s++--r0   c                 L   | j                          | j                          |r|j                  }|j                  }nd}t        j
                  }t        j                         rt        j                          |r,|j                  r| j                          | j                  j                  |       d}t        j                  j                  |      rt         j"                  }| j%                  |       | j'                  ||       d|_        | j+                  ||||       | j-                  |g       | j/                          |r5| j1                  ||||       | j3                  |      r| j5                          || j6                  vr| j6                  j9                  |       yyyy)z
        Press down on one of Onboard's key representations.
        This may be either an initial press, or a switch of the active_key
        due to dragging.
        r   r   TN)on_any_key_downr  button
event_typer%   r,   gc	isenableddisable	sensitiver  rn  rO   rH   rC   can_upper_case_on_buttonr   SHIFT_set_temporary_modifiers_update_temporary_key_labelrS   on_key_pressedr  r  _do_key_down_actionr%  r"  rx  rG  )rB   rL   r  sequenceactionr0  r1  temp_mod_masks           r1   r  zKeyboard.key_down)  se    	  "__F!,,JF"J <<>JJL==   "   %%c* M77? )))-8,,S-@ CKT8V< KK  " ((dFJG ..s3--/ $,,,""))#. -I  r0   c                     |r|j                   }|j                  }nd}t        j                  }|ru|j                  rh|j                         }|rb|j                  s| j                  ||||       | j                  ||||       |j                  t        j                  k(  rK| j                          n:|j                  r.|j                  t        j                  k(  r| j                  |       |xr |j                         xr |}|r6t        j                   j"                  s| j$                  j'                  |       nd|_        | j+                  |       d|_        || j,                  v r| j,                  j/                  |       | j1                  |      r| j3                          	 | j=                         sId| _        g | _        d| _         | jC                          tE        jF                          | jI                          | jK                          y)z/ Release one of Onboard's key representations. r   FN)&r0  r1  r%   r,   r5  is_pressed_only	activatedr;  _do_key_up_actionr  r   BUTTON_TYPEr  
MACRO_TYPEmaybe_switch_to_first_layerrH   rj  r  rn  rG   rS   r[   rx  r  r%  r"  is_force_to_tophas_focusable_guixid_moderaise_ui_delayedr  r{  rc  on_all_keys_upr2  rr  r  r  )rB   rL   r  r<  r=  r0  r1  extend_pressed_states           r1   r  zKeyboard.key_upf  s   __F!,,JF"J== $'#6#6#8  }},,S$
K&&sD&*E 88y444..0 88y33344S9 %9 %+$'$7$7$9%+$* !
 $>>))$$**3/ $%%c* "CM d(((""))#. **3/))+  '')*/D'!#D $D!IIK ,,. 	 r0   r   c                    d}|j                   }t        j                  sS|j                         }|r|j	                  ||       d}n+|t
        j                  k(  r0| j                  j                  |      }|r|j                  ||       n|j                         r|j                  ||       d}n|t
        j                  k(  r*t        |j                        }| j                  ||       d}n| j!                  |      }	|	t
        j"                  k(  rb|j%                         sR|j'                         }
| j)                  |
      }|r-| j*                  j-                  |       |j/                  ||       d}|rd|_        |S )z5 Long press of one of Onboard's key representations. FT)r  rH   rH  get_popup_layoutshow_popup_layoutr   rC  rk  rF   
long_pressis_prediction_keyshow_prediction_menurD  intcode_edit_snippetget_key_actionDELAYED_STROKE_ACTIONis_word_suggestion	get_labelfind_canonical_equivalentsro  r  show_popup_alternative_charsrA  )rB   rL   r  r0  long_pressedkey_type	sublayout
controller
snippet_idr=  labelalternativess               r1   key_long_presszKeyboard.key_long_press  sH   88,,.I&&sI6#Y222!4488=
))$7&&())#v6#Y111 ]
""44# ,,S1Y<<<--/MMOE#'#B#B5#IL#,,11#699#|L#'L CMr0   c                    | j                  |      }|j                   xs |j                   xr |t        j                  k(   }|r| j                  ||||       |r!|j                         r| j                  d       |j                  t        j                  k(  r4| j                  j                  |      }|r|j                         |_        y y y rQ   )rU  stickyactiver   rV  send_key_downis_modifierr  r  rC  rk  rF   is_activated_on_pressrA  )rB   rL   r  r0  r1  r=  can_send_keyr^  s           r1   r;  zKeyboard._do_key_down_action  s     $$S) ZZ9szz> F"i&E&EEE 	sD&*= COO-u%88y,,,0044S9J * @ @ B  -r0   c                 L   |j                   rl|j                         r| j                         sd}n| j                  |||      }|rH| j	                  ||       |j                         r&| j                  d       n| j                  ||||       |j                         sd| _        y y r  )rd  rg  _can_cycle_modifiersstep_sticky_keysend_key_upr  _release_non_sticky_keyr{  )rB   rL   r  r0  r1  ri  s         r1   rB  zKeyboard._do_key_up_action   s    :: ,,.##33CL  d+??$&&u-((dFJG  *.D' !r0   c                 |   | j                  |      r/t        j                  dj                  |j                               y |j
                  }|t        j                  k(  r| j                         r|| _	        n| j                  |      }|t        j                  k7  rOt        j                  | |       | j                  ||||       | j!                  |       | j#                  ||||       |t        j$                  k(  r| j'                  ||||       |r)| j)                  |       | j+                          d|_        y y )Nz8send_key_down: rejecting blacklisted key action for '{}'T)is_key_disabledrv   rw   rx   r  modifierr   ALT_is_alt_special_last_alt_keyrU  r   rV  r   on_before_key_press_maybe_send_alt_press_for_key'_maybe_lock_temporary_modifiers_for_keysend_key_pressDOUBLE_STROKE_ACTIONsend_key_release_do_lock_modifiersr  rA  )rB   rL   r  r0  r1  rq  r=  s          r1   rf  zKeyboard.send_key_down  s   $MM F!6#&&>+ <<y}}$!!$D((-F88833D#>22339:G<<SA##CvzB777%%c4D##H- &&( CM r0   c                    | j                  |      r/t        j                  dj                  |j                               y |j
                  }|j                  }| j                  |      }|r4|t        j                  k7  r!| j                  |       | j                          |t        j                  k(  r| j                         rn|t        j                  k(  s|t        j                  k(  rt!        j"                  | |       | j%                  ||||       | j'                  |       |t        j(                  k(  r*| j+                         j-                  |j.                         n=| j1                  ||||       | j3                  ||||       n| j3                  ||||       |r4|t        j                  k(  r!| j                  |       | j                          | j5                          | j7                  ||||       | j8                  j;                         D ][  \  }}	|	dk  st        j=                  dj                  | j>                  |   |             d| j>                  |<   d| j@                  |<   ] y )Nz6send_key_up: rejecting blacklisted key action for '{}'r   z)Negative count {} for modifier {}, reset.)!rp  rv   rw   rx   r  r  rq  rU  r   ry  _do_unlock_modifiersr  r   rr  rs  rV  r   ru  rv  rw  	CHAR_TYPErH  r   rS  rx  rz  !_maybe_unlock_temporary_modifiers_maybe_send_alt_release_for_keyr,  rR   r  r5  _external_mod_changes)
rB   rL   r  r0  r1  r\  rq  r=  r   rI  s
             r1   rm  zKeyboard.send_key_up8  s   $MM F!6#&&>+ 88<<$$S)
 Y333%%h/ &&( y}}$!77788833D#>22339:G<<SAy222))+BB388L''T6:F))#tVZH%%c4D Y333%%h/ &&(..0,,S$
K ****, 	4JCqy K!'		((;X!FH!"		# 34**3/	4r0   c                 p    | j                         }||z  }|j                  |k7  r|j                  |       yy)z& update label for temporary modifiers N)r?  r   configure_label)rB   rL   r>  r   s       r1   r9  z$Keyboard._update_temporary_key_label  s9    $$&!<<=(. )r0   c                     |rO|t         j                  t         j                  t         j                  t         j                  t         j
                  fv r|| _        yy)z> Announce the intention to lock these modifiers on key-press. N)r   r7  CAPSCTRLSUPERALTGRrf  r   s     r1   r8  z!Keyboard._set_temporary_modifiers  s@     	!: :(0D%:r0   c                     | j                   }|rB|j                  |k(  s2|j                         s!| j                  t        j
                  |       yyyy)z) Lock modifier before a single key-press N)rf  rq  	is_buttonr   r8   r:   )rB   rL   rq  s      r1   rw  z0Keyboard._maybe_lock_temporary_modifiers_for_key  sJ    ,,||x'}})))*<*<hG  ( r0   c                 $    | j                          y)z* Unlock modifier after a single key-press N)unlock_all_temporary_modifiersrs   s    r1   r  z*Keyboard._maybe_unlock_temporary_modifiers  s    ++-r0   c                     | j                   j                  |g       }|j                  |       t        j	                  dj                  ||| j                                | j                  |       y)z Lock temporary modifiers z#lock_temporary_modifiers({}, {}) {}N)rg  
setdefaultrG  rv   rw   rx   r{  )rB   mod_source_idr   stacks       r1   r   z!Keyboard.lock_temporary_modifiers  s^    00;;M2NX;vmX">>@	A 	)r0   c                     | j                   j                  |      }|rR|j                         }t        j	                  dj                  ||| j                                | j                  |       yy)z Unlock temporary modifiers z%unlock_temporary_modifiers({}, {}) {}N)rg  rF   rK  rv   rw   rx   r}  )rB   r  r  r   s       r1   r   z#Keyboard.unlock_temporary_modifiers  sc    0044]Cyy{HMMA!6-"&"B"BDE %%h/ r0   c                 j   | j                   ri }| j                   j                         D ]A  \  }}|D ]7  }d t        d      D        D ]   }||z  s	|j                  |d      dz   ||<   " 9 C i | _         t        j                  dj                  | j                                | j                  |       yy)z  Unlock all temporary modifiers c              3   &   K   | ]	  }d |z    ywr:  r/   r;  s     r1   r8  z:Keyboard.unlock_all_temporary_modifiers.<locals>.<genexpr>  s     #AAH#Ar=  r&  r   r   z#unlock_all_temporary_modifiers() {}N)rg  rR   r+   r  rv   rw   rx   _do_unlock_modifier_counts)rB   
mod_countsr  r  r   mod_bits         r1   r  z'Keyboard.unlock_all_temporary_modifiers  s    ++J44::<F$u % FH#Aa#A F#g- * 5 5gq AA E 'w/FFF 02D,MM?!6$"B"BCE ++J7 ,r0   c                    d}d t        d      D        D ]V  }||z  s	| j                  |   s(|t        j                  k7  s| j	                         s||z  }| j                  |xx   dz  cc<   X |rPt
        j                  dj                  || j                  |             | j                         j                  |       yy)z' Lock modifiers and track their state. r   c              3   &   K   | ]	  }d |z    ywr:  r/   r;  s     r1   r8  z.Keyboard._do_lock_modifiers.<locals>.<genexpr>       5SS5r=  r&  r   z_do_lock_modifiers({}) {} {}N)r+   r5  r   rr  rs  rv   rw   rx   r,  rH  r   )rB   r   mods_to_lockr  s       r1   r{  zKeyboard._do_lock_modifiers  s    5E!H5 		(G'!yy) )--///1$/		'"a'"		( MM8!6(DJJEG!!#,,\: r0   c                 t    i }d t        d      D        D ]  }||z  s	d||<    |r| j                  |       yy)3 Unlock modifier in response to modifier releases. c              3   &   K   | ]	  }d |z    ywr:  r/   r;  s     r1   r8  z0Keyboard._do_unlock_modifiers.<locals>.<genexpr>  r  r=  r&  r   N)r+   r  )rB   r   r  r  s       r1   r}  zKeyboard._do_unlock_modifiers  sI    
5E!H5 	(G'!&'
7#	( ++J7 r0   c                 |   d}|j                         D ]U  \  }}| j                  |xx   |z  cc<   | j                  |   r-|t        j                  k7  s| j	                         rQ||z  }W |rPt
        j                  dj                  || j                  |             | j                         j                  |       yy)r  r   z$_do_unlock_modifier_counts({}) {} {}N)rR   r5  r   rr  rs  rv   rw   rx   r,  rH  r   )rB   r  mods_to_unlockr  r   s        r1   r  z#Keyboard._do_unlock_modifier_counts  s    (..0 		.NGUIIg%'99W% imm+++-"g-N		. MM@!6*djj.IK!!#..~> r0   c                 ,    t         j                          S )zC
        Does the ALT key need special treatment due to it
        )rH   is_override_redirectrs   s    r1   rs  zKeyboard._is_alt_special  s     ..000r0   c                     | j                   d   rb| j                         rQ|j                  sD|j                  t        j
                  k(  s&| j                  |      s| j                  |||       yyyyyy)z handle delayed Alt press r&  N)r5  rs  re  r  r   rC  rp  maybe_send_alt_pressrB   rL   r  r0  r1  s        r1   rv  z&Keyboard._maybe_send_alt_press_for_key  sk    99Q<!zzxx9000##C(%%dFJ? ) 1  " r0   c                 D    | j                   r| j                  |||       yy)z handle delayed Alt release N)_alt_lockedmaybe_send_alt_releaser  s        r1   r  z(Keyboard._maybe_send_alt_release_for_key  s"    ''fjA r0   c                     | j                   d   r^| j                  sQd| _        | j                  r| j                  | j                  |||       | j	                         j                  d       y y y )Nr&  T)r5  r  rt  rx  rH  r   rB   r  r0  r1  s       r1   r  zKeyboard.maybe_send_alt_press  se    99Q<#D!!##D$6$6$*J8!!#,,Q/   r0   c                     | j                   rQd| _         | j                  r| j                  | j                  |||       | j                         j	                  d       y y )NFr&  )r  rt  rz  rH  r   r  s       r1   r  zKeyboard.maybe_send_alt_release  sV    $D!!%%d&8&8&*FJ@!!#..q1 r0   c                    d}|j                   }|t        j                  k(  rNt        j	                         5  | j                         j                  |j                         ddd       ||_        y|t        j                  k(  rNt        j	                         5  | j                         j                  |j                         ddd       ||_        y|t        j                  k(  rgt        |j                        dk(  rt        j	                         5  | j                         j                  |j                         ddd       ||_        y|t        j                  k(  rWt        j	                         5  | j                         j                  t        |j                               ddd       ||_        y|t        j                  k(  rJd}| j                   j#                  |      }|r|j%                         }|j'                  |||       ||_        y|t        j(                  k(  r
d}||_        y|t        j*                  k(  r
d}||_        y|t        j,                  k(  r
d}||_        y|t        j.                  k(  rd}||_        y# 1 sw Y   ||_        yxY w# 1 sw Y   ||_        yxY w# 1 sw Y   ||_        yxY w# 1 sw Y   ||_        yxY w)z$ Actually generate a fake key press TNr   F)r  r   KEYCODE_TYPEr]   r`   rH  r   rS  KEYSYM_TYPEr{   r~  rV  r   KEYPRESS_NAME_TYPEr!   rC  rk  rF   rh  pressrD  SCRIPT_TYPE	WORD_TYPECORRECTION_TYPErA  )rB   rL   r  r0  r1  rA  r\  r^  s           r1   rx  zKeyboard.send_key_press  sd   	88y---""$ @%%'55chh?@H "C ...""$ ?%%'44SXX>?@ "; ,,,388}!&&( D))+99#((CD6 "1 555""$ 4%%'44(244. "' ...I0044S9J&<<>	  vz: " ---I " ...I " ,,,I
 " 222I!I@H "A?@ "7D6 "/4. "s/   *J*J*J,23J?JJ),J<?Kc                 L   |j                   }|t        j                  k(  rlt        |j                        dk(  r*| j                         j                  |j                         y| j                         j                  |j                         y|t        j                  k(  r*| j                         j                  |j                         y|t        j                  k(  r3| j                         j                  t        |j                               y|t        j                  k(  r*| j                         j                  |j                         y|t        j                  k(  r2| j                  j!                  |      }|r|j#                  |||       yy|t        j$                  k(  r:t'        |j                        }| j)                  |      ry| j+                  ||       y|t        j,                  k(  r4t.        j0                  s#|j                  rt3        |j                         yyyy)z& Actually generate a fake key release r   N)r  r   r~  rV  rS  rH  r   r   r  r   r  r!   r  r   rC  rk  rF   releaserD  rR  insert_snippetrT  r  rH   rH  r    )rB   rL   r  r0  r1  r\  r^  r_  s           r1   rz  zKeyboard.send_key_releaseC  s    88y***388}!%%'77A%%'>>sxxH...!!#22388<555!!#22$SXX.0 ///!!#33CHH=...0044S9J""4<  ---SXXJ"":.
 ""44...??88sxx(  # /r0   c                 v    t         j                  s)| j                  s|r|j                  |       d| _        y y y y r  )rH   rH  rl  show_snippets_dialog)rB   r  r_  s      r1   rT  zKeyboard._edit_snippetk  s:    ##%%j1#'D   $ r0   c                     t         j                  j                  |d      \  }}|r | j                         j	                  |       yy)N)NNTF)rH   snippetsrF   rH  r   )rB   r_  mlabelmStrings       r1   r  zKeyboard.insert_snippetr  s<     //--j,G!!#::7Cr0   c                    t        j                  | |       | j                  ||||       |j                         s|j                  t
        j                  k(  r|j                         s|| j                         vrmd }| j                  r6| j                  D cg c]!  }|j                  t        j                  k(  r|# }}| j                  d|       t        j                  |        | j!                  |j#                                t        j                  | |||       | j%                  |       t        j&                  | |       | j                  r6d| _	        | j(                  t        j                     s| j+                          y y y c c}w )NT)only_unpressedexcept_keysF)r   on_before_key_releaserm  r   r  r   rC  is_click_type_keyget_text_displaysrh  ry  rq  r   r7  r  show_input_line_on_key_releaser)  is_separatorrE  on_after_key_releaser5  _enter_caps_mode)rB   rL   r  r0  r1  r  s         r1   rn  z Keyboard._release_non_sticky_keyy  sg    	--dC8 	dFJ7
 ""$I111%%'d,,.. K--.2.G.G Cs"%,,)//"A  # C C ,,D9D - F ::4E))#*:*:*<= 	##D#vzB 	((- 	,,T37 ))-2D*99Y__-%%' . *3Cs   &Fc                     || _         y)zJ
        Request entering upper-caps mode after next key-release.
        N)rh  )rB   
capitalizes     r1   request_capitalizationzKeyboard.request_capitalization  s     *4&r0   c                    | j                  dg      }| j                  dg      }||z   D ]  }|j                  r`d|_        d|_        || j                  v r| j                  j	                  |       || j
                  v r| j
                  j	                  |       | j                  |g        |r|n|}|D ]Q  }|j                  rd|_        || j                  vr| j                  j                  |       | j                  |g       S d| j                  t        j                  <   | j                         j                  d       | j                  d       y)z
        Do what has to be done so that the next pressed
        character will be capitalized.

        Don't call key_down+up for this, because modifiers may be
        configured not to latch.
        LFSHRTSHFTr   N)find_items_from_idsre  lockedry  r  rz  r  rG  r5  r   r7  rH  r   r  )rB   	lfsh_keys	rtsh_keysrL   
shift_keyss        r1   r  zKeyboard._enter_caps_mode  s6    ,,fX6	,,fX6	 y( 	Czz"
"
$333--44S9$222,,33C8KK	 #,Y
 	#C::!
d777--44S9SE"	# &'		)//"((+5!r0   c                    | j                   dk7  r{| j                  sn|j                         }|!|j                          xr |j                  dv}|r7d| _         | j                          | j                          | j                          |S yy)z<
        Activate the first layer if key allows it.
        r   N)move	showclick)rN  _layer_lockedcan_unlatch_layerr   r  invalidate_visible_layersinvalidate_canvasr  )rB   rL   unlatchs      r1   rE  z$Keyboard.maybe_switch_to_first_layer  s     ""a'!!++-G"2244 ?66)>>  *+'..0&&(**,N " (r0   c                     t         j                  j                         }|r"|j                         }| j	                  |       yy)z
        Synchronize our keys with externally activated modifiers,
        e.g. by physical keyboards or tools like xte.
        N)r   Keymapget_defaultget_modifier_stateset_modifiers)rB   keymapr   s      r1   r  zKeyboard.update_modifiers  s:    
 '')002Hx( r0   c           	         t         j                  dj                  || j                  | j                  | j                                      | j                  ry| j                  ry| j                         ryd t        d      D        D ]h  }|t        j                  t        j                  z  z  rd}nt        j                  j                  }|dk\  sJ| j                  |t        ||z        |       j y)z
        Sync Onboard with modifiers of the given modifier mask.
        Used to sync changes of system modifier state with Onboard.
        zset_modifiers({}) {} {} {}Nc              3   &   K   | ]	  }d |z    ywr:  r/   r;  s     r1   r8  z)Keyboard.set_modifiers.<locals>.<genexpr>  r  r=  r&  r   )rv   rw   rx   r  rf  r&  r+   r   r  NUMLKrH   rC   modifier_update_delayset_modifierr  )rB   r   r  rg   s       r1   r  zKeyboard.set_modifiers  s    
 	2vh(8(8"77"nn.0	1 $$ >>5E!H5 	LG
 9>>IOO;<== z!!'470B+CUK	Lr0   c                    g }| j                   j                         D ]#  }|j                  |k(  s|j                  |       % t	        | j
                  |         }|s^|r\| j
                  |xx   dz  cc<   d| j                  |<   |D ]0  }|j                  s| j                  |dt        j                         2 n|r|sd| j
                  |<   d| j                  |<   |D ]b  }|| j                  v r| j                  j                  |       || j                  v r| j                  j                  |       d|_        d|_        d ||k7  r.|r|dkD  r| j!                  ||||       y| j#                  |       yy)zV
        Update Onboard to reflect the state of the given modifier in the ui.
        r   r   Frb   N)ri  r  rq  rG  r  r,  r  rd  rl  r%   r,   ry  r  rz  re  r  _queue_pending_modifier_redraw_redraw_modifier_keys)rB   r  re  
draw_delayr  rL   active_befores          r1   r  zKeyboard.set_modifier  su   
 ;;((* 	!C||w&C 	! TZZ01 JJw1$23D&&w/ B::((aAB
 6"#DJJw23D&&w/ #$333--44S9$222,,33C8"
"
# ]" C33GV48*F **40 #r0   c                 *   | j                   j                  |      }|||f| j                   |<   n|\  }}||k7  r| j                   |= | j                   r'| j                  j                  || j                         y | j                  j                          y r?   )r}  rF   r~  rG   _redraw_pending_modifier_keysrO   )rB   r  re  r  rg   itempending_actives          r1   r  z'Keyboard._queue_pending_modifier_redrawK  s    --11':<7=tnD**73#' ND '227; ))0066t99; 00557r0   c                 x    | j                   j                         D ]  \  }}| j                  |        i | _         y r?   )r}  valuesr  )rB   r  r  s      r1   r  z&Keyboard._redraw_pending_modifier_keys_  s;    $($B$B$I$I$K 	- ND&&t,	-)+&r0   c                 H    | j                  |       | j                  d       y rQ   )r  r  r  s     r1   r  zKeyboard._redraw_modifier_keysd  s    D5!r0   c                    | j                  ||j                  |j                  ||      \  }}|j                  }d}||_        ||_        |r|rT|| j                  v r| j                  j	                  |       || j
                  vro| j
                  j                  |       |S || j                  vr| j                  j                  |       || j
                  v r| j
                  j	                  |       |S || j                  v r| j                  j	                  |       || j
                  v r| j
                  j	                  |       |xs | j                  |       }|S )z
        One cycle step when pressing a sticky (latchabe/lockable)
        modifier key (all sticky keys except layer buttons).
        F)step_sticky_key_statere  r  ry  r  rz  rG  can_activate_key)rB   rL   r0  r1  re  r  
was_activedeactivateds           r1   rl  zKeyboard.step_sticky_keyj  sW   
 33C47JJ

4:JH jj


$333--44S9d666,,33C8  d777--44S9$222,,33C8  d///))005d...((//4% :#44S99  r0   c                 |    | j                  |      }t        j                  |      xs t        j                  |      S )z Can key be latched or locked? )_get_sticky_key_behaviorr   	can_latchcan_lockrB   rL   behaviors      r1   r  zKeyboard.can_activate_key  s8    005((2 2''1	3r0   c                    | j                  |      }|t        j                  k(  }|rt        j                  |      rd}d}||fS |s8t        j
                  |      rd}||fS t        j                  |      rd}d}||fS |j                  st        j                  |      rd}||fS t        j                  |      rd}d}||fS )z? One cycle step when pressing a sticky (latchabe/lockable) key TF)	r  r%   r-   r   can_lock_on_double_clickr  can_lock_on_single_clickr  	can_cycle)rB   rL   re  r  r0  r1  r  double_clicks           r1   r  zKeyboard.step_sticky_key_state  s    005!Y%;%;; 228< FF0 v~' !++H5!F  v~ $<<XF!F!F v~ jj 99(C v~	  ))(3v~r0   c                 h   | j                  |j                        }||j                  |j                  }|B|j                         r| j                  d      }|j	                         r| j                  d      }|| j                  d      }t        j                  |      st
        j                  }|S )z* Return sticky behavior for the given key rC  rW  all)_get_sticky_behavior_forr  sticky_behaviorrg  r   r   r  CYCLEr  s      r1   r  z!Keyboard._get_sticky_key_behavior  s     008 +**H  88E""$88B 44U;H &&x0%++Hr0   c                     d }t         j                  j                  j                  |      }|r	 t	        j
                  |      }|S |S # t        $ r) t        j                  dj                  ||             Y |S w xY w)Nz+Invalid sticky behavior '{}' for group '{}')
rH   rC   sticky_key_behaviorrF   r   from_stringKeyErrorrv   r  rx   )rB   r   r  r0  s       r1   r  z!Keyboard._get_sticky_behavior_for  su    3377>7)55e< x  7 M!'u!577s   A .A:9A:c                     d| _         y rQ   )rl  rs   s    r1   on_snippets_dialog_closedz"Keyboard.on_snippets_dialog_closed  s
    $r0   c                    | j                   L| j                         | _         t        j                  dj	                  t        | j                                      |j                  | j                         f}|| j                   v S )z( Check for blacklisted key combinations zdisabled keys: {})r|  create_disabled_keys_setrv   rw   rx   ry   r  r?  )rB   rL   set_keys      r1   rp  zKeyboard.is_key_disabled  sm    &"&"?"?"ADMM-!6$t':':";<> 664,,./$----r0   c                 L   t               }| j                  j                         D cg c]  }|j                   }}t        j
                  j                  D ]F  }t        ||      }||j                  |       #t        j                  dj                  |             H |S c c}w )zr
        Precompute a set of (modmask, key_id) tuples for fast
        testing against the key blacklist.
        zCignoring unrecognized key combination '{}' in lockdown.disable-keys)setri  r  r  rH   lockdowndisable_keysr   updaterv   r  rx   )rB   disabled_keysrL   available_key_idscomboresultss         r1   r  z!Keyboard.create_disabled_keys_set  s    
 /3{{/D/D/FGSVVGG__11 	0E+E3DEG"$$W- !;!'0	0  Hs   B!c                    |j                   }|)|j                  t        j                  k(  rNt        j                  }| j
                  j                  |      }|r|j                         rt        j                  }n|j                  t        j                  k7  r|j                  t        j                  k7  r|j                         }| j                  |      }t        |      dk(  r|j                         s|j                  dk(  st!        |      rt"        j$                  j&                  }nt        j                  }|t        j                  k7  r |j)                         rt        j                  }|S )Nr   SPCE)r=  r  r   rC  rV  rk  rF   rh  SINGLE_STROKE_ACTIONr  r  rX  rY  rV  isalnumr  r  rH   rC   default_key_actionrM  )rB   rL   r=  r^  r`  ra  s         r1   rU  zKeyboard.get_key_action  s	   >xx9000"88!4488=
335&;;F((i111((i777#>>uEJ!O66V#%#__??F&;;F Y444!44Fr0   c                 2    t        | j                        dkD  S )z any sticky keys latched? r   )rV  ry  )rB   r  s     r1   has_latched_sticky_keysz Keyboard.has_latched_sticky_keys  s    4,,-11r0   c                    t        | j                        dkD  r| j                  dd D ]  }|r||vs
|r|j                  r|r*|j                         r| j                  |j
                     rE|j
                  t        j                  k(  r| j                  ro| j                  |       | j                  j                  |       d|_        | j                  |g        | j                  d       yy)z( release latched sticky (modifier) keys r   NF)rV  ry  rS   rg  r  rq  r   r7  rh  rm  r  re  r  r  )rB   r  r  skip_externally_set_modifiersrL   s        r1   r  z$Keyboard.release_latched_sticky_keys  s     t(()A-003 3"c&< *  ="0#99#,,G $'<<9??#B#'#A#A $ 0 0 5 $ 9 9 @ @ E-2
 $SE 2=3B u%E .r0   c                 f   t        | j                        dkD  r| j                  dd D ]u  }|s|j                  t        j                  k(  r#| j                  |       | j                  j                  |       d|_        d|_        d|_	        | j                  |g       w | j                  d       yy)z' release locked sticky (modifier) keys r   NF)rV  rz  rq  r   r  rm  r  re  r  rS   r  r  )rB   r  rL   s      r1   r  z#Keyboard.release_locked_sticky_keysE  s    t''(1,//2 
' ||y6$$S),,33C8!&CJ!&CJ"'CKKK&
' u% -r0   c                 d    | j                   D ]  }|j                         r y | j                  ryy)z{
        Modifier cycling enabled?
        Not enabled for multi-touch with at least one pressed non-modifier key.
        FT)rx  rg  r{  rY   s     r1   rk  zKeyboard._can_cycle_modifiersW  s7     %% 	C??$	
 &&r0   c                 2    t         d   j                  |      S )Nr  )r   rF   r   s     r1   rY  z#Keyboard.find_canonical_equivalentsg  s    $U+//55r0   c                 J    | xj                   t        j                  z  c_         y)z[
        Update everything.
        Quite expensive, don't call this while typing.
        N)rw  r   ALLrs   s    r1   r  zKeyboard.invalidate_uij  s    
 	

*r0   c                 n    | xj                   t        j                  t        j                   z  z  c_         y)zp
        Update everything assuming key sizes don't change.
        Doesn't invalidate cached surfaces.
        N)rw  r   r$  SIZErs   s    r1   invalidate_ui_no_resizez Keyboard.invalidate_ui_no_resizeq  s$    
 	

fkk\ 99r0   c                     | xj                   t        j                  t        j                  z  t        j                  z  z  c_         y)z" Update text-context dependent ui N)rw  r   CONTROLLERSSUGGESTIONSLAYOUTrs   s    r1   r  zKeyboard.invalidate_context_uix  s5    !3!3!'!3!3"4!'"/ 	0r0   c                 J    | xj                   t        j                  z  c_         y)z.
        Recalculate item rectangles.
        N)rw  r   r+  rs   s    r1   invalidate_layoutzKeyboard.invalidate_layout~  s     	-r0   c                 J    | xj                   t        j                  z  c_         y)zm
        Update visibility of layers in the layout tree,
        e.g. when the active layer changed.
        N)rw  r   LAYERSrs   s    r1   r  z"Keyboard.invalidate_visible_layers  s    
 	-r0   c                 J    | xj                   t        j                  z  c_         y)z Just redraw everything N)rw  r   REDRAWrs   s    r1   r  zKeyboard.invalidate_canvas  s    -r0   c                 l   t               }| j                  }|t        j                  z  r;| j                  j                         D ]  }|j                           | j                  }|t        j                  z  rS|j                  t        j                  |              | j                  j                         D ]  }|j                           |t        j                  z  r| j                          |t        j                  z  r| j                          |t        j                  t        j                  z  z  r| j                          | j                   D ]  }|j#                  |        |t        j$                  z  r| j'                          d| _        y |r| j'                  t)        |             d| _        y rE  )r  rw  r   r)  rk  r  r  r*  r   update_suggestions_uiupdate_later/  update_visible_layersr+  update_layoutupdate_scannerrm  apply_ui_updatesr1  r  list)rB   r  r7  r^  r  s        r1   r  zKeyboard.commit_ui_updates  s^   u##&$$$"55<<> $
!!#$''D&$$$KK==dCD #55<<> )
&&() &--&&(&-- 6%%56!&& 	(D!!$'	( &--KKM  ! KKT
# r0   c                 F    | j                   D ]  }|j                           y)zA
        Update layout, key sizes are probably changing.
        N)rm  r6  r  s     r1   r6  zKeyboard.update_layout  s%     && 	!D 	!r0   c                     | j                   }|r4|j                         }|r!|j                  |d   | j                  g       yyy)z show/hide layers r   N)ri  r  set_visible_layersr  )rB   ri  rW  s      r1   r5  zKeyboard.update_visible_layers  sF    ))+F))6!9d6G6G*HI  r0   c                     | j                   rL| j                  }|r(| j                   j                  || j                  d       yt        j                  d       yy)z* tell scanner to update on layout changes Tr
  N)rj  ri  r  r  rv   r  )rB   ri  s     r1   r7  zKeyboard.update_scanner  sE     <<[[F))&$2C2CTJ FG r0   c                 8    | j                   j                          y r?   )ro  r  rs   s    r1   r  zKeyboard.hide_touch_feedback  s    !!#r0   c                 "   |r| j                         }|rt        j                  j                  re|r|j                  nd}t        j                  j
                  r|nd}t               j                  t        j                  |d   |d   |d   |d          t        j                  sjt        j                  j                  rO|j                  t        j                  k7  r1|j                         r |r| j                  j!                  ||       yyyyyyy)z) pressed state of a key instance was set )r@  r   r   N)can_give_keypress_feedbackrH   rC   audio_feedback_enabled
root_pointaudio_feedback_place_in_spacer   playkey_feedbackrH  touch_feedback_enabledr1  r%   r.   can_show_label_popupro  r  )rB   rL   r  r<  r=  feedbackptptss           r1   r:  zKeyboard.on_key_pressed  s    668H 55 ((%-  DD !  U//A1s1vs1vN ??55""ioo5'')$$))#t4  * 6 6 # r0   c                     | j                  d       | j                  |d       | j                  |g       | j                  j	                  |       y)z, pressed state of a key instance was cleard r   N)r8  r9  r  ro  r  rY   s     r1   r[   zKeyboard.on_key_unpressed  sB    %%a(((a0SE!!#&r0   c                     | j                          | j                  j                          t        j                  | |       y)z
        Called by outside click polling.
        Keep this as Francesco likes to have modifiers
        reset when clicking outside of onboard.
        N)r  r  end_mapped_clickr   on_outside_click)rB   r0  s     r1   rO  zKeyboard.on_outside_click  s0     	((*((*((v6r0   c                 .    t        j                  |        y)z. Called when outside click polling times out. N)r   on_cancel_outside_clickrs   s    r1   rQ  z Keyboard.on_cancel_outside_click  s    //5r0   c                     t         j                  r.t         j                  j                         rt         j                  S | j                  S r?   )rH   mousetweaks	is_activer  rs   s    r1   get_click_simulatorzKeyboard.get_click_simulator  s3    '')%%%r0   c                 :   | j                         D ]  }|j                  t        j                  k(  s!d|_        d|_        d|_        || j                  v r| j                  j                  |       || j                  v sn| j                  j                  |        y)z= Keep capslock from causing another send_key_up call on exit FN)
r  rq  r   r  rS   re  r  ry  r  rz  rY   s     r1   r  zKeyboard.ignore_capslock	  s    >># 	9C||y~~-#"
"
$333--44S9$222,,33C8	9r0   c                    | j                          | j                  j                          | j                         D ]  }|j                  s|j
                  t        j                  t        j                  t        j                  t        j                  fv s[t        j                  dj                  |j                               | j                  |       d|_        |s| j!                  |g        y)zS
        Release pressed keys on exit, or when recreating the main window.
        z Releasing still pressed key '{}'FN)r  rn  rT   r  rS   r  r   r~  r  r  r  rv   r  rx   r  rm  r  )rB   r  rL   s      r1   r  zKeyboard.release_pressed_keys	  s     	  " 	'') >># 	'C{{sxx$$&&--'') )  B!'1  %#KK&	'r0   c                     t         j                         }| j                  j                  |       | j                  j	                  |        | j                          y)z}
        Turn on/off auto-show in response to user action (preferences)
        and show/hide the views accordingly.
        N)rH   rs  rq  rr  show_keyboardr  r  s     r1   update_auto_showzKeyboard.update_auto_show)	  sD    
 ,,.v&%%&j1r0   c                 b    t         j                         }| j                  j                  |       y r?   )rH    is_tablet_mode_detection_enabledrq  enable_tablet_mode_detectionr  s     r1   update_tablet_mode_detectionz%Keyboard.update_tablet_mode_detection3	  s"    88:44V<r0   c                 b    t         j                         }| j                  j                  |       y r?   )rH   $is_keyboard_device_detection_enabledrq  r]  r  s     r1    update_keyboard_device_detectionz)Keyboard.update_keyboard_device_detection7	  s"    <<>44V<r0   c                     | j                   j                         }t        j                         }| j                   j	                  |       |r|s| j                   j                          y y y r?   )rt  
is_enabledrH   ru  rr  auto_show_unlock)rB   enabled_beforeenabled_afters      r1   r  zKeyboard.update_auto_hide;	  sP    335335}--OO,,. #0>r0   c                    t         j                         rx|rF| j                  j                         r,| j	                  d       | j                  j                          n| j	                  |       |s| j                  | j                         y y y rQ   )rH   rs  rt  is_auto_show_lockedauto_show_lock_visiblerd  r  r  s     r1   r  z.Keyboard.update_auto_show_on_visibility_changeD	  so    &&(4??>>@++E2002++G4 %%d&B&BC  )r0   c                     t         j                         r.||dk(  ry|dk  rd}| j                  j                  ||||       yy)z4
        Reenable both, hiding and showing.
        Nrb   )rH   rs  rq  lock)rB   reasonduration	lock_show	lock_hides        r1   r  zKeyboard.auto_show_lockR	  sI    
 &&(#s?c>#HOO  9iH )r0   c                 d    t         j                         r| j                  j                  |       yy)z;
        Remove a specific lock named by "reason".
        N)rH   rs  rq  unlockrB   rl  s     r1   rd  zKeyboard.auto_show_unlocka	  s'     &&(OO""6* )r0   c                     t         j                         r<| j                  j                  |      }|| j                  j	                  |d       yyy)zn
        Remove lock and apply the last requested auto-show state while the
        lock was applied.
        Nr   rg   )rH   rs  rq  rq  request_keyboard_visible)rB   rl  
visibilitys      r1   r  z.Keyboard.auto_show_unlock_and_apply_visibilityh	  sK    
 &&(//7J%8818M & )r0   c                 6   t         j                         rt        j                  dj	                  t        |      |             | j                  j                  |      s| j                  j                  dd       | j                  j                  ||dd       yy)zl
        Helper for locking auto-show from AutoHide (hide-on-key-press)
        and D-Bus property.
        zauto_show_lock_and_hide({}, {})Fr   rt  TN)
rH   rs  rv   rw   rx   ry   rq  	is_lockedru  rk  )rB   rl  rm  s      r1   auto_show_lock_and_hidez Keyboard.auto_show_lock_and_hider	  sy    
 &&(MM;!6$v,9; ??,,V488a8H OO  4? )r0   c                 8    | j                   j                  |      S r?   )rq  rx  rr  s     r1   rh  zKeyboard.is_auto_show_locked	  s    ((00r0   c                 d    t         j                         r| j                  j                  |       yy)zk
        If the user unhides onboard, don't auto-hide it until
        he manually hides it again.
        N)rH   rs  rq  lock_visibler  s     r1   ri  zKeyboard.auto_show_lock_visible	  s'    
 &&(OO((1 )r0   c                 &    | j                  d       y )Nauto_position_broadcast_to_viewsrs   s    r1   r~  zKeyboard.auto_position	  s      1r0   c                 &    | j                  d       y )Nstop_auto_positioningr  rs   s    r1   r  zKeyboard.stop_auto_positioning	  s      !89r0   c           	      ^    | j                   sy | j                   j                  |||||||      S r?   )rq  get_repositioned_window_rect)rB   r  homelimit_rectstest_clearancemove_clearance
horizontalverticals           r1   &get_auto_show_repositioned_window_rectz/Keyboard.get_auto_show_repositioned_window_rect	  s6     ;;$N" 	"r0   c                 &    | j                  d|      S )Ntransition_visible_tor  )rB   r  s     r1   r  zKeyboard.transition_visible_to	  s    ''(?FFr0   c                 $    | j                  d      S )Ncommit_transitionr  rs   s    r1   r  zKeyboard.commit_transition	  s    ''(;<<r0   c                     d| j                   _        d| j                   _        | j                   j                  d| j                         y)z
        Attempt to raise keyboard over popups like the one from the firefox
        URL bar. Give it a moment for the popup to appear after a keypress.
        g       @g?N)rp  growthmax_durationrG   _on_raise_timerrs   s    r1   rI  zKeyboard.raise_ui_delayed	  s<    
 $' ),&T%9%9:r0   c                     t         j                  dj                  | j                  j                               | j                  d       | j                  j                          y)Nz"raising window - current delay {}sraise_to_topT)rv   r  rx   rp  _current_delayr  ro  	raise_allrs   s    r1   r  zKeyboard._on_raise_timer	  sK    < 1 1 @ @A	C  0&&(r0   c                 8    | j                   j                          y r?   )rp  rO   rs   s    r1   r  zKeyboard.stop_raise_attempts	  s     r0   c                 ^    | j                   D ]  }t        ||      s t        ||      |    y r?   )rm  hasattrgetattr)rB   	func_nameparamsr  s       r1   r  zKeyboard._broadcast_to_views	  s2    && 	2DtY'(i(&1	2r0   c                 f    | j                   g S t        | j                   j                  |            S r?   )ri  r9  find_ids)rB   idss     r1   r  zKeyboard.find_items_from_ids	  s+    ;;IDKK((-..r0   c                 f    | j                   g S t        | j                   j                  |            S r?   )ri  r9  find_classes)rB   item_classess     r1   find_items_from_classesz Keyboard.find_items_from_classes	  s+    ;;IDKK,,\:;;r0   c                     | j                         D ]5  }|j                  s|j                  |k(  r|c S |j                  |k(  s3|c S  y)z
        Find the first key matching the given id. Id may be a complete
        theme_id (key.theme_id) or just the regular item id (key.id).
        N)r  theme_idr  )rB   r  rL   s      r1   find_key_from_idzKeyboard.find_key_from_id	  sG    
 >># 	C||<<2%JVVr\J	 r0   r  )Tr?   )NNTr   )rb   )NFT)F)NTT)TT)r'   r(   r)   r*   r  r  rt  r  r  r  r,  r  r-  r1  r"   r5  r/  r?  r   r   r   rA  rB  rO  rS  propertyrN  rX  r\  r  r^  rD   r  rt   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  rH  r  r  r  r  r  r  rU  r  r  r   r"  r&  r)  r+  r%  r  r  rb  r;  rB  rf  r%   r,   rm  r9  r8  rw  r  r   r   r  r{  r}  r  rs  rv  r  r  r  rx  rz  rT  r  rn  r  r  rE  r  r  r  r  r  r  rl  r  r  r  r  r
  rp  r  rU  r  r  r  rk  rY  r  r'  r  r-  r  r  r  r6  r5  r7  r  r:  r[   rO  rQ  rU  r  r  rZ  r^  ra  r  r  r  rd  r  ry  rh  ri  r~  r  r  r  r  rI  r  r  r  r  r  r  r/   r0   r1   r$  r$  1  s   "LMMKJ+
 aA!qq*E !"aA!!"qq: (+D'
 +: * *86)*!"9"9;( -/@AL(/b'!R#4#/3&0&-:
*
**#+' +
>4!5 !.%L0C.4
$#


!!-8/..;/zW!r*XC*/.!B %)(G4R/1H.*08&;&8?&1@B
02*"X 23$-OO&)P(1(f4""H*)'LR+1Z8(,
"!F3#J8	%."82 7;38BF&&P&$ 6+:0..."!H!JH$5.'76
9'8 ==/D /315I+N@&122:
 ;?8<
"G=;!2
/
<
r0   r$  c                   \    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dZddZy)ButtonControllerze
    MVC inspired controller that handles events and the resulting
    state changes of buttons.
    c                      || _         || _        y r?   )rC   rL   rB   rC   rL   s      r1   rD   zButtonController.__init__	  s     r0   c                      y)z button pressed Nr/   r  s       r1   r  zButtonController.press	      r0   c                      y)z button pressed long Nr/   rB   r  r0  s      r1   rO  zButtonController.long_press	  r  r0   c                      y)z button released Nr/   r  s       r1   r  zButtonController.release	  r  r0   c                      y)z asynchronous ui update Nr/   rs   s    r1   r  zButtonController.update	  r  r0   c                      y)z% after suggestions have been updated Nr/   rs   s    r1   r4  zButtonController.update_late	  r  r0   c                      y)z can start dwelling? Fr/   rs   s    r1   	can_dwellzButtonController.can_dwell	      r0   c                      y)z< Cannot cancel already called press() without consequences? Fr/   rs   s    r1   rh  z&ButtonController.is_activated_on_press	  r  r0   c                 F   | j                   j                  |k7  rt        j                  dj	                  | j                   |             | j
                  j                  }|j                  | j                   |       | j
                  j                  | j                   g       y y )Nz!ButtonController: {}.visible = {})	rL   r  rv   rw   rx   rC   ri  set_item_visibler  )rB   r  ri  s      r1   r  zButtonController.set_visible	  ss    88w&MM=!6$((G46]]))F##DHHg6MM  $((, 'r0   c                    | j                   j                  |k7  rgt        j                  dj	                  | j                   |             || j                   _        | j
                  j                  | j                   g       y y )Nz#ButtonController: {}.sensitive = {})rL   r5  rv   rw   rx   rC   r  )rB   r5  s     r1   set_sensitivezButtonController.set_sensitive
  s\    88*MM?!6$((I68!*DHHMM  $((,	 +r0   Nc                 
   || j                   j                  |k7  rgt        j                  dj	                  | j                   |             || j                   _        | j
                  j                  | j                   g       y y y )Nz ButtonController: {}.active = {})rL   re  rv   rw   rx   rC   r  rB   re  s     r1   
set_activezButtonController.set_active
  sa    $((//V";MM<!6$((F35$DHHOMM  $((,	 #<r0   c                 ,   || j                   j                  |k7  rxt        j                  dj	                  | j                   |             || j                   _        || j                   _        | j                  j                  | j                   g       y y y )Nz ButtonController: {}.locked = {})rL   r  rv   rw   rx   re  rC   r  )rB   r  s     r1   
set_lockedzButtonController.set_locked
  sl    $((//V";MM<!6$((F35$DHHO$DHHOMM  $((, #<r0   r?   )r'   r(   r)   r*   rD   r  rO  r  r  r4  r  rh  r  r  r  r  r/   r0   r1   r  r  	  sC    ----r0   r  c                   "    e Zd ZdZd Zd Zd Zy)BCClickz Controller for click buttons c                    | j                   j                         }|sy | j                         r0|j                  |t        j
                  t        j                         n\|j                         }| j                   j                  j                  |       |j                  || j                  | j                         |j                  d       y r  )rC   rU  rT  map_primary_clickr   PRIMARY_BUTTONCLICK_TYPE_SINGLEget_click_type_button_rectsr  set_exclusion_rectsr0  
click_typeset_xi_event_handled)rB   r  r0  r1  csrectss         r1   r  zBCClick.release
  s    ]]..0>>  !/!>!>!/!A!AC 446EMM$$88?   t{{DOOD 	!!$'r0   c                     | j                   j                         }|rU| j                  | j                                | j	                  |j                  | j                  | j                               y y r?   )rC   rU  r  rT  r  supports_click_paramsr0  r  rB   r  s     r1   r  zBCClick.update4
  sV    ]]..0OODNN,-((dooFH r0   c                     | j                   j                         }|xr< |j                         | j                  k(  xr |j	                         | j
                  k(  S r?   )rC   rU  get_click_buttonr0  get_click_typer  r  s     r1   rT  zBCClick.is_active;
  sP    ]]..0 7##%47!!#t6	8r0   N)r'   r(   r)   r*   r  r  rT  r/   r0   r1   r  r  
  s    ((,H8r0   r  c                   @    e Zd ZdZej
                  Zej                  Zy)r  singleclickN)	r'   r(   r)   r  r   r  r0  r  r  r/   r0   r1   r  r  B
      	B**F11Jr0   r  c                   @    e Zd ZdZej
                  Zej                  Zy)r  middleclickN)	r'   r(   r)   r  r   MIDDLE_BUTTONr0  r  r  r/   r0   r1   r  r  H
  s    	B))F11Jr0   r  c                   @    e Zd ZdZej
                  Zej                  Zy)r  secondaryclickN)	r'   r(   r)   r  r   SECONDARY_BUTTONr0  r  r  r/   r0   r1   r  r  N
  s    	B,,F11Jr0   r  c                   @    e Zd ZdZej
                  Zej                  Zy)r  doubleclickN)	r'   r(   r)   r  r   r  r0  CLICK_TYPE_DOUBLEr  r/   r0   r1   r  r  T
  r  r0   r  c                   R    e Zd ZdZej
                  Zej                  Zd Z	d Z
d Zy)r  	dragclickc                     t         j                  | |||       | j                  j                  | j	                         d       y )NF)r  r  )r  r  rC   r  _can_show_handlesr  s       r1   r  zBCDragClick.release_
  s9    dFJ7((d.D.D.F38 	) 	:r0   c                     | j                   j                  }t        j                  |        | j                   j                  }|r-|s*| j                  j                  | j                                y y y r?   )rL   re  r  r  rC   r  r  )rB   r  
active_nows      r1   r  zBCDragClick.updated
  sO    tXX__
MM,,T-C-C-EF ",=r0   c                 t    | j                         xr' t        j                         xr t        j                   S r?   )rT  rH   is_mousetweaks_activerH  rs   s    r1   r  zBCDragClick._can_show_handlesm
  s1      $,,.$OO#	%r0   N)r'   r(   r)   r  r   r  r0  CLICK_TYPE_DRAGr  r  r  r  r/   r0   r1   r  r  Z
  s-    	B**F//J:
G%r0   r  c                   "    e Zd ZdZd Zd Zd Zy)r  
hoverclickc                 h    t         j                  t         j                  j                                 y r?   )rH   enable_hover_clickrS  rT  r  s       r1   r  zBCHoverClick.releasew
  s"    !!f&8&8&B&B&D"DEr0   c                     t        t        j                        }|rt        j                  j                         nd}| j	                  |xr t        j
                  j                          | j                  |       y rQ   )r  rH   rS  rT  r  r  disable_hover_clickr  )rB   	availablere  s      r1   r  zBCHoverClick.updatez
  sh    ++,	  &&002&+ 	 	9 C%BBB	D 	r0   c                 d    t         j                  xr t         j                  j                          S r?   rH   rS  rT  rs   s    r1   r  zBCHoverClick.can_dwell
  s%    &&I6+=+=+G+G+IJJr0   Nr'   r(   r)   r  r  r  r  r/   r0   r1   r  r  s
  s    	BF Kr0   r  c                       e Zd ZdZd Zd Zy)r  r  c                     t         j                  rdt         j                  _        y | j                  j	                  d       y rQ   )rH   unity_greeteronscreen_keyboardrC   r  r  s       r1   r  zBCHide.release
  s-    5:F  2 MM%%e,r0   c                 h    | j                  t        j                   xs t        j                         y r?   )r  rH   rH  r  rs   s    r1   r  zBCHide.update
  s'    v. 0!//	1r0   Nr'   r(   r)   r  r  r  r/   r0   r1   r  r  
  s    	B-1r0   r  c                   "    e Zd ZdZd Zd Zd Zy)r  r  c                 `    t         j                  j                   t         j                  _        y r?   )rH   rC   show_click_buttonsr%   r.   rS  rT  r  r  s       r1   r  zBCShowClick.release
  s#    222 	*
 r0   c                 ~   t         j                  j                   }| j                  |       t         j                  j
                  xr |}| j                  j                  }|r[|j                         D ]G  }|j                  dk(  r|j                  ||       %|j                  dk(  s5|j                  ||        I y y )Nclicknoclick)
rH   r  disable_click_buttonsr  rC   r  ri  
iter_itemsr   r  )rB   allowed
show_clickri  r  s        r1   r  zBCShowClick.update
  s    oo;;;! __77CG
%%))+ B::(++D*=ZZ9,++Dj.A	B r0   c                 f    t         j                   xs t         j                  j                          S r?   r  rs   s    r1   r  zBCShowClick.can_dwell
  s(    %%%KV-?-?-I-I-K)KKr0   Nr  r/   r0   r1   r  r  
  s    	B
0B&Lr0   r  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)r  r  c                 `    t         j                  st        |d      r|j                          y y y )Nstart_move_window)rH   rH  r  r  r  s       r1   r  zBCMove.press
  s*    t01&&( 2 r0   c                 \    t         j                  s| j                  j                  d       y y r  )rH   rH  rC   r  r  s      r1   rO  zBCMove.long_press
  s     MM,,T2 r0   c                     t         j                  s9t        |d      r|j                          y | j                  j                  d       y y )Nr  T)rH   rH  r  stop_move_windowrC   r  r  s       r1   r  zBCMove.release
  s9    t01%%' 006 r0   c                     | j                  t        j                          xr= t        j                   xr* t        j
                  t        j                  j                  v        y r?   )r  rH   has_window_decorationrH  r   MOVEwindowwindow_handlesrs   s    r1   r  zBCMove.update
  sK    V99;; E#__,E(D(DD	Fr0   c                      yr  r/   rs   s    r1   rh  zBCMove.is_activated_on_press
  s    r0   N)	r'   r(   r)   r  r  rO  r  r  rh  r/   r0   r1   r  r  
  s!    	B)37F
r0   r  c                   6    e Zd ZdZdZd Z ee      Zd Zd Z	y)r  zD layer switch button, switches to layer <layer_index> when released Nc                 2    dt        | j                        z   S )Nr[  )strr  rs   s    r1   _get_idzBCLayer._get_id
  s    T--...r0   c                    | j                   }|j                  | j                  k(  }|xr |j                  }|j	                  | j
                  ||||      \  }}|j                  | j
                        sd}|r| j                  nd|_        | j                  r|nd|_        ||k7  r!|j                          |j                          y y )NTr   F)	rC   rN  r  r  r  rL   r  r  r  )	rB   r  r0  r1  rC   r  locked_beforere  r  s	            r1   r  zBCLayer.release
  s    == 33t7G7GG%@(*@*@ **488+8-+1:? 	 ((2F +1 (,'7'767 	# ,0+;+; )/AF 	 F"..0&&( #r0   c                 X   | j                   j                  xr1 | j                   j                         | j                  j                  k(  }|r%| j                  j                  | j                         }| j                  |       | j                  |xr | j                  j                         y r?   )	rL   show_activer  rC   rN  r  r  r  r  r  s     r1   r  zBCLayer.update  s{    %% KHH$$&$--*J*JJ 	]]33DHH=F>4==#>#>?r0   )
r'   r(   r)   r*   r  r  r  r  r  r  r/   r0   r1   r  r  
  s$    NK/	'	B)2@r0   r  c                       e Zd ZdZd Zd Zy)r  settingsc                     t        d       y )NsokSettings)r    r  s       r1   r  zBCPreferences.release  s
    =!r0   c                     | j                  t        j                   xr. t        j                   xr t        j                  j
                          y r?   )r  rH   rH  running_under_gdmr  disable_preferencesrs   s    r1   r  zBCPreferences.update  sB    V__, A#555A#__@@@	Br0   Nr  r/   r0   r1   r  r    s    	B"Br0   r  c                       e Zd ZdZd Zd Zy)r  quitc                 |    | j                   j                         }|r t        j                  |j                         y y r?   )rC   r  r   idle_adddo_quit_onboard)rB   r  r0  r1  apps        r1   r  zBCQuit.release  s.    mm++-MM#--. r0   c                 ~    | j                  t        j                   xr t        j                  j                          y r?   )r  rH   rH  r  disable_quitrs   s    r1   r  zBCQuit.update$  s.    V__, :#__999	;r0   Nr  r/   r0   r1   r  r    s    	B/;r0   r  c                       e Zd ZdZd Zy)r  zexpand-correctionsc                 x    | j                   j                         }|j                  |j                                 y r?   )rL   
get_parentexpand_correctionsare_corrections_expandedrB   r  r0  r1  wordlists        r1   r  zBCExpandCorrections.release-  s.    88&&(##(I(I(K$KLr0   Nr'   r(   r)   r  r  r/   r0   r1   r  r  )  s    	BMr0   r  c                       e Zd ZdZd Zd Zy)r  zprevious-predictionsc                     | j                   j                         }|j                          | j                  j	                          y r?   )rL   r(  goto_previous_predictionsrC   r  r+  s        r1   r  zBCPreviousPredictions.release6  s0    88&&(**,++-r0   c                 v    | j                   j                         }| j                  |j                                y r?   )rL   r(  r  can_goto_previous_predictions)rB   r,  s     r1   r4  z!BCPreviousPredictions.update_late;  s+    88&&(8AACDr0   Nr'   r(   r)   r  r  r4  r/   r0   r1   r  r  2  s    	B.
Er0   r  c                       e Zd ZdZd Zd Zy)r  znext-predictionsc                     | j                   j                         }|j                          | j                  j	                          y r?   )rL   r(  goto_next_predictionsrC   r  r+  s        r1   r  zBCNextPredictions.releaseD  s0    88&&(&&(++-r0   c                 z    | j                   }|j                         }| j                  |j                                y r?   )rL   r(  r  can_goto_next_predictions)rB   rL   r,  s      r1   r4  zBCNextPredictions.update_lateI  s.    hh>>#8==?@r0   Nr3  r/   r0   r1   r  r  @  s    	B.
Ar0   r  c                       e Zd ZdZd Zd Zy)r  zpause-learningc                 |   | j                   }| j                  }|j                  ||j                  |j                  ||      \  }}||_        ||_        d}|r|dz  }|r|dz  }t
        j                  j                         dk(  xr |dkD  }	t
        j                  j                  |       |	r|j                          y y )Nr   r   )
rC   rL   r  re  r  rH   word_suggestionsget_pause_learningset_pause_learningdiscard_changes)
rB   r  r0  r1  rC   rL   re  r  r0  pause_starteds
             r1   r  zBCPauseLearning.releaseS  s    ==hh!778;

CJJ8>
L 

QJEQJE00CCEJ # 	 	2259 $$& r0   c                     t         j                  }| j                  |j                         dk\         | j	                  |j                         dk(         y )Nr   r9   )rH   r;  r  r<  r  )rB   cos     r1   r  zBCPauseLearning.updatel  sA    $$--/145--/145r0   Nr  r/   r0   r1   r  r  O  s    	B'26r0   r  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)r  languagec                 @    t         j                  | ||       d| _        y rE  )r  rD   _menu_close_timer  s      r1   rD   zBCLanguage.__init__v  s    !!$#6 !r0   c                    t        j                          | j                  z
  dkD  rY| j                  | j                  j                          | j                  j                  r| j                  || j                  |       d| _        y )Nr$  r   )rd   rE  r  rL   re  
_show_menur  s       r1   r  zBCLanguage.releasez  sY    99;...4OO/0xxdhh7 !r0   c                 r    | j                   j                          |j                  ||| j                         y r?   )rC   r  show_language_menu_on_menu_closed)rB   r  rL   r0  s       r1   rG  zBCLanguage._show_menu  s*    ))+VT-A-ABr0   c                 X    | j                  d       t        j                         | _        y rQ   )r  rd   rE  rs   s    r1   rJ  zBCLanguage._on_menu_closed  s     $		r0   c                    t         j                         r| j                  }| j                  }|j                  }|j                         }|j                  |      j                         }||j                         k7  s|j                  s:|j                  d|i       |j                  |      |_	        |j                          y y y rE  )rH   are_word_suggestions_enabledrL   rC   _languagedbget_lang_idget_language_coder  rX  tooltip
set_labelsget_language_full_namer  )rB   rL   rC   langdblang_idr`  s         r1   r  zBCLanguage.update  s    ..0((C}}H))F**,G,,W5@@BE';;5z*$;;GD&&(  1r0   N)	r'   r(   r)   r  rD   r  rG  rJ  r  r/   r0   r1   r  r  r  s!    	B""C,)r0   r  c                       e Zd ZdZd Zy)r  	inputlinec                 8    | j                   j                          y r?   )rC   hide_input_liner  s       r1   r  zBCInputline.release  s    %%'r0   Nr-  r/   r0   r1   r  r    s    	B(r0   r  c                       e Zd ZdZd Zd Zy)r  	learnmodec                 ^   t         j                  j                   t         j                  _        t         j                  j                  s| j                  j	                          t         j                  j                  r1t         j                  j
                  rdt         j                  _        y y y rQ   )rH   wp
auto_learnrC   r>  stealth_moder  s       r1   r  zBCAutoLearn.release  si    #)99#7#77		 yy##MM))+ 99FII$:$:%*FII" %;r0   c                 V    | j                  t        j                  j                         y r?   )r  rH   r]  r^  rs   s    r1   r  zBCAutoLearn.update  s    		,,-r0   Nr  r/   r0   r1   r  r    s    	B	+.r0   r  c                       e Zd ZdZd Zd Zy)r  punctuationc                     t         j                  j                   t         j                  _        | j                  j                  j                          y r?   )rH   r]  auto_punctuationrC   
punctuatorr  r  s       r1   r  zBCAutoPunctuation.release  s1    )/)C)C%C		"  &&(r0   c                 V    | j                  t        j                  j                         y r?   )r  rH   r]  rd  rs   s    r1   r  zBCAutoPunctuation.update  s    		223r0   Nr  r/   r0   r1   r  r    s    	B)4r0   r  c                       e Zd ZdZd Zd Zy)r  stealthmodec                     t         j                  j                   t         j                  _        t         j                  j                  r| j                  j	                          y y r?   )rH   r]  r_  rC   r>  r  s       r1   r  zBCStealthMode.release  s?    %+YY%;%;!;		 99!!MM))+ "r0   c                 V    | j                  t        j                  j                         y r?   )r  rH   r]  r_  rs   s    r1   r  zBCStealthMode.update  s    		../r0   Nr  r/   r0   r1   r  r    s    	B,0r0   r  )d
__future__r   r   r   rd   r`  r2  
contextlibr   gi.repositoryr   r   logging	getLoggerr'   rv   Onboard.Versionr	   r
   ImportErrorer  Onboardr   Onboard.KeyCommonr   Onboard.KeyboardPopupsr   Onboard.Soundr   Onboard.ClickSimulatorr   r   r   Onboard.Scannerr   Onboard.Timerr   r   Onboard.utilsr   r   r   Onboard.definitionsr   r   r   r   Onboard.AutoShowr   Onboard.AutoHider   Onboard.WordSuggestionsr   Onboard.canonical_equivalentsr   Onboard.oskr   r    r!   r"   DeprecationWarningOnboard.Configr#   rH   r%   r3   r8   r=   objectr]   rm   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  r  r  r/   r0   r1   <module>r     s  0 B A   	 % # 
'

H
% /  K# 4 8 7 /L L 1 FB B? ? 2 2 9 ? 	LL "	   *1 *1Z4v 4DY-h Y-xLO L> ~,; ~,Bt1k t1nd dN=A-v A-H#8 #8L2G 22G 22w 22G 2%' %2K# K*1 1$$L" $LN >*@ *@Z
B$ 
B; ;M* ME, EA( A 6&  6F$)! $)R(" (." .&	4( 	40$ 0w\  KOOIJJK0  		s*   	H= 4
I! =III!I*)I*