Home | History | Annotate | Download | only in input
      1 <!--
      2    Copyright 2011 The Android Open Source Project
      3 
      4    Licensed under the Apache License, Version 2.0 (the "License");
      5    you may not use this file except in compliance with the License.
      6    You may obtain a copy of the License at
      7 
      8        http://www.apache.org/licenses/LICENSE-2.0
      9 
     10    Unless required by applicable law or agreed to in writing, software
     11    distributed under the License is distributed on an "AS IS" BASIS,
     12    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13    See the License for the specific language governing permissions and
     14    limitations under the License.
     15 -->
     16 
     17 # Key Character Map Files #
     18 
     19 Key character map files (`.kcm` files) are responsible for mapping combinations
     20 of Android key codes with modifiers to Unicode characters.
     21 
     22 Device-specific key layout files are *required* for all internal (built-in)
     23 input devices that have keys, if only to tell the system that the device
     24 is special purpose only (not a full keyboard).
     25 
     26 Device-specific key layout files are *optional* for external keyboards, and
     27 often aren't needed at all.  The system provides a generic key character map
     28 that is suitable for many external keyboards.
     29 
     30 If no device-specific key layout file is available, then the system will
     31 choose a default instead.
     32 
     33 ## Location ##
     34 
     35 Key character map files are located by USB vendor, product (and optionally version)
     36 id or by input device name.
     37 
     38 The following paths are consulted in order.
     39 
     40 *   `/system/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm`
     41 *   `/system/usr/keychars/Vendor_XXXX_Product_XXXX.kcm`
     42 *   `/system/usr/keychars/DEVICE_NAME.kcm`
     43 *   `/data/system/devices/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm`
     44 *   `/data/system/devices/keychars/Vendor_XXXX_Product_XXXX.kcm`
     45 *   `/data/system/devices/keychars/DEVICE_NAME.kcm`
     46 *   `/system/usr/keychars/Generic.kcm`
     47 *   `/data/system/devices/keychars/Generic.kcm`
     48 *   `/system/usr/keychars/Virtual.kcm`
     49 *   `/data/system/devices/keychars/Virtual.kcm`
     50 
     51 When constructing a file path that contains the device name, all characters
     52 in the device name other than '0'-'9', 'a'-'z', 'A'-'Z', '-' or '_' are replaced by '_'.
     53 
     54 ## Generic Key Character Map File ##
     55 
     56 The system provides a special built-in key character map file called `Generic.kcm`.
     57 This key character map is intended to support a variety of standard external
     58 keyboards.
     59 
     60 *Do not modify the generic key character map!*
     61 
     62 ## Virtual Key Character Map File ##
     63 
     64 The system provides a special built-in key character map file called `Virtual.kcm`
     65 that is used by the virtual keyboard devices.
     66 
     67 The virtual keyboard device is a synthetic input device whose id is -1
     68 (see `KeyCharacterMap.VIRTUAL_KEYBOARD`).  It is present on all Android devices
     69 beginning with Android Honeycomb 3.0.  The purpose of the virtual keyboard device
     70 is to provide a known built-in input device that can be used for injecting
     71 keystokes into applications by the IME or by test instrumentation, even
     72 for devices that do not have built-in keyboards.
     73 
     74 The virtual keyboard is assumed to have a full QWERTY layout that is the
     75 same on all devices.  This makes it possible for applications to inject
     76 keystrokes using the virtual keyboard device and always get the same results.
     77 
     78 *Do not modify the virtual key character map!*
     79 
     80 ## Syntax ##
     81 
     82 A key character map file is a plain text file consisting of a keyboard type
     83 declaration and a set of key declarations.
     84 
     85 ### Keyboard Type Declaration ###
     86 
     87 A keyboard type declaration describes the overall behavior of the keyboard.
     88 A character map file must contain a keyboard type declaration.  For clarity,
     89 it is often placed at the top of the file.
     90 
     91     type FULL
     92 
     93 The following keyboard types are recognized:
     94 
     95 *   `NUMERIC`: A numeric (12-key) keyboard.
     96 
     97     A numeric keyboard supports text entry using a multi-tap approach.
     98     It may be necessary to tap a key multiple times to generate the desired letter or symbol.
     99 
    100     This type of keyboard is generally designed for thumb typing.
    101 
    102     Corresponds to `KeyCharacterMap.NUMERIC`.
    103 
    104 *   `PREDICTIVE`: A keyboard with all the letters, but with more than one letter per key.
    105 
    106     This type of keyboard is generally designed for thumb typing.
    107 
    108     Corresponds to `KeyCharacterMap.PREDICTIVE`.
    109 
    110 *   `ALPHA`: A keyboard with all the letters, and maybe some numbers.
    111 
    112     An alphabetic keyboard supports text entry directly but may have a condensed
    113     layout with a small form factor.  In contrast to a `FULL` keyboard, some
    114     symbols may only be accessible using special on-screen character pickers.
    115     In addition, to improve typing speed and accuracy, the framework provides
    116     special affordances for alphabetic keyboards such as auto-capitalization
    117     and toggled / locked SHIFT and ALT keys.
    118 
    119     This type of keyboard is generally designed for thumb typing.
    120 
    121 *   `FULL`: A full PC-style keyboard.
    122 
    123     A full keyboard behaves like a PC keyboard.  All symbols are accessed directly
    124     by pressing keys on the keyboard without on-screen support or affordances such
    125     as auto-capitalization.
    126 
    127     This type of keyboard is generally designed for full two hand typing.
    128 
    129 *   `SPECIAL_FUNCTION`: A keyboard that is only used to perform system control functions
    130     rather than for typing.
    131 
    132     A special function keyboard consists only of non-printing keys such as
    133     HOME and POWER that are not actually used for typing.
    134 
    135 The `Generic.kcm` and `Virtual.kcm` key character maps are both `FULL` keyboards.
    136 
    137 ### Key Declarations ###
    138 
    139 Key declarations each consist of the keyword `key` followed by an Android key code
    140 name, an open curly brace, a set of properties and behaviors and a close curly brace.
    141 
    142     key A {
    143         label:                              'A'
    144         base:                               'a'
    145         shift, capslock:                    'A'
    146         ctrl, alt, meta:                    none
    147     }
    148 
    149 #### Properties ####
    150 
    151 Each key property establishes a mapping from a key to a behavior.  To make the
    152 key character map files more compact, several properties can be mapped to the
    153 same behavior by separating them with a comma.
    154 
    155 In the above example, the `label` property is assigned the `'A'` behavior.
    156 Likewise, the `ctrl`, `alt` and `meta` properties are all simultaneously assigned
    157 the `none` behavior.
    158 
    159 The following properties are recognized:
    160 
    161 *   `label`: Specifies the label that is physically printed on the key, when it
    162     consists of a single character.  This is the value that is returned by
    163     the `KeyCharacterMap.getDisplayLabel` method.
    164 
    165 *   `number`: Specifies the behavior (character that should be typed) when a numeric
    166     text view has focus, such as when the user is typing a phone number.
    167 
    168     Compact keyboards often combine multiple symbols into a single key, such that
    169     the same key might be used to type `'1'` and `'a'` or `'#'` and `'q'`, perhaps.
    170     For these keys, the `number` property should be set to indicate which symbol
    171     should be typed in a numeric context, if any.
    172 
    173     Some typical "numeric" symbols are digits `'0'` through `'9'`, `'#'`, `'+'`,
    174     `'('`, `')'`, `','`, and `'.'`.
    175 
    176 *   `base`: Specifies the behavior (character that should be typed) when no modifiers
    177     are pressed.
    178 
    179 *   &lt;modifier&gt; or &lt;modifier1&gt;`+`&lt;modifier2&gt;`+`...: Specifies the
    180     behavior (character that should be typed) when the key is pressed and all of the
    181     specified modifiers are active.
    182 
    183     For example, the modifier property `shift` specifies a behavior that applies when
    184     the either the LEFT SHIFT or RIGHT SHIFT modifier is pressed.
    185 
    186     Similarly, the modifier property `rshift+ralt` specifies a behavior that applies
    187     when the both RIGHT SHIFT and RIGHT ALT modifiers are pressed together.
    188 
    189 The following modifiers are recognized in modifier properties:
    190 
    191 *   `shift`: Applies when either the LEFT SHIFT or RIGHT SHIFT modifier is pressed.
    192 *   `lshift`: Applies when the LEFT SHIFT modifier is pressed.
    193 *   `rshift`: Applies when the RIGHT SHIFT modifier is pressed.
    194 *   `alt`: Applies when either the LEFT ALT or RIGHT ALT modifier is pressed.
    195 *   `lalt`: Applies when the LEFT ALT modifier is pressed.
    196 *   `ralt`: Applies when the RIGHT ALT modifier is pressed.
    197 *   `ctrl`: Applies when either the LEFT CONTROL or RIGHT CONTROL modifier is pressed.
    198 *   `lctrl`: Applies when the LEFT CONTROL modifier is pressed.
    199 *   `rctrl`: Applies when the RIGHT CONTROL modifier is pressed.
    200 *   `meta`: Applies when either the LEFT META or RIGHT META modifier is pressed.
    201 *   `lmeta`: Applies when the LEFT META modifier is pressed.
    202 *   `rmeta`: Applies when the RIGHT META modifier is pressed.
    203 *   `sym`: Applies when the SYMBOL modifier is pressed.
    204 *   `fn`: Applies when the FUNCTION modifier is pressed.
    205 *   `capslock`: Applies when the CAPS LOCK modifier is locked.
    206 *   `numlock`: Applies when the NUM LOCK modifier is locked.
    207 *   `scrolllock`: Applies when the SCROLL LOCK modifier is locked.
    208 
    209 The order in which the properties are listed is significant.  When mapping a key to
    210 a behavior, the system scans all relevant properties in order and returns the last
    211 applicable behavior that it found.
    212 
    213 Consequently, properties that are specified later override properties that are
    214 specified earlier for a given key.
    215 
    216 #### Behaviors ####
    217 
    218 Each property maps to a behavior.  The most common behavior is typing a character
    219 but there are others.
    220 
    221 The following behaviors are recognized:
    222 
    223 *   `none`: Don't type a character.
    224 
    225     This behavior is the default when no character is specified.  Specifying `none`
    226     is optional but it improves clarity.
    227 
    228 *   `'X'`: Type the specified character literal.
    229 
    230     This behavior causes the specified character to be entered into the focused
    231     text view.  The character literal may be any ASCII character, or one of the
    232     following escape sequences:
    233 
    234     *   `'\\'`: Type a backslash character.
    235     *   `'\n'`: Type a new line character (use this for ENTER / RETURN).
    236     *   `'\t'`: Type a TAB character.
    237     *   `'\''`: Type an apostrophe character.
    238     *   `'\"'`: Type a quote character.
    239     *   `'\uXXXX'`: Type the Unicode character whose code point is given in hex by XXXX.
    240 
    241 *   `fallback` &lt;Android key code name&gt;: Perform a default action if the key is not
    242     handled by the application.
    243 
    244     This behavior causes the system to simulate a different key press when an application
    245     does not handle the specified key natively.  It is used to support default behavior
    246     for new keys that not all applications know how to handle, such as ESCAPE or
    247     numeric keypad keys (when numlock is not pressed).
    248 
    249     When a fallback behavior is performed, the application will receive two key presses:
    250     one for the original key and another for the fallback key that was selected.
    251     If the application handles the original key during key up, then the fallback key
    252     event will be canceled (`KeyEvent.isCanceled` will return `true`).
    253 
    254 The system reserves two Unicode characters to perform special functions:
    255 
    256 *   `'\uef00'`: When this behavior is performed, the text view consumes and removes the
    257     four characters preceding the cursor, interprets them as hex digits, and inserts the
    258     corresponding Unicode code point.
    259 
    260 *   `'\uef01'`: When this behavior is performed, the text view displays a
    261     character picker dialog that contains miscellaneous symbols.
    262 
    263 The system recognizes the following Unicode characters as combining diacritical dead
    264 key characters:
    265 
    266 *   `'\u0300'`: Grave accent.
    267 *   `'\u0301'`: Acute accent.
    268 *   `'\u0302'`: Circumflex accent.
    269 *   `'\u0303'`: Tilde accent.
    270 *   `'\u0308'`: Umlaut accent.
    271 
    272 When a dead key is typed followed by another character, the dead key and the following
    273 characters are composed.  For example, when the user types a grave accent dead
    274 key followed by the letter 'a', the result is '&agrave;'.
    275 
    276 Refer to `KeyCharacterMap.getDeadChar` for more information about dead key handling.
    277 
    278 ### Comments ###
    279 
    280 Comment lines begin with '#' and continue to the end of the line.  Like this:
    281 
    282     # A comment!
    283 
    284 Blank lines are ignored.
    285 
    286 ### How Key Combinations are Mapped to Behaviors ###
    287 
    288 When the user presses a key, the system looks up the behavior associated with
    289 the combination of that key press and the currently pressed modifiers.
    290 
    291 #### SHIFT + A ####
    292 
    293 Suppose the user pressed A and SHIFT together.  The system first locates
    294 the set of properties and behaviors associated with `KEYCODE_A`.
    295 
    296     key A {
    297         label:                              'A'
    298         base:                               'a'
    299         shift, capslock:                    'A'
    300         ctrl, alt, meta:                    none
    301     }
    302 
    303 The system scans the properties from first to last and left to right, ignoring
    304 the `label` and `number` properties, which are special.
    305 
    306 The first property encountered is `base`.  The `base` property always applies to
    307 a key, no matter what modifiers are pressed.  It essentially specifies the default
    308 behavior for the key unless it is overridden by following properties.
    309 Since the `base` property applies to this key press, the system makes note
    310 of the fact that its behavior is `'a'` (type the character `a`).
    311 
    312 The system then continues to scan subsequent properties in case any of them
    313 are more specific than `base` and override it.  It encounters `shift` which
    314 also applies to the key press SHIFT + A.  So the system decides to ignore
    315 the `base` property's behavior and chooses the behavior associated with
    316 the `shift` property, which is `'A'` (type the character `A`).
    317 
    318 It then continues to scan the table, however no other properties apply to this
    319 key press (CAPS LOCK is not locked, neither CONTROL key is pressed, neither
    320 ALT key is pressed and neither META key is pressed).
    321 
    322 So the resulting behavior for the key combination SHIFT + A is `'A'`.
    323 
    324 #### CONTROL + A ####
    325 
    326 Now consider what would happen if the user pressed A and CONTROL together.
    327 
    328 As before, the system would scan the table of properties.  It would notice
    329 that the `base` property applied but would also continue scanning until
    330 it eventually reached the `control` property.  As it happens, the `control`
    331 property appears after `base` so its behavior overrides the `base` behavior.
    332 
    333 So the resulting behavior for the key combination CONTROL + A is `none`.
    334 
    335 #### ESCAPE ####
    336 
    337 Now suppose the user pressed ESCAPE.
    338 
    339     key ESCAPE {
    340         base:                               fallback BACK
    341         alt, meta:                          fallback HOME
    342         ctrl:                               fallback MENU
    343     }
    344 
    345 This time the system obtains the behavior `fallback BACK`, a fallback behavior.
    346 Because no character literal appears, no character will be typed.
    347 
    348 When processing the key, the system will first deliver `KEYCODE_ESCAPE` to the
    349 application.  If the application does not handle it, then the system will try
    350 again but this time it will deliver `KEYCODE_BACK` to the application as
    351 requested by the fallback behavior.
    352 
    353 So applications that recognize and support `KEYCODE_ESCAPE` have the
    354 opportunity to handle it as is, but other applications that do not can instead
    355 perform the fallback action of treating the key as if it were `KEYCODE_BACK`.
    356 
    357 #### NUMPAD_0 with or without NUM LOCK ####
    358 
    359 The numeric keypad keys have very different interpretations depending on whether
    360 the NUM LOCK key is locked.
    361 
    362 The following key declaration ensures that `KEYCODE_NUMPAD_0` types `0`
    363 when NUM LOCK is pressed.  When NUM LOCK is not pressed, the key is delivered
    364 to the application as usual, and if it is not handled, then the fallback
    365 key `KEYCODE_INSERT` is delivered instead.
    366 
    367     key NUMPAD_0 {
    368         label, number:                      '0'
    369         base:                               fallback INSERT
    370         numlock:                            '0'
    371         ctrl, alt, meta:                    none
    372     }
    373 
    374 As we can see, fallback key declarations greatly improve compatibility
    375 with older applications that do not recognize or directly support all of the keys
    376 that are present on a full PC style keyboard.
    377 
    378 ### Examples ###
    379 
    380 #### Full Keyboard ####
    381 
    382     # This is an example of part of a key character map file for a full keyboard
    383     # include a few fallback behaviors for special keys that few applications
    384     # handle themselves.
    385 
    386     type FULL
    387 
    388     key C {
    389         label:                              'C'
    390         base:                               'c'
    391         shift, capslock:                    'C'
    392         alt:                                '\u00e7'
    393         shift+alt:                          '\u00c7'
    394         ctrl, meta:                         none
    395     }
    396     
    397     key SPACE {
    398         label:                              ' '
    399         base:                               ' '
    400         ctrl:                               none
    401         alt, meta:                          fallback SEARCH
    402     }
    403     
    404     key NUMPAD_9 {
    405         label, number:                      '9'
    406         base:                               fallback PAGE_UP
    407         numlock:                            '9'
    408         ctrl, alt, meta:                    none
    409     }
    410 
    411 #### Alphanumeric Keyboard ####
    412 
    413     # This is an example of part of a key character map file for an alphanumeric
    414     # thumb keyboard.  Some keys are combined, such as `A` and `2`.  Here we
    415     # specify `number` labels to tell the system what to do when the user is
    416     # typing a number into a dial pad.
    417     #
    418     # Also note the special character '\uef01' mapped to ALT+SPACE.
    419     # Pressing this combination of keys invokes an on-screen character picker.
    420 
    421     type ALPHA
    422     
    423     key A {
    424         label:                              'A'
    425         number:                             '2'
    426         base:                               'a'
    427         shift, capslock:                    'A'
    428         alt:                                '#'
    429         shift+alt, capslock+alt:            none
    430     }
    431 
    432     key SPACE {
    433         label:                              ' '
    434         number:                             ' '
    435         base:                               ' '
    436         shift:                              ' '
    437         alt:                                '\uef01'
    438         shift+alt:                          '\uef01'
    439     }
    440 
    441 #### Game Pad ####
    442 
    443     # This is an example of part of a key character map file for a game pad.
    444     # It defines fallback actions that enable the user to navigate the user interface
    445     # by pressing buttons.
    446 
    447     type SPECIAL_FUNCTION
    448 
    449     key BUTTON_A {
    450         base:                               fallback BACK
    451     }
    452 
    453     key BUTTON_X {
    454         base:                               fallback DPAD_CENTER
    455     }
    456 
    457     key BUTTON_START {
    458         base:                               fallback HOME
    459     }
    460 
    461     key BUTTON_SELECT {
    462         base:                               fallback MENU
    463     }
    464 
    465 ## Compatibility Note ##
    466 
    467 Prior to Android Honeycomb 3.0, the Android key character map was specified
    468 using a very different syntax and was compiled into a binary file format
    469 (`.kcm.bin`) at build time.
    470 
    471 Although the new format uses the same extension `.kcm`, the syntax is quite
    472 different (and much more powerful).
    473 
    474 As of Android Honeycomb 3.0, all Android key character map files must use
    475 the new syntax and plain text file format that is described in this document.
    476 The old syntax is not supported and the old `.kcm.bin` files are not recognized
    477 by the system.
    478 
    479 ## Language Note ##
    480 
    481 Android does not currently support multilingual keyboards.  Moreover, the
    482 built-in generic key character map assumes a US English keyboard layout.
    483 
    484 OEMs are encouraged to provide custom key character maps for their keyboards
    485 if they are designed for other languages.
    486 
    487 Future versions of Android may provide better support for multilingual keyboards
    488 or user-selectable keyboard layouts.
    489 
    490 ## Validation ##
    491 
    492 Make sure to validate your key character map files using the
    493 [Validate Keymaps](/tech/input/validate-keymaps.html) tool.
    494