Jeff Brown | 590a9d6 | 2011-06-30 12:55:34 -0700 | [diff] [blame] | 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 | * <modifier> or <modifier1>`+`<modifier2>`+`...: 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` <Android key code name>: 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 'à'. |
| 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. |