@@ -90,7 +90,8 @@ KeyCharacterMap::KeyCharacterMap() :
9090}
9191
9292KeyCharacterMap::KeyCharacterMap (const KeyCharacterMap& other) :
93- RefBase (), mType (other.mType ) {
93+ RefBase (), mType (other.mType ), mKeysByScanCode (other.mKeysByScanCode ),
94+ mKeysByUsageCode (other.mKeysByUsageCode ) {
9495 for (size_t i = 0 ; i < other.mKeys .size (); i++) {
9596 mKeys .add (other.mKeys .keyAt (i), new Key (*other.mKeys .valueAt (i)));
9697 }
@@ -180,6 +181,16 @@ sp<KeyCharacterMap> KeyCharacterMap::combine(const sp<KeyCharacterMap>& base,
180181 map->mKeys .add (keyCode, new Key (*key));
181182 }
182183 }
184+
185+ for (size_t i = 0 ; i < overlay->mKeysByScanCode .size (); i++) {
186+ map->mKeysByScanCode .replaceValueFor (overlay->mKeysByScanCode .keyAt (i),
187+ overlay->mKeysByScanCode .valueAt (i));
188+ }
189+
190+ for (size_t i = 0 ; i < overlay->mKeysByUsageCode .size (); i++) {
191+ map->mKeysByUsageCode .replaceValueFor (overlay->mKeysByUsageCode .keyAt (i),
192+ overlay->mKeysByUsageCode .valueAt (i));
193+ }
183194 return map;
184195}
185196
@@ -315,6 +326,37 @@ bool KeyCharacterMap::getEvents(int32_t deviceId, const char16_t* chars, size_t
315326 return true ;
316327}
317328
329+ status_t KeyCharacterMap::mapKey (int32_t scanCode, int32_t usageCode, int32_t * outKeyCode) const {
330+ if (usageCode) {
331+ ssize_t index = mKeysByUsageCode .indexOfKey (usageCode);
332+ if (index >= 0 ) {
333+ #if DEBUG_MAPPING
334+ ALOGD (" mapKey: scanCode=%d, usageCode=0x%08x ~ Result keyCode=%d." ,
335+ scanCode, usageCode, *outKeyCode);
336+ #endif
337+ *outKeyCode = mKeysByUsageCode .valueAt (index);
338+ return OK;
339+ }
340+ }
341+ if (scanCode) {
342+ ssize_t index = mKeysByScanCode .indexOfKey (scanCode);
343+ if (index >= 0 ) {
344+ #if DEBUG_MAPPING
345+ ALOGD (" mapKey: scanCode=%d, usageCode=0x%08x ~ Result keyCode=%d." ,
346+ scanCode, usageCode, *outKeyCode);
347+ #endif
348+ *outKeyCode = mKeysByScanCode .valueAt (index);
349+ return OK;
350+ }
351+ }
352+
353+ #if DEBUG_MAPPING
354+ ALOGD (" mapKey: scanCode=%d, usageCode=0x%08x ~ Failed." , scanCode, usageCode);
355+ #endif
356+ *outKeyCode = AKEYCODE_UNKNOWN;
357+ return NAME_NOT_FOUND;
358+ }
359+
318360bool KeyCharacterMap::getKey (int32_t keyCode, const Key** outKey) const {
319361 ssize_t index = mKeys .indexOfKey (keyCode);
320362 if (index >= 0 ) {
@@ -616,6 +658,10 @@ status_t KeyCharacterMap::Parser::parse() {
616658 mTokenizer ->skipDelimiters (WHITESPACE);
617659 status_t status = parseType ();
618660 if (status) return status;
661+ } else if (keywordToken == " map" ) {
662+ mTokenizer ->skipDelimiters (WHITESPACE);
663+ status_t status = parseMap ();
664+ if (status) return status;
619665 } else if (keywordToken == " key" ) {
620666 mTokenizer ->skipDelimiters (WHITESPACE);
621667 status_t status = parseKey ();
@@ -710,6 +756,58 @@ status_t KeyCharacterMap::Parser::parseType() {
710756 return NO_ERROR;
711757}
712758
759+ status_t KeyCharacterMap::Parser::parseMap () {
760+ String8 keywordToken = mTokenizer ->nextToken (WHITESPACE);
761+ if (keywordToken == " key" ) {
762+ mTokenizer ->skipDelimiters (WHITESPACE);
763+ return parseMapKey ();
764+ }
765+ ALOGE (" %s: Expected keyword after 'map', got '%s'." , mTokenizer ->getLocation ().string (),
766+ keywordToken.string ());
767+ return BAD_VALUE;
768+ }
769+
770+ status_t KeyCharacterMap::Parser::parseMapKey () {
771+ String8 codeToken = mTokenizer ->nextToken (WHITESPACE);
772+ bool mapUsage = false ;
773+ if (codeToken == " usage" ) {
774+ mapUsage = true ;
775+ mTokenizer ->skipDelimiters (WHITESPACE);
776+ codeToken = mTokenizer ->nextToken (WHITESPACE);
777+ }
778+
779+ char * end;
780+ int32_t code = int32_t (strtol (codeToken.string (), &end, 0 ));
781+ if (*end) {
782+ ALOGE (" %s: Expected key %s number, got '%s'." , mTokenizer ->getLocation ().string (),
783+ mapUsage ? " usage" : " scan code" , codeToken.string ());
784+ return BAD_VALUE;
785+ }
786+ KeyedVector<int32_t , int32_t >& map =
787+ mapUsage ? mMap ->mKeysByUsageCode : mMap ->mKeysByScanCode ;
788+ if (map.indexOfKey (code) >= 0 ) {
789+ ALOGE (" %s: Duplicate entry for key %s '%s'." , mTokenizer ->getLocation ().string (),
790+ mapUsage ? " usage" : " scan code" , codeToken.string ());
791+ return BAD_VALUE;
792+ }
793+
794+ mTokenizer ->skipDelimiters (WHITESPACE);
795+ String8 keyCodeToken = mTokenizer ->nextToken (WHITESPACE);
796+ int32_t keyCode = getKeyCodeByLabel (keyCodeToken.string ());
797+ if (!keyCode) {
798+ ALOGE (" %s: Expected key code label, got '%s'." , mTokenizer ->getLocation ().string (),
799+ keyCodeToken.string ());
800+ return BAD_VALUE;
801+ }
802+
803+ #if DEBUG_PARSER
804+ ALOGD (" Parsed map key %s: code=%d, keyCode=%d." ,
805+ mapUsage ? " usage" : " scan code" , code, keyCode);
806+ #endif
807+ map.add (code, keyCode);
808+ return NO_ERROR;
809+ }
810+
713811status_t KeyCharacterMap::Parser::parseKey () {
714812 String8 keyCodeToken = mTokenizer ->nextToken (WHITESPACE);
715813 int32_t keyCode = getKeyCodeByLabel (keyCodeToken.string ());
0 commit comments