diff options
author | Jeff Brown <jeffbrown@google.com> | 2012-04-17 18:50:05 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2012-04-17 18:50:05 -0700 |
commit | 4a3862f6b0a8971b6ab5b1c46735b28e7604d0db (patch) | |
tree | 4091176054868659d2fa6bec36540f56c08bd116 /libs/androidfw/KeyLayoutMap.cpp | |
parent | 6ec6f79e1ac1714e3b837796e99f07ff88f66601 (diff) |
Add Dvorak keyboard layout.
Added support for mapping both scan codes and HID usages to
KeyLayoutMap and KeyCharacterMap. Keyboard overlays can
now influence how key events are mapped to key codes.
Bug: 6110399
Change-Id: I6619fd2d3e1337c55928f89869dbc45b535c7ccf
Diffstat (limited to 'libs/androidfw/KeyLayoutMap.cpp')
-rw-r--r-- | libs/androidfw/KeyLayoutMap.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/libs/androidfw/KeyLayoutMap.cpp b/libs/androidfw/KeyLayoutMap.cpp index a7c219965262..2db19c5ff72f 100644 --- a/libs/androidfw/KeyLayoutMap.cpp +++ b/libs/androidfw/KeyLayoutMap.cpp @@ -199,17 +199,26 @@ status_t KeyLayoutMap::Parser::parse() { } status_t KeyLayoutMap::Parser::parseKey() { - String8 scanCodeToken = mTokenizer->nextToken(WHITESPACE); + String8 codeToken = mTokenizer->nextToken(WHITESPACE); + bool mapUsage = false; + if (codeToken == "usage") { + mapUsage = true; + mTokenizer->skipDelimiters(WHITESPACE); + codeToken = mTokenizer->nextToken(WHITESPACE); + } + char* end; - int32_t scanCode = int32_t(strtol(scanCodeToken.string(), &end, 0)); + int32_t code = int32_t(strtol(codeToken.string(), &end, 0)); if (*end) { - ALOGE("%s: Expected key scan code number, got '%s'.", mTokenizer->getLocation().string(), - scanCodeToken.string()); + ALOGE("%s: Expected key %s number, got '%s'.", mTokenizer->getLocation().string(), + mapUsage ? "usage" : "scan code", codeToken.string()); return BAD_VALUE; } - if (mMap->mKeysByScanCode.indexOfKey(scanCode) >= 0) { - ALOGE("%s: Duplicate entry for key scan code '%s'.", mTokenizer->getLocation().string(), - scanCodeToken.string()); + KeyedVector<int32_t, Key>& map = + mapUsage ? mMap->mKeysByUsageCode : mMap->mKeysByScanCode; + if (map.indexOfKey(code) >= 0) { + ALOGE("%s: Duplicate entry for key %s '%s'.", mTokenizer->getLocation().string(), + mapUsage ? "usage" : "scan code", codeToken.string()); return BAD_VALUE; } @@ -243,12 +252,13 @@ status_t KeyLayoutMap::Parser::parseKey() { } #if DEBUG_PARSER - ALOGD("Parsed key: scanCode=%d, keyCode=%d, flags=0x%08x.", scanCode, keyCode, flags); + ALOGD("Parsed key %s: code=%d, keyCode=%d, flags=0x%08x.", + mapUsage ? "usage" : "scan code", code, keyCode, flags); #endif Key key; key.keyCode = keyCode; key.flags = flags; - mMap->mKeysByScanCode.add(scanCode, key); + map.add(code, key); return NO_ERROR; } |