diff --git a/headers/private/shared/Keymap.h b/headers/private/shared/Keymap.h index 8b95913df5..37d9060409 100644 --- a/headers/private/shared/Keymap.h +++ b/headers/private/shared/Keymap.h @@ -14,6 +14,8 @@ #include +class BList; + class BKeymap { public: BKeymap(); @@ -38,6 +40,9 @@ public: void GetChars(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, char** chars, int32* numBytes) const; + status_t GetModifiedCharacters(const char* normal, + int32 modifiers, + BList* _modifiedCharacters); const key_map& Map() const { return fKeys; } diff --git a/src/kits/shared/Keymap.cpp b/src/kits/shared/Keymap.cpp index 9ffe977b00..1aab46b61b 100644 --- a/src/kits/shared/Keymap.cpp +++ b/src/kits/shared/Keymap.cpp @@ -19,6 +19,7 @@ #include #include +#include #ifdef HAIKU_TARGET_PLATFORM_HAIKU # include "SystemKeymap.h" @@ -441,6 +442,60 @@ BKeymap::GetChars(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, } +status_t +BKeymap::GetModifiedCharacters(const char* normal, int32 modifiers, + BList* _modifiedCharacters) +{ + if (normal == NULL || strcmp(normal, "") == 0 + || _modifiedCharacters == NULL) { + return B_BAD_VALUE; + } + + int32 normalOffset; + int32 modifiedOffset; + + for(uint32 i = 0; i < 128; i++) { + normalOffset = fKeys.normal_map[i]; + size_t sizeNormal = fChars[normalOffset++]; + if (sizeNormal == 0 + || memcmp(normal, fChars + normalOffset, sizeNormal) != 0) { + // this character isn't mapped or doesn't match + continue; + } + + if (modifiers == B_SHIFT_KEY) + modifiedOffset = fKeys.shift_map[i]; + else if (modifiers == B_CONTROL_KEY) + modifiedOffset = fKeys.control_map[i]; + else if (modifiers == B_OPTION_KEY) + modifiedOffset = fKeys.option_map[i]; + else if (modifiers == (B_OPTION_KEY | B_SHIFT_KEY)) + modifiedOffset = fKeys.option_shift_map[i]; + else if (modifiers == B_CAPS_LOCK) + modifiedOffset = fKeys.caps_map[i]; + else if (modifiers == (B_CAPS_LOCK | B_SHIFT_KEY)) + modifiedOffset = fKeys.caps_shift_map[i]; + else if (modifiers == (B_OPTION_KEY | B_CAPS_LOCK)) + modifiedOffset = fKeys.option_caps_map[i]; + else if (modifiers == (B_OPTION_KEY | B_CAPS_LOCK | B_SHIFT_KEY)) + modifiedOffset = fKeys.option_caps_shift_map[i]; + else + return B_BAD_VALUE; + + size_t sizeModified = fChars[modifiedOffset++]; + char* modified = (char*)malloc(sizeModified + 1); + if (modified == NULL) + return B_NO_MEMORY; + + memcpy(modified, fChars + modifiedOffset, sizeModified); + modified[sizeModified] = '\0'; + _modifiedCharacters->AddItem(modified); + } + + return B_OK; +} + + bool BKeymap::operator==(const BKeymap& other) const {