
    fi                        d Z ddlmZmZmZ ddlZddlmZ ddlZddl	m
Z
  e
        ddlmZmZmZ ddlmZmZmZmZmZ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Z ej>                  d      Z ddl!m"Z"  e"       Z# G d d      Z$y)z Keyboard layout view     )divisionprint_functionunicode_literalsN)pi)require_gi_versions)GtkGdk	GdkPixbuf)Rectroundrect_arcroundrect_curvegradient_linebrightenunicode_str)get_monitor_dimensions)Key)LOD)UIMask
LayoutView)Configc                      e Zd ZdZd Zd Zd Zd Zd Zd Z	e
j                  f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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- Z0d.dde
j                  fd/Z1	 	 dAd0Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8dBd7Z9d8 Z:d9 Z;d: Z<e
j                  fd;Z=d< Z>d= Z?y)Cr   z,
    Viewer for a tree of layout items.
    c                     || _         d| _        t        j                  | _        d| _        d| _        t               | _        d| _	        d| _
        | j                   j                  |        y )NFT)keyboardsupports_alphar   FULL_lod_font_sizes_valid_shadow_quality_validr   _last_canvas_shadow_rect_starting_up_keys_pre_renderedregister_view)selfr   s     4/usr/lib/python3/dist-packages/Onboard/LayoutView.py__init__zLayoutView.__init__9   sX     #HH	!&%*"(,% "'##D)    c                 z    | j                   j                  |        | j                          | j                          y N)r   deregister_viewinvalidate_keysinvalidate_shadowsr#   s    r$   cleanupzLayoutView.cleanupG   s.    %%d+ 	!r&   c                 D    | j                          | j                          y r(   )update_touch_input_modeupdate_input_event_sourcer,   s    r$   handle_realize_eventzLayoutView.handle_realize_eventN   s    $$&&&(r&   c                 $    | j                          y)z Layout has been loaded. N)invalidate_shadow_qualityr,   s    r$   on_layout_loadedzLayoutView.on_layout_loadedR   s    &&(r&   c                 .    | j                   j                  S r(   )r   layoutr,   s    r$   
get_layoutzLayoutView.get_layoutV   s    }}###r&   c                 .    | j                   j                  S r(   )r   color_schemer,   s    r$   get_color_schemezLayoutView.get_color_schemeY   s    }})))r&   c                     | j                          | j                  t        j                  k(  r| j	                          | j                          | j                  j                          y r(   )r*   r   r   r   r+   invalidate_font_sizesr   invalidate_for_resizer#   lods     r$   r=   z LayoutView.invalidate_for_resize\   sF    99 ##%""$++-r&   c                     d| _         y)z@
        Update font_sizes at the next possible chance.
        FN)r   r,   s    r$   r<   z LayoutView.invalidate_font_sizesd   s     "'r&   c                 t    | j                         }|r&|j                         D ]  }|j                           yy)zc
        Clear cached key surfaces, e.g. after resizing,
        change of theme settings.
        N)r7   	iter_keysinvalidate_keyr#   r6   items      r$   r*   zLayoutView.invalidate_keysj   s<    
 "((* &##%& r&   c                 t    | j                         }|r&|j                         D ]  }|j                           yy)zQ
        Clear cached images, e.g. after changing window_scaling_factor.
        N)r7   rB   invalidate_imagerD   s      r$   invalidate_imageszLayoutView.invalidate_imagest   s<     "((* (%%'( r&   c                 t    | j                         }|r&|j                         D ]  }|j                           yy)zf
        Clear cached shadow surfaces, e.g. after resizing,
        change of theme settings.
        N)r7   rB   invalidate_shadowrD   s      r$   r+   zLayoutView.invalidate_shadows}   s<    
 "((* )&&() r&   c                     d| _         y )NF)r   r,   s    r$   r3   z$LayoutView.invalidate_shadow_quality   s
    %*"r&   c                 t    | j                         }|r&|j                         D ]  }|j                           yy)z
        Clear cached resolution independent label extents, e.g.
        after changes to the systems font dpi setting (gtk-xft-dpi).
        N)r7   rB   invalidate_label_extentsrD   s      r$   rM   z#LayoutView.invalidate_label_extents   s<    
 "((* 0--/0 r&   c                 &   | j                   t        j                  k7  rtt        j                  | _         | j                          | j                  j                          | j                  j                          | j                  j                          yy)z Reset to full level of detail N)r   r   r   r=   r   invalidate_context_uiinvalidate_canvascommit_ui_updatesr,   s    r$   	reset_lodzLayoutView.reset_lod   s^    99 DI&&(MM//1MM++-MM++- !r&   c                      y r(    r,   s    r$   
