| Index: ui/events/keycodes/dom4/keycode_converter.cc
|
| diff --git a/ui/events/keycodes/dom4/keycode_converter.cc b/ui/events/keycodes/dom4/keycode_converter.cc
|
| index b7958dd0db19e93ed6785f721b16538445170cf6..7b9650fb7082920c9890292cdf057ff82a11f7b2 100644
|
| --- a/ui/events/keycodes/dom4/keycode_converter.cc
|
| +++ b/ui/events/keycodes/dom4/keycode_converter.cc
|
| @@ -4,10 +4,25 @@
|
|
|
| #include "ui/events/keycodes/dom4/keycode_converter.h"
|
|
|
| +#include "base/logging.h"
|
| +
|
| namespace ui {
|
|
|
| namespace {
|
|
|
| +template<typename T>
|
| +struct DomKeyCodeEntry {
|
| + const char *string;
|
| + T enumeration;
|
| +};
|
| +
|
| +#include "ui/events/keycodes/dom4/domcode.h"
|
| +#include "ui/events/keycodes/dom4/domcode_string.h"
|
| +#include "ui/events/keycodes/dom4/domcode_table.h"
|
| +#include "ui/events/keycodes/dom4/domkey.h"
|
| +#include "ui/events/keycodes/dom4/domkey_string.h"
|
| +#include "ui/events/keycodes/dom4/domkey_table.h"
|
| +
|
| #if defined(OS_WIN)
|
| #define USB_KEYMAP(usb, xkb, win, mac, code) {usb, win, code}
|
| #elif defined(OS_LINUX)
|
| @@ -17,9 +32,13 @@ namespace {
|
| #else
|
| #define USB_KEYMAP(usb, xkb, win, mac, code) {usb, 0, code}
|
| #endif
|
| -#include "ui/events/keycodes/dom4/keycode_converter_data.h"
|
| +#include "ui/events/keycodes/dom4/native_code_data.h"
|
|
|
| const size_t kKeycodeMapEntries = arraysize(usb_keycode_map);
|
| +const size_t kDomCodeStringTableEntries = arraysize(dom_code_string);
|
| +const size_t kDomCodeTableEntries = arraysize(dom_code_table);
|
| +const size_t kDomKeyStringTableEntries = arraysize(dom_key_string);
|
| +const size_t kDomKeyTableEntries = arraysize(dom_key_table);
|
|
|
| } // namespace
|
|
|
| @@ -34,43 +53,82 @@ const KeycodeMapEntry* KeycodeConverter::GetKeycodeMapForTest() {
|
| }
|
|
|
| // static
|
| +size_t KeycodeConverter::NumDomCodeStringEntriesForTest() {
|
| + return kDomCodeStringTableEntries;
|
| +}
|
| +
|
| +// static
|
| +const char* const* KeycodeConverter::DomCodeStringTableForTest() {
|
| + return dom_code_string;
|
| +}
|
| +
|
| +// static
|
| +size_t KeycodeConverter::NumDomKeyStringEntriesForTest() {
|
| + return kDomKeyStringTableEntries;
|
| +}
|
| +
|
| +// static
|
| +const char* const* KeycodeConverter::DomKeyStringTableForTest() {
|
| + return dom_key_string;
|
| +}
|
| +
|
| +// static
|
| uint16_t KeycodeConverter::InvalidNativeKeycode() {
|
| return usb_keycode_map[0].native_keycode;
|
| }
|
|
|
| // static
|
| const char* KeycodeConverter::InvalidKeyboardEventCode() {
|
| - return "Unidentified";
|
| + return dom_code_string[static_cast<size_t>(ui::DOM_CODE_UNIDENTIFIED)];
|
| }
|
|
|
| // static
|
| -const char* KeycodeConverter::NativeKeycodeToCode(uint16_t native_keycode) {
|
| - for (size_t i = 0; i < kKeycodeMapEntries; ++i) {
|
| - if (usb_keycode_map[i].native_keycode == native_keycode) {
|
| - if (usb_keycode_map[i].code != NULL)
|
| - return usb_keycode_map[i].code;
|
| - break;
|
| +const char* KeycodeConverter::DomCodeToCodeString(DomCode dom_code) {
|
| + size_t code = static_cast<size_t>(dom_code);
|
| + DCHECK_LT(code, kDomCodeStringTableEntries);
|
| + DCHECK_NE(dom_code_string[code], static_cast<const char*>(nullptr));
|
| + return dom_code_string[code];
|
| +}
|
| +
|
| +// static
|
| +DomCode KeycodeConverter::CodeStringToDomCode(const char* code) {
|
| + if (code) {
|
| + for (size_t i = 0; i < kDomCodeTableEntries; ++i) {
|
| + if (strcmp(code, dom_code_table[i].string) == 0)
|
| + return dom_code_table[i].enumeration;
|
| }
|
| }
|
| - return InvalidKeyboardEventCode();
|
| + return DOM_CODE_NONE;
|
| }
|
|
|
| // static
|
| -uint16_t KeycodeConverter::CodeToNativeKeycode(const char* code) {
|
| - if (!code ||
|
| - strcmp(code, InvalidKeyboardEventCode()) == 0) {
|
| - return InvalidNativeKeycode();
|
| +DomCode KeycodeConverter::NativeKeycodeToDomCode(uint16_t native_keycode) {
|
| + for (size_t i = 0; i < kKeycodeMapEntries; ++i) {
|
| + if (usb_keycode_map[i].native_keycode == native_keycode)
|
| + return usb_keycode_map[i].code;
|
| }
|
| + return DOM_CODE_NONE;
|
| +}
|
|
|
| +// static
|
| +uint16_t KeycodeConverter::DomCodeToNativeKeycode(DomCode code) {
|
| for (size_t i = 0; i < kKeycodeMapEntries; ++i) {
|
| - if (usb_keycode_map[i].code &&
|
| - strcmp(usb_keycode_map[i].code, code) == 0) {
|
| + if (usb_keycode_map[i].code == code)
|
| return usb_keycode_map[i].native_keycode;
|
| - }
|
| }
|
| return InvalidNativeKeycode();
|
| }
|
|
|
| +// static
|
| +const char* KeycodeConverter::NativeKeycodeToCode(uint16_t native_keycode) {
|
| + return DomCodeToCodeString(NativeKeycodeToDomCode(native_keycode));
|
| +}
|
| +
|
| +// static
|
| +uint16_t KeycodeConverter::CodeToNativeKeycode(const char* code_string) {
|
| + return DomCodeToNativeKeycode(CodeStringToDomCode(code_string));
|
| +}
|
| +
|
| // USB keycodes
|
| // Note that USB keycodes are not part of any web standard.
|
| // Please don't use USB keycodes in new code.
|
| @@ -110,25 +168,39 @@ uint32_t KeycodeConverter::NativeKeycodeToUsbKeycode(uint16_t native_keycode) {
|
| const char* KeycodeConverter::UsbKeycodeToCode(uint32_t usb_keycode) {
|
| for (size_t i = 0; i < kKeycodeMapEntries; ++i) {
|
| if (usb_keycode_map[i].usb_keycode == usb_keycode)
|
| - return usb_keycode_map[i].code;
|
| + return DomCodeToCodeString(usb_keycode_map[i].code);
|
| }
|
| return InvalidKeyboardEventCode();
|
| }
|
|
|
| // static
|
| -uint32_t KeycodeConverter::CodeToUsbKeycode(const char* code) {
|
| - if (!code ||
|
| - strcmp(code, InvalidKeyboardEventCode()) == 0) {
|
| - return InvalidUsbKeycode();
|
| - }
|
| -
|
| +uint32_t KeycodeConverter::CodeToUsbKeycode(const char* code_string) {
|
| + DomCode code = CodeStringToDomCode(code_string);
|
| for (size_t i = 0; i < kKeycodeMapEntries; ++i) {
|
| - if (usb_keycode_map[i].code &&
|
| - strcmp(usb_keycode_map[i].code, code) == 0) {
|
| + if (usb_keycode_map[i].code == code) {
|
| return usb_keycode_map[i].usb_keycode;
|
| }
|
| }
|
| return InvalidUsbKeycode();
|
| }
|
|
|
| +// static
|
| +const char* KeycodeConverter::DomKeyToKeyString(DomKey dom_key) {
|
| + size_t key = static_cast<size_t>(dom_key);
|
| + DCHECK_LT(key, kDomKeyStringTableEntries);
|
| + DCHECK_NE(dom_key_string[key], static_cast<const char*>(nullptr));
|
| + return dom_key_string[key];
|
| +}
|
| +
|
| +// static
|
| +DomKey KeycodeConverter::KeyStringToDomKey(const char* key) {
|
| + if (key) {
|
| + for (size_t i = 0; i < kDomKeyTableEntries; ++i) {
|
| + if (strcmp(key, dom_key_table[i].string) == 0)
|
| + return dom_key_table[i].enumeration;
|
| + }
|
| + }
|
| + return DOM_KEY_NONE;
|
| +}
|
| +
|
| } // namespace ui
|
|
|