
    ff                     p   d Z ddlmZmZmZ 	 ddlZddlmZ  e        ddl	m
Z
 ddlmZ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Z ej2                  d
      Z G d d
e
j                        Z G d de      Z G d de      Z G d dee      Z G d de      Z G d de      Z y# e$ r Y w xY w)zG
Dwelling control via mousetweaks and general mouse support functions.
    )divisionprint_functionunicode_literalsN)require_gi_versions)GObject)EventSourceunicode_str)DelayedLauncher)ConfigObject)XIDeviceManagerXIEventTypeXIEventMaskClickSimulatorc                   @    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y	)
r   z0 Abstract base class for mouse click simulators          c                     t               NNotImplementedErrorselfbutton
click_types      8/usr/lib/python3/dist-packages/Onboard/ClickSimulator.pysupports_click_paramsz$ClickSimulator.supports_click_params=       !##    c                     t               r   r   r   event_sourcer   r   s       r   map_primary_clickz ClickSimulator.map_primary_click@   r   r   c                     t               r   r   r   s    r   get_click_buttonzClickSimulator.get_click_buttonC   r   r   c                     t               r   r   r%   s    r   get_click_typezClickSimulator.get_click_typeF   r   r   N)__name__
__module____qualname____doc__PRIMARY_BUTTONMIDDLE_BUTTONSECONDARY_BUTTONCLICK_TYPE_SINGLECLICK_TYPE_DOUBLECLICK_TYPE_DRAGr   r#   r&   r(    r   r   r   r   1   s:    :NMO$$$$r   c                   d    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y)CSButtonMapperj
    Onboards built-in mouse click mapper.
    Maps secondary or middle button to the primary button.
    c                     t         j                  |        t        j                         | _        g | _        g | _        d | _        y r   )r   __init__oskClickMapper_osk_cm_click_done_notify_callbacks_exclusion_rects_grab_event_sourcer%   s    r   r8   zCSButtonMapper.__init__O   s6    %(,.) ""&r   c                 2    | j                          g | _        y r   end_mappingr<   r%   s    r   cleanupzCSButtonMapper.cleanupW       ,.)r   c                      yNTr3   r   s      r   r   z$CSButtonMapper.supports_click_params[       r   c                     |r2|| j                   k7  s|| j                  k7  r| j                  |||       y | j                          y r   r-   r0   _begin_mappingrA   r!   s       r   r#   z CSButtonMapper.map_primary_click^   >    Vt':'::'4+A+AAfjAr   c                 R   || j                   k7  r|| j                  k(  rw|| _        |j                  d       t	        j
                  |d| j                         | j                  j                  |       || j                  _	        || j                  _
        y | j                  ||       y )NTbutton-release)r-   r0   r>   grab_xi_pointerr   connect_on_xi_button_releaser;   map_pointer_buttonr   r   _set_next_mouse_clickr!   s       r   rI   zCSButtonMapper._begin_mappinge   s    T(((/// '3D#((..> 668LL++F3"(DLL&0DLL#&&vz:r   c                    | j                   rMt        j                  | j                   d| j                         | j                   j	                  d       d | _         | j
                  r| j
                  j                  | j                  k(  rQ| j
                  j                          | j                  | j
                  _
        | j                  | j
                  _        y | j                  | j                  | j                         y y )NrL   F)r>   r   
disconnectrO   rM   r;   r   r0   restore_pointer_buttonsr-   r   rQ   r%   s    r   rA   zCSButtonMapper.end_mappingu   s    """"4#:#:#3#'#=#=? ##33E:&*D#<<||&&$*@*@@446&*&9&9#*.*@*@'**4+>+>@V@VW r   c                     | j                   xsV | j                  xrH | j                  j                  | j                  k7  xs# | j                  j                  | j
                  k7  S r   )r>   r;   r   r0   r   r-   r%   s    r   is_mapping_activez CSButtonMapper.is_mapping_active   sV    && 8<< 8LL##t'='== 7LL4#6#66	8r   c                 N    t         j                  d       | j                          y)z) end of CLICK_TYPE_SINGLE in XInput mode rO   N)_loggerdebugend_mapped_click)r   events     r   rO   z$CSButtonMapper._on_xi_button_release   s    -.r   c                 .    | j                   j                  S r   )r;   r   r%   s    r   r&   zCSButtonMapper.get_click_button   s    ||"""r   c                 .    | j                   j                  S r   )r;   r   r%   s    r   r(   zCSButtonMapper.get_click_type   s    ||&&&r   c                     	 | j                   j                  ||| j                  | j                         y# t        j
                  $ r}t        j                  |       Y d}~yd}~ww xY w)z|
        Converts the next mouse left-click to the click
        specified in @button. Possible values are 2 and 3.
        N)r;   convert_primary_clickr=   rZ   r9   errorrX   warning)r   r   r   r`   s       r   rQ   z$CSButtonMapper._set_next_mouse_click   sU    
	#LL..vz/3/D/D/3/D/DF yy 	#OOE""	#s   25 A'A""A'c                 :    | j                   j                  |       y r   r<   appendr   callbacks     r   state_notify_addzCSButtonMapper.state_notify_add       ))00:r   c                 x    | j                         r*| j                          | j                  D ]
  } |d        yyz0 osk callback, outside click, xi button release N)rV   rA   r<   re   s     r   rZ   zCSButtonMapper.end_mapped_click   s=    !!# !== 	 $r   c                     || _         y r   r=   r   rectss     r   set_exclusion_rectsz"CSButtonMapper.set_exclusion_rects   
     %r   N)r)   r*   r+   r,   r8   rB   r   r#   rI   rA   rV   rO   r&   r(   rQ   rg   rZ   ro   r3   r   r   r5   r5   J   sN    '/; X 8 
#'
#;&r   r5   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y)CSFloatingSlaver6   c                    t         j                  |        || _        t               | _        g | _        d| _        d | _        | j                  | _	        | j                  | _        g | _        g | _        t        j                         | _        y Nr   )r   r8   	_keyboardr   _device_manager_grabbed_device_ids_num_clicks_detected_motion_positionr-   _buttonr0   _click_typer<   r=   r9   r:   r;   )r   keyboards     r   r8   zCSFloatingSlave.__init__   ss    %!.0#% $%! $**11,.) "(r   c                 2    | j                          g | _        y r   r@   r%   s    r   rB   zCSFloatingSlave.cleanup   rC   r   c                 6    | j                   j                         S r   )rv   is_validr%   s    r   r   zCSFloatingSlave.is_valid   s    ##,,..r   c                      yrE   r3   r   s      r   r   z%CSFloatingSlave.supports_click_params   rF   r   c                     |r2|| j                   k7  s|| j                  k7  r| j                  |||       y | j                          y r   rH   r!   s       r   r#   z!CSFloatingSlave.map_primary_click   rJ   r   c                     | j                   j                         }| j                   j                         }| j                  ||      r|| _        || _        d| _        d | _        y y rt   )rv   get_last_click_deviceget_last_motion_device_register_xinput_eventsrz   r{   rx   ry   )r   r"   r   r   click_devicemotion_devices         r   rI   zCSFloatingSlave._begin_mapping   s_    ++AAC,,CCE''mD!DL)D()D%$(D!	 Er   c                 h    | j                          | j                  | _        | j                  | _        y r   )_deregister_xinput_eventsr-   rz   r0   r{   r%   s    r   rA   zCSFloatingSlave.end_mapping   s)    &&(**11r   c                 N   | j                  |dt        j                  t        j                  z  t        j                  z        }|r%||ur!| j                  |dt        j                        }|r(| j
                  j                  d| j                         |S | j                          |S )Nprimarymotiondevice-event)	_register_xinput_devicer   ButtonPressMaskButtonReleaseMask
MotionMaskrv   rN   _on_device_eventr   )r   r   r   successs       r   r   z'CSFloatingSlave._register_xinput_events   s    ..|Y*5*E*E*5*G*G+H*5*@*@+AB
 =L822=(.9.D.DFG   ((*.*?*?A
  **,r   c                 x   t         j                  dj                  ||             	 | j                  j	                  |       | j
                  j                  |j                         	 | j                  j                  d ||       y# t        j                  $ rE}t         j                  dj                  |j                  |j                  |             Y d }~yd }~ww xY w# t        j                  $ rE}t         j                  dj                  |j                  |j                  |             Y d }~yd }~ww xY w)Nzgrab {} device {}zgrab device {id} '{name}': {ex}idnameexFz1select root events for device {id} '{name}': {ex}T)rX   infoformatrv   grab_devicerw   rd   r   r9   r`   r   select_events)r   devicedescription
event_maskr   s        r   r   z'CSFloatingSlave._register_xinput_device   s   (//VDE	  ,,V4$$++FII6	  ..tVZH # yy 	MM;!6vyy'-{{') " +, 	 yy 	MM 0!6vyy'-{{') " +,
 	s0   A B (C! C;CC!D94;D44D9c           	         | j                   r| j                  j                  d| j                         | j                   D ]w  }| j                  j	                  |      }t
        j                  dt        |      z          	 | j                  j                  d |       	 | j                  j                  |       y g | _         y y # t        j                  $ rE}t
        j                  dj                  |j                  |j                  |             Y d }~zd }~ww xY w# t        j                  $ rF}t
        j                  dj                  |j                  |j                  |             Y d }~2d }~ww xY w)Nr   zungrab z3unselect root events for device {id} '{name}': {ex}r   z!ungrab device {id} '{name}': {ex})rw   rv   rS   r   lookup_device_idrX   r   strunselect_eventsr9   r`   r   r   r   ungrab_device)r   	device_idr   r   s       r   r   z)CSFloatingSlave._deregister_xinput_events  sC   ##  ++N,0,A,AC "55 4	-->>yIYV454((88vF4((66v>4, (*D$7 $ yy 4MM #8#)6vyy/5{{/1 $* $34 44 yy 4MM"E#)6vyy/5{{/1 $* $34 44s0   ?CDD;DDE60;E11E6c                    |j                   }| j                  }| j                  }| j                  j                  }|j
                  | j                  vry | j                  }|t        j                  k(  rJt        |j                        t        |j                        f}|| _         | j                  j                  |  |P|t        j                  k(  s|t        j                  k(  r*t        |j                        t        |j                        f}|y || j                   k(  r|t        j                  k(  r(| j"                  j%                  d |d        ||d       n|t        j                  k(  r ||d       | j"                  j'                  d |d       | j(                  r| j+                  |      s| j-                          nt|| j.                  k(  r|t        j                  k(  rQ| j(                  rD| j+                  |      scd}| j"                  j%                  d |d        ||d        ||d|        ||d|        ||d|       | j"                  j'                  d |d       | j-                          n|| j0                  k(  r|t        j                  k(  r| j(                  dk(  rI| j+                  |      r| j-                          nl| j"                  j%                  d |d        ||d       nE| j(                  dk\  r6 ||d       | j"                  j'                  d |d       | j-                          |t        j                  k(  r| xj(                  dz  c_        y y )Nr   TF(   r   r   )xi_typerz   r{   r;   generate_button_eventr   rw   ry   r   Motionintx_rooty_rootgenerate_motion_eventButtonPressButtonReleaser0   ru   maybe_send_alt_pressmaybe_send_alt_releaserx   _is_point_in_exclusion_rectsrZ   r1   r2   )r   r[   
event_typer   r   r   positiondelays           r   r   z CSFloatingSlave._on_device_event2  s   ]]
%%
 $ B B$":":: ((+++ELL)3u||+<=H$,D! /DLL..9+111+333ELL)3u||+<=H ///[44433D&!D%fd3{888%fe455dFAF,,88B))+ 4111[666,,<<XF ";;D&!L-fd;-feUC-fdEB-feUC==dFAN))+ 4///[666,,188B--/;;D&!L-fd;..!3)&%8NN99$J))+ 000%%*% 1r   c                 L    | j                   D ]  }|j                  |      s y y)NTF)r=   is_point_within)r   pointrects      r   r   z,CSFloatingSlave._is_point_in_exclusion_rects~  s-    )) 	D##E*	 r   c                 ,    t        | j                        S r   )boolrw   r%   s    r   rV   z!CSFloatingSlave.is_mapping_active  s    D,,--r   c                     | j                   S r   )rz   r%   s    r   r&   z CSFloatingSlave.get_click_button  s    ||r   c                     | j                   S r   r{   r%   s    r   r(   zCSFloatingSlave.get_click_type      r   c                 :    | j                   j                  |       y r   rc   re   s     r   rg   z CSFloatingSlave.state_notify_add  rh   r   c                     | j                         rD| j                          | j                  j                          | j                  D ]
  } |d        yyrj   )rV   rA   ru   release_latched_sticky_keysr<   re   s     r   rZ   z CSFloatingSlave.end_mapped_click  sM    !!#NN668 !==  $r   c                     || _         y r   rl   rm   s     r   ro   z#CSFloatingSlave.set_exclusion_rects  rp   r   N)r)   r*   r+   r,   r8   rB   r   r   r#   rI   rA   r   r   r   r   r   rV   r&   r(   rg   rZ   ro   r3   r   r   rr   rr      sc    )$//)2
$2*<J+X. ;	&r   rr   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 Zd Zd Zd Zd Zd Zd Zd Zy)CSMousetweaksz^
    Abstract base class for mousetweaks settings,
    D-bus control and signal handling.
    zorg.gnome.desktop.a11y.mouseorg.gnome.mousetweaksorg.gnome.Mousetweaksz/org/gnome/Mousetweaks	ClickTypec                    g | _         dt               vrt        d      t        j                  |        t
        j	                  |        t               | _        g | _        t        d | j                        | _
        	 t        j                         | _        | j                  j#                  | j$                  dt        j&                  | j(                         | j                  j+                  t        j,                  t        j.                        }|j1                  | j(                  t        j&                        }| j3                  t5        |             y # t        j                  j                  $ r t!        d      w xY w)Ndbuszpython-dbus unavailablezD-Bus session bus unavailableNameOwnerChanged)arg0)dbus_interface)_click_type_callbacksglobalsImportErrorr   r8   r   r
   launcher _daemon_running_notify_callbacksMOUSETWEAKS_SCHEMA_IDmousetweaksr   
SessionBus_bus
exceptionsDBusExceptionRuntimeErroradd_signal_receiver_on_name_owner_changedBUS_DAEMON_IFACEMT_DBUS_NAME
get_objectBUS_DAEMON_NAMEBUS_DAEMON_PATHNameHasOwner_set_connectionr   )r   proxyresults      r   r8   zCSMousetweaks.__init__  s/   %'""788d#%')02- (d.H.HI	@)DI 			%%d&A&A&8&*&;&;+/+<+< 	& 	>
 		$$T%9%94;O;OP##D$5$5dF[F[#\T&\* ,, 	@>??	@s   ;E )E<c                     | j                   | _        d| _        | j                  dd       | j                  dd       | j                  dd       | j                  dd       y)	z# Create gsettings key descriptions Nzdwell-click-enabledFz
dwell-timeg333333?zdwell-threshold
   zclick-type-window-visible)MOUSE_A11Y_SCHEMA_IDschemasysdef_sectionadd_keyr%   s    r   
_init_keyszCSMousetweaks._init_keys  sT     //"*E2\3'&+0%8r   c                     t        j                  |        | j                  s| j                  r| j	                  d       y y y )Ng      ?)r   on_properties_initialized_ifacedwell_click_enabled_launch_daemonr%   s    r   r   z'CSMousetweaks.on_properties_initialized  s:    ..t4 {{##$ $ r   c                     g | _         y r   )r   r%   s    r   rB   zCSMousetweaks.cleanup  s
    02-r   c                 >    | j                   j                  dg|       y )Nr   )r   launch_delayed)r   r   s     r   r   zCSMousetweaks._launch_daemon  s    $$m_e<r   c                    |r| j                   j                  | j                  | j                        }t	        j
                  |t        j                        | _        | j                  j                  d| j                         | j                  j                  | j                  | j                        | _        yd| _        | j                  | _        y)z5 Update interface object, state and notify listeners PropertiesChangedN)r   r   r   MT_DBUS_PATHr   	InterfacePROPERTIES_IFACEr   connect_to_signal_on_click_type_prop_changedGetMT_DBUS_IFACEMT_DBUS_PROPr{   r0   )r   activer   s      r   r   zCSMousetweaks._set_connection  s    II(():):D<M<MNE..0E0EFDKKK))*=*.*J*JL#{{t/A/A4CTCTUDDK#55Dr   c                     |dk(  }|r| j                   j                          | j                  |       | j                  D ]
  } ||        y)zv
        The daemon has de/registered the name.
        Called when dwell-click-enabled changes in gsettings.
         N)r   stopr   r   )r   r   oldnewr   rf   s         r   r   z$CSMousetweaks._on_name_owner_changed  sM    
 MM V$ == 	HV	r   c                 :    | j                   j                  |       y r   )r   rd   re   s     r   daemon_running_notify_addz'CSMousetweaks.daemon_running_notify_add  s    --44X>r   c                     | j                   |v rD|j                  | j                         | _        | j                  D ]  } || j                          yy)z6 Either we or someone else has change the click-type. N)r   getr{   r   )r   ifacechanged_propsinvalidated_propsrf   s        r   r   z)CSMousetweaks._on_click_type_prop_changed  sS    -,001B1BCD !66 +))*+	 .r   c                     | j                   S r   r   r%   s    r   _get_mt_click_typez CSMousetweaks._get_mt_click_type
  r   r   c                     || j                   k7  r9|| _         | j                  j                  | j                  | j                  |       y y r   )r{   r   Setr   r   )r   r   s     r   _set_mt_click_typez CSMousetweaks._set_mt_click_type  s=    ))))DKKOOD..0A0A:N *r   c                 r   || j                   k(  rR|| j                  k(  r| j                  S || j                  k(  r| j                  S || j
                  k(  r| j                  S y || j                  k(  r|| j                  k(  r| j                  S y || j                  k(  r|| j                  k(  r| j                  S y y r   )r0   r-   MT_CLICK_TYPE_PRIMARYr.   MT_CLICK_TYPE_MIDDLEr/   MT_CLICK_TYPE_SECONDARYr1   MT_CLICK_TYPE_DOUBLEr2   MT_CLICK_TYPE_DRAGr   s      r   _click_type_to_mtzCSMousetweaks._click_type_to_mt  s    ///,,,1114---00040003334111,,,0004///,,,...r   c                    || j                   k(  r| j                  | j                  fS || j                  k(  r| j                  | j                  fS || j
                  k(  r| j                  | j                  fS || j                  k(  r| j                  | j                  fS || j                  k(  r| j                  | j                  fS y)N)NN)r  r-   r0   r  r.   r  r/   r  r1   r  r2   )r   mt_click_types     r   _click_type_from_mtz!CSMousetweaks._click_type_from_mt)  s    D666&&(>(>>>d777%%t'='===d:::(($*@*@@@d777&&(>(>>>d555&&(<(<<<r   c                 j    | j                  |       | j                  |       | j                  |       y)z9 Convenience function to subscribes to all notifications N)dwell_click_enabled_notify_addclick_type_notify_addr  re   s     r   rg   zCSMousetweaks.state_notify_add;  s,    ++H5""8,&&x0r   c                 :    | j                   j                  |       y r   )r   rd   re   s     r   r  z#CSMousetweaks.click_type_notify_addA  s    ""))(3r   c                 H    | j                   xr t        | j                        S r   )r   r   r   r%   s    r   	is_activezCSMousetweaks.is_activeD  s    ''=D,==r   c                     || _         |r| j                  s| j                  d       y | j                  j	                          y )Ng      ?)r   r   r   r   r  )r   r   s     r   
set_activezCSMousetweaks.set_activeG  s3    #)  $++$MM r   c                      yrE   r3   r   s      r   r   z#CSMousetweaks.supports_click_paramsP  s    r   c                 P    | j                  ||      }|| j                  |       y y r   )r  r  )r   r"   r   r   r  s        r   r#   zCSMousetweaks.map_primary_clickT  s-    ..vzB$##M2 %r   c                 N    | j                         }| j                  |      \  }}|S r   r  r  r   r  r   r   s       r   r&   zCSMousetweaks.get_click_buttonY  s*    //1!55mD
r   c                 N    | j                         }| j                  |      \  }}|S r   r&  r'  s       r   r(   zCSMousetweaks.get_click_type^  s+    //1!55mD
r   N)r)   r*   r+   r,   r   r   r   r   r   r   r8   r   r   rB   r   r   r   r  r   r  r  r  r  rg   r  r   r"  r   r#   r&   r(   r3   r   r   r   r     s    
 :3+L,L+ML+<	9%3=
6?+!O
.$14>!3

r   r   c                   R     e Zd ZdZdZdZdZdZdZdZ	 fdZ
d	 Zd
 Zd Zd Z xZS )CSMousetweaks0z0
    Mousetweaks, old API up to version 3.8
    r   r      r   r   r   c                     t         | j                  |           t        j	                  dj                  | j                  j                               y )Nz0'{}' selected for mousetweaks up to version 3.8.)super	__class__r8   rX   r   r   r)   r   r.  s    r   r8   zCSMousetweaks0.__init__q  s7    dnnd,.G 7 78	:r   c                 \    | j                   | _        | j                         r|rd| _         yyy)) Init click selection window on startup. FN)click_type_window_visibleold_click_type_window_visibler   r   hides     r   init_click_type_window_visiblez-CSMousetweaks0.init_click_type_window_visiblev  s.     .2-K-K*>>-2D* !%r   c                 :    |rd| _         y| j                  | _         y)z) Restore click selection window on exit. TN)r2  r3  r   shows     r   !restore_click_type_window_visiblez0CSMousetweaks0.restore_click_type_window_visible~  s     -1D* 22 *r   c                 b    |r| j                   | _        y|r| j                  | _         d| _        yy)zU
        Called before hover click is activated and after it is deactivated.
        FN)r3  r2  r   allowr5  s      r   allow_system_click_type_windowz-CSMousetweaks0.allow_system_click_type_window  s:     -1-O-OD*  :: 2 27.	 r   c                 \    | j                         r|rd| _        y| j                  | _        yy)z GSettings property changed FN)r   r2  r3  r4  s     r   !on_hide_click_type_window_changedz0CSMousetweaks0.on_hide_click_type_window_changed  s/    >>16. !>> .	 r   )r)   r*   r+   r,   r  r  r  r  r  r   r8   r6  r:  r>  r@  __classcell__r.  s   @r   r*  r*  d  sG     3:
337 ?r   r*  c                   \     e Zd ZdZdZdZdZdZdZdZ	dZ
 fd	Zd
 Zd Zd Zd Zd Z xZS )CSMousetweaks1z0
    Mousetweaks, new API from version 3.10
    r   r   r   r   r+  r   z$org.gnome.Mousetweaks.ClickSelectionc                     d | _         t        | j                  |           t        j                  dj                  | j                  j                               y )Nz,'{}' selected for mousetweaks 3.10 or later.)_mt_hide_name_statusr-  r.  r8   rX   r   r   r)   r/  s    r   r8   zCSMousetweaks1.__init__  s?    $(!dnnd,.C 7 78	:r   c                 &    | j                  |       y)r1  N_hide_click_type_windowr4  s     r   r6  z-CSMousetweaks1.init_click_type_window_visible      $$T*r   c                 &    | j                  d       y)z- Restore the click selection window on exit. FNrH  r8  s     r   r:  z0CSMousetweaks1.restore_click_type_window_visible  s    $$U+r   c                 &    | j                  |       y)z  called from hover click button NrH  r<  s      r   r>  z-CSMousetweaks1.allow_system_click_type_window  rJ  r   c                 &    | j                  |       y r   rH  r4  s     r   r@  z0CSMousetweaks1.on_hide_click_type_window_changed  s    $$T*r   c                    	 |rC| j                   r| j                  r| j                   j                  | j                        | _        y| j                   r:| j                  r-| j                   j	                  | j                         d| _        yyyyy# t
        j                  $ r(}t        j                  t        |             Y d}~yd}~ww xY w)z9 Hide/unhide mousetweaks' native click selection window. N)
r   rF  request_name_MT_HIDE_CLICKSELECTION_NAMErelease_namer   r   rX   r`   r	   )r   r5  es      r   rI  z&CSMousetweaks1._hide_click_type_window  s    
	*99!:!:!Byy--d.O.OP - 99!:!:II**4+L+LM04D- ";9	 "C9 !! 	*MM+a.))	*s   AB AB C#CC)r)   r*   r+   r,   r  r  r  r  r  r   rP  r8   r6  r:  r>  r@  rI  rA  rB  s   @r   rD  rD    sR     3$J :+,++*r   rD  )!r,   
__future__r   r   r   r   r   Onboard.Versionr   gi.repositoryr   Onboard.utilsr   r	   Onboard.Timerr
   Onboard.ConfigUtilsr   Onboard.XInputr   r   r   Onboard.oskr9   logging	getLoggerrX   r   r5   rr   r   r*  rD  r3   r   r   <module>r]     s   * B A	 0   ' 8 / , I I  
'

,
-$W__ $2e&^ e&Pj&n j&ZBL. BJ9?] 9?x0*] 0*G  		s   B- -B54B5