is_visiblezLayoutView.is_visible   s    r&   c                      y r(   rT   )r#   visibles     r$   set_visiblezLayoutView.set_visible       r&   c                      y r(   rT   r,   s    r$   toggle_visiblezLayoutView.toggle_visible   rY   r&   c                      y r(   rT   r,   s    r$   raise_to_topzLayoutView.raise_to_top   rY   r&   Nc                 n   || j                          yt        |      dk(  ryd}|D ]K  }|j                         }|r|j                  |      n|}|s+|j	                         s<|j                          M | j                         r"|d   j                         } |j                  | } | j                  |  y)zL
        Queue redrawing for individual keys or the whole keyboard.
        Nr   )

queue_drawlenget_canvas_border_rectunionis_keyrC   r7   get_extra_render_sizeinflatequeue_draw_area)r#   items
invalidatearearE   rect
extra_sizes          r$   redrawzLayoutView.redraw   s     =OOZ1_ D *224+/tzz$'T ;;='')*  "1X;;=
#t||Z0 D  $'r&   c                 D    | j                  | j                         |       y r(   )rl   update_labels)r#   rh   s     r$   redraw_labelszLayoutView.redraw_labels   s    D&&(*5r&   c                      y r(   rT   r,   s    r$   update_transparencyzLayoutView.update_transparency   rY   r&   c                 L    | j                  dt        j                                y NT)register_input_eventsconfigis_event_source_gtkr,   s    r$   r0   z$LayoutView.update_input_event_source   s    ""4)C)C)EFr&   c                 V    | j                  t        j                  j                         y r(   )set_touch_input_moderu   r   touch_inputr,   s    r$   r/   z"LayoutView.update_touch_input_mode   s    !!&//"="=>r&   c                     | j                         }|rE|j                  dg      D ]0  }|j                         s|j                  |j                        s0 y y)z
        Veto gesture delay for move buttons. Have the keyboard start
        moving right away and not lag behind the pointer.
        moveFT)r7   find_idsis_path_visibleis_point_withinpoint)r#   sequencer6   rE   s       r$   can_delay_sequence_beginz#LayoutView.can_delay_sequence_begin   sS    
 "1 !'')''7 ! r&   c                      y r(   rT   )r#   show	auto_hides      r$   show_touch_handleszLayoutView.show_touch_handles   rY   r&   c                 L    |t         j                  z  r| j                          y y r(   )r   SIZEr=   )r#   masks     r$   apply_ui_updateszLayoutView.apply_ui_updates   s    &++&&( r&   c                      y r(   rT   r,   s    r$   update_layoutzLayoutView.update_layout   rY   r&   c                 L    | j                         }|r|j                  d       yy)z Draw now, synchronously. TN)
get_windowprocess_updates)r#   windows     r$   r   zLayoutView.process_updates   s$    """4( r&   c                 "   | j                   s| j                          | j                         }|sy| j                  |       |j	                         D ]5  }|j                         s|j                  |       |j                  |       7 d| _        y)z6 Pre-render key surfaces for instant initial drawing. NT)	r   rn   r7   _auto_select_shadow_qualityiter_visible_itemsrc   draw_shadow_cacheddraw_cachedr!   )r#   contextr6   rE   s       r$   renderzLayoutView.render   s     %% "((1 --/ 	*D{{}''0  )	*
 #'r&   c                 b    |t         j                  k(  xr | j                   xs | j                  S )aX  
        Draw cached key surfaces?

        On first startup draw cached only if keys were pre-rendered, i.e. the
        time to render keys was hidden before the window was shown.

        We can't easily pre-render keys in xembed mode because the window size
        is unknown in advance. Draw there once uncached instead (faster).
        )r   r   r    r!   r>   s     r$   _can_draw_cachedzLayoutView._can_draw_cached  s2     sxx B%%%@)@)@	Br&   c                 >   t        j                  ||j                               sy | j                  }| j	                  |      }| j
                  s| j                  |       | j                  |      }| j                  ||      }| j                         }|sy |j                         }t        j                  j                  rd}	n|r| j                         d   }	nd}	| j                  ||	d d |       |r| j                  ||	d |d   |       |j!                         D ]y  }
|
j"                  r| j%                  ||
||       |
j'                         s4|j)                  |
j+                               sT|r|
j-                  |       h|
j/                  ||       { d| _        |S )Ng                 ?r   F)r   cairo_should_draw_windowr   r   r   r   rn   get_damage_rect_draw_backgroundr7   get_layer_idsru   r   transparent_backgroundget_background_rgba_draw_layer_key_backgroundr   layer_id_draw_layer_backgroundrc   
intersectsra   r   drawr    )r#   widgetr   r?   r   	draw_rect	decoratedr6   	layer_idsalpharE   s              r$   r   zLayoutView.draw  s   ++GV5F5F5HIii++C0 %%s#((1	 ))'37	" ((*	==//E,,.q1EE''(,dC	9++GU,0)A,E --/ 
	,D}}++GT9iP {{}##D$?$?$AB$$W-IIgs+
	, "r&   c                    d}d}t         j                         r#| j                  r| j                  |       d}nd}nt         j                  rd}nt         j                         r;| j                  r,t         j                  j                  r| j                  |       n?d}n<| j                  r.| j                  |       t         j                  j                  sd}nd}|r| j                  |       |r| j                  ||       |S )z Draw keyboard background FT)ru   )is_keep_xembed_frame_aspect_ratio_enabledr   _clear_xembed_backgroundxid_modehas_window_decorationr   r   _clear_background_draw_plain_background_draw_transparent_background)r#   r   r?   transparent_bgplain_bgs        r$   r   zLayoutView._draw_backgroundD  s    ;;=""--g6!%__
 H))+""}}33&&w/ ""&&w/}};;%)N''0--gs;r&   c                     |j                          |j                  t        j                         |j	                          |j                          y)zk
        Clear the whole gtk background.
        Makes the whole strut transparent in xembed mode.
        N)saveset_operatorcairoOPERATOR_CLEARpaintrestore)r#   r   s     r$   r   zLayoutView._clear_backgroundo  s4    
 	U112r&   c                    t        dd| j                         | j                               }t        j	                         rr| j                         }|r`|j                         |j                         f}d|j                         |d   z
  }}t        j                  ||||       |j                          t        j                         }|| j                         }d|d<    |j                  |   |j                  |  |j!                          y): fill with plain layer 0 color; no alpha support required r      N      ?r   )r   get_allocated_widthget_allocated_heightru   #get_xembed_background_image_enabled_get_xembed_background_image	get_width
get_heightbottomr	   cairo_set_source_pixbufr   get_xembed_background_rgbar   set_source_rgba	rectanglefill)r#   r   rj   pixbufsrc_sizexyrgbas           r$   r   z#LayoutView._clear_xembed_backgroundy  s    Aq$2243357 557668F",,.0A0A0CD$++-(1+51++GVQB 002<++-DDG&4 r&   c                    	 | j                   }|S # t        $ r+ t        |       \  }}t        j	                         }|r|d   dk  s|d   dk  rd}n	 t
        j                  j                  |      }t        dd|d   |d         }t        dd|j                         |j                               }|j                  |      } |j                  | }|j                  |d   |d   t
        j                  j                        }n9# t         $ r-}t"        j%                  dt'        |      z          d}Y d}~nd}~ww xY w|| _         Y |S w xY w)z, load the desktop background image in Unity r   r   Nz _get_xembed_background_image(): )_xid_background_imageAttributeErrorr   ru   get_desktop_background_filenamer
   Pixbufnew_from_filer   r   r   inscribe_with_aspectnew_subpixbufscale_simple
InterpTypeBILINEAR	Exception_loggererrorr   )	r#   r   sizesize_mmfilenamermrpraexs	            r$   r   z'LayoutView._get_xembed_background_image  sG   	0//F: 9  	0248MD'==?HAw!|tAw!|"&--;;HEF
 aDGT!W5BaF$4$4$68I8I8KLB004B1V1126F#00a$q'090D0D0M0MOF  "MM"D +B#0 1!F	" *0D&9	0s;    AEB.D E	D7
#D2-E2D77
EEc                 r   t         j                  }| j                         }| j                         }| j	                         r| j                  |       t         j                  j                  }|t        j                  k(  s|dk(  r |j                  |  n|dz  }t         j                  j                  }t         dz  t        |z  dz  z   }t        ||      }	t        j                  |	 }
t!        |dz  g| } |
j"                  dg|  t!        | dz  g| } |
j"                  dg|  |j%                  |
       t         j&                  rd}n| j)                         }|rt+        |||       n |j,                  |  |j/                          |r%| j1                  ||       | j3                  ||       yy)	z, fill with the transparent background color r   g      Y@       @g     f@r   r   FN)ru   CORNER_RADIUSget_keyboard_frame_rectr   can_draw_sidebars_draw_side_barstheme_settingsbackground_gradientr   MINIMALr   key_gradient_directionr   r   r   LinearGradientr   add_color_stop_rgba
set_sourcer   can_draw_framer   r   r   draw_window_framedraw_keyboard_frame)r#   r   r?   corner_radiusrj   r   fill_gradient	directionr   glinepatr   frames                r$   r   z'LayoutView._draw_transparent_background  s   ,,++-'')!!#  )--AA#++A#G##T*U"M--DDICGb9nu44E!$.E&&/C]N2-55D#C##A--]N2-55D#C##A--$??E'')E'47Gt$""7C0$$Wc2 r&   c                    | j                         }d|d<   t        dd| j                         | j                               }| j	                         }|j
                  |j
                  kD  r|j                         } |j                  |  |j                  d       |j                         |_
        |j                         |j                         z
  |_         |j                  |  |j                          |j                         |_
        |j                         |j                         z
  |_         |j                  |  |j                          yy)za
        Transparent bars left and right of the aspect corrected
        keyboard frame.
        r   r   r   N)r   r   r   r   r   wcopyr   set_line_widthleftr   r   r   right)r#   r   r   rwinrframers         r$   r   zLayoutView._draw_side_bars  s   
 '')QAq,,.--/1 --/66FHHA#G##T*""1%))+AC++-$))+-ACGq!LLN,,.AC**,/ACGq!LLN r&   c                      y) overloaded in KeyboardWidget TrT   r,   s    r$   r   zLayoutView.can_draw_frame  s    r&   c                      y)r  FrT   r,   s    r$   r   zLayoutView.can_draw_sidebars  s    r&   c                      y r(   rT   )r#   r   r?   s      r$   r   zLayoutView.draw_window_frame  rY   r&   c                     t         j                  }| j                         }| j                         }|j	                  d      }t        |||       |j                          y)z? draw frame around the (potentially aspect corrected) keyboard r   N)ru   r   r   r   deflater   stroke)r#   r   r?   r   rj   r   	line_rects          r$   r   zLayoutView.draw_keyboard_frame  sN    ,,++-'') LLO	gy-8r&   c                 d    | j                  |      } |j                  |  |j                          y)r   N)_get_layer_fill_rgbar   r   )r#   r   layer_indexr   s       r$   r   z!LayoutView._draw_plain_background  s+    ((5&r&   c                    |j                  |j                        }|j                  }|r|dk7  r|j                         } |j                  |j                  d        | j                         }|r|j                  |      }	ng d}	 |j                  |	  |j                          | j                  |d||j                         y y y )Nr   r   )r   r   r   g?r   )indexr   parentget_canvas_rectr   re   r:   get_layer_fill_rgbar   r   r   )
r#   r   rE   r   r   r  r  rj   r9   r   s
             r$   r   z!LayoutView._draw_layer_background  s    oodmm4!))+DGt||A/002L#77D+#G##T*LLN ++GS$N  r&   r   c                 R    | j                  ||||       | j                  |||       y r(   )_draw_dish_key_background_draw_shadows)r#   r   r   rE   r   r?   s         r$   r   z%LayoutView._draw_layer_key_background'  s(    &&wtXF7Hc2r&   c                    t         j                  j                  dk(  r| j                         }|j	                          |j                  dddd       |j                  j                  d      }|j                  j                  d      }||}|j                  |      D ]>  }|j                         }	 |	j                  | }	t        ||	|       |j                          @ |j                          |j                  |       yy)z
        Black background following the contours of key clusters
        to simulate the opening in the keyboard plane.
        dishr   r   )皙?r  g333333@N)ru   r   	key_styler7   
push_groupr   r   scale_log_to_canvasscale_log_to_canvas_xiter_layer_keysget_canvas_fullsize_rectre   r   r   pop_group_to_sourcepaint_with_alpha)
r#   r   r   rE   r   r6   enlargementr   keyrj   s
             r$   r  z$LayoutView._draw_dish_key_background,  s       **f4__&F ##Aq!Q/ ..<<ZHK"NN@@EM|++H5 335#t||[1}=	 '')$$U+% 5r&   c                    |t         j                  k  ryt        j                  j                  sy| j                  |       |j                          | j                  ||       | j                  |      }| j                         }|j                  |      D ]3  }|j                  |j                               s#|j                  |       5 |j                          y)z1
        Draw drop shadows for all keys.
        N)r   r   ru   r   key_shadow_strengthr   r   set_shadow_scaler   r7   r   r   ra   r   r   )r#   r   r   r?   r   r6   rE   s          r$   r  zLayoutView._draw_shadowsF  s     >$$88((1gs+((1	"**84 	1D##D$?$?$AB''0	1 	r&   c                 x    | j                   s.| j                  |      }t        j                  |       d| _         yy)z auto-select shadow quality TN)r   _probe_shadow_performancer   set_shadow_quality)r#   r   qualitys      r$   r   z&LayoutView._auto_select_shadow_quality_  s6    ))44W=G""7+)-D& *r&   c                    t        j                          }d}| j                         }d}d}d}|j                         D ]-  }t        |j	                  |            }	t        |	      }
|	d| } n |rt        t        j                        D ]  \  }\  }}t        j                          }|D ]  }|j                  ||d        t        j                          |z
  }|t        |      z  
z  }t        j                  dj                  |dz  ||             ||kD  s n t        j                  dj                  t        j                          |z
  dz  |             |S )zs
        Determine shadow quality based on the estimated render time of
        the first layer's shadows.
        NgQ?
   g?zZProbing shadow performance: estimated full refresh time {:6.1f}ms at quality {}, {} steps.i  z?Probing shadow performance took {:.1f}ms. Selecting quality {}.)timer7   r   listr   r`   	enumerater   _shadow_presetscreate_shadow_surfacer   debugformatinfo)r#   r   probe_beginr,  r6   max_total_timemax_probe_keyskeysr   
layer_keysnum_first_layer_keysstepsr   beginr%  elapsedestimates                    r$   r*  z$LayoutView._probe_shadow_performancef  s]   
 iik",,. 	Hf44X>?J#&z? o~.D		 +4S5H5H+I '%		 CC--gucBC))+-"SY.1EE 9  &vho&-u 67
 n, LL 1 &$))+";t!C!(*+ r&   c                 j   | j                         }|t        j                  k  r| j                  }|j                  |j                  z  }|j
                  |j
                  z  }d}d}||cxkD  r|kD  r$n n!||cxkD  r|kD  rn n|j                  ||       y| j                          || _        y|| _        y)z
        Shadows aren't normally refreshed while resizing.
        -> scale the cached ones to fit the new canvas size.
        Occasionally refresh them anyway if scaling becomes noticeable.
        r  g333333?N)r   r   r   r   r   hscaler+   )	r#   r   r?   r  rlscale_xscale_ysminsmaxs	            r$   r(  zLayoutView.set_shadow_scale  s     ))+>..BccBDDjGccBDDjG DDg$$g$$gw/ '')01-,-D)r&   c                 P    | j                         }|r|j                  |      S g dS )N)r   r   r   r   )r:   r  )r#   r  r9   s      r$   r  zLayoutView._get_layer_fill_rgba  s*    ,,.33K@@''r&   c                     | j                  d      }t        j                  j                         }||d   z  }|dd |gz   S )z) layer 0 color * background_transparency r   r   N)r  ru   r   get_background_opacity)r#   layer0_rgbabackground_alphas      r$   r   zLayoutView.get_background_rgba  sI    //2!==??AKN*2A"2!333r&   c                     | j                         }|r|j                  d|      }ng d}t        j                  j	                         }||d   z  }|d d |gz   S )Nz	key-popup)r  r  r  r   r   )r:   get_window_rgbaru   r   rK  )r#   elementr9   r   rM  s        r$   get_popup_window_rgbaz LayoutView.get_popup_window_rgba  sa    ,,.//WED'D!==??ADG#BQx+,,,r&   c                     t        j                  |j                          }| j                         }|r|j                  j                  d      }nd} |j                  | S )N)r   r   )r   r   )r   from_extentsclip_extentsr7   r   r  re   )r#   r   	clip_rectr6   rk   s        r$   r   zLayoutView.get_damage_rect  sX    %%w';';'=>	 ";;JGJJ y  *--r&   c                    | j                         }|r?|j                         }|j                  | j                               }|j                         S t	        dd| j                         | j                               }|j                         S )z`
        Rectangle of the potentially aspect-corrected
        frame around the layout.
        r   )r7   ra   re   get_frame_widthr   r   r   int)r#   r6   rj   s      r$   r   z"LayoutView.get_keyboard_frame_rect  sy    
 "002D<< 4 4 67D xxz 1d668"779;Dxxzr&   c                 ^    | j                   j                  xr | j                   j                  S r(   )r   docking_enableddocking_expandedr,   s    r$   is_docking_expandedzLayoutView.is_docking_expanded  s!    {{**Kt{{/K/KKr&   c                    t               }| j                         }| j                  j                         }|r)|t        j
                  k(  r[|j                         D ]H  }|j                         }|j                  |       |j                         |k7  s8|j                  |       J |j                         j                         D ]  }d}|D ]U  }|j                  |      }	|	s|j                  r)|j                  |	k7  s3|	|_        |j                  |       L|r|	|k  sT|	}W |D ]7  }|j                  |k7  s|j                  r ||_        |j                  |       9  d| _        t!        |      S )z
        Iterate through all key groups and set each key's
        label font size to the maximum possible for that group.
        r   T)setr7   r   get_mod_maskr   r   rB   	get_labelconfigure_labeladdget_key_groupsvaluesget_best_font_sizeignore_group	font_sizer   tuple)
r#   r?   changed_keysr6   mod_maskr%  	old_labelr:  max_size	best_sizes
             r$   rn   zLayoutView.update_labels  sW   
 u"==--/chh!++- .C #I''1}})3$((-	. --/668 . 	5C # 6 6x @I ++"}}	909 , 0 0 5#+y8/C+4	5   .C}}0++(0$((-	..& "&\""r&   c                 |    | j                         }| j                  }|r|r|j                  ||j                        S y r(   )r7   r   
get_key_atactive_layer)r#   r   r6   r   s       r$   get_key_at_locationzLayoutView.get_key_at_location  s8    "==h$$UH,A,ABBr&   c                 l    | j                         }|r"|j                         }|r|j                         S y)Nr   )get_toplevelr   get_xid)r#   topleveltopwins      r$   rt  zLayoutView.get_xid  s6     $$&((*F~~''r&   rs   )T)r   )r   NN)border)@__name__
__module____qualname____doc__r%   r-   r1   r4   r7   r:   r   r   r=   r<   r*   rH   r+   r3   rM   rR   rU   rX   r[   r]   rl   ro   rq   r0   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   rQ  r   r   r\  rn   rq  rt  rT   r&   r$   r   r   4   s_   *"))$* ), .'&()+0.(:6G?))'*B1f)V. D(3T6	O( ;>d.2#((3
 FJ-1-42.%N.2(4-
.L #&(( '#Rr&   )%r{  
__future__r   r   r   r/  mathr   r   Onboard.Versionr   gi.repositoryr   r	   r
   Onboard.utilsr   r   r   r   r   r   Onboard.WindowUtilsr   Onboard.KeyGtkr   Onboard.KeyCommonr   Onboard.definitionsr   logging	getLoggerr   Onboard.Configr   ru   r   rT   r&   r$   <module>r     so   (  A A    /   5 5. . 9 % % ( 
'

L
) "	f fr&   