diff options
42 files changed, 1778 insertions, 2650 deletions
diff --git a/chrome/browser/chromeos/events/event_rewriter.cc b/chrome/browser/chromeos/events/event_rewriter.cc index 69c2cfc..7f6bf10 100644 --- a/chrome/browser/chromeos/events/event_rewriter.cc +++ b/chrome/browser/chromeos/events/event_rewriter.cc @@ -81,60 +81,40 @@ const struct ModifierRemapping { ui::EF_CONTROL_DOWN, input_method::kControlKey, prefs::kLanguageRemapControlKeyTo, - {ui::EF_CONTROL_DOWN, - ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, - 0, + {ui::EF_CONTROL_DOWN, ui::DomCode::CONTROL_LEFT, ui::DomKey::CONTROL, ui::VKEY_CONTROL}}, {// kModifierRemappingNeoMod3 references this entry by index. ui::EF_MOD3_DOWN | ui::EF_ALTGR_DOWN, input_method::kNumModifierKeys, nullptr, - {ui::EF_MOD3_DOWN | ui::EF_ALTGR_DOWN, - ui::DomCode::CAPS_LOCK, - ui::DomKey::ALT_GRAPH, - 0, - ui::VKEY_ALTGR}}, + {ui::EF_MOD3_DOWN | ui::EF_ALTGR_DOWN, ui::DomCode::CAPS_LOCK, + ui::DomKey::ALT_GRAPH, ui::VKEY_ALTGR}}, {ui::EF_COMMAND_DOWN, input_method::kSearchKey, prefs::kLanguageRemapSearchKeyTo, - {ui::EF_COMMAND_DOWN, - ui::DomCode::OS_LEFT, - ui::DomKey::OS, - 0, + {ui::EF_COMMAND_DOWN, ui::DomCode::OS_LEFT, ui::DomKey::OS, ui::VKEY_LWIN}}, {ui::EF_ALT_DOWN, input_method::kAltKey, prefs::kLanguageRemapAltKeyTo, - {ui::EF_ALT_DOWN, - ui::DomCode::ALT_LEFT, - ui::DomKey::ALT, - 0, - ui::VKEY_MENU}}, + {ui::EF_ALT_DOWN, ui::DomCode::ALT_LEFT, ui::DomKey::ALT, ui::VKEY_MENU}}, {ui::EF_NONE, input_method::kVoidKey, nullptr, - {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::NONE, 0, ui::VKEY_UNKNOWN}}, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::NONE, ui::VKEY_UNKNOWN}}, {ui::EF_MOD3_DOWN, input_method::kCapsLockKey, prefs::kLanguageRemapCapsLockKeyTo, - {ui::EF_MOD3_DOWN, - ui::DomCode::CAPS_LOCK, - ui::DomKey::CAPS_LOCK, - 0, + {ui::EF_MOD3_DOWN, ui::DomCode::CAPS_LOCK, ui::DomKey::CAPS_LOCK, ui::VKEY_CAPITAL}}, {ui::EF_NONE, input_method::kEscapeKey, nullptr, - {ui::EF_NONE, - ui::DomCode::ESCAPE, - ui::DomKey::ESCAPE, - 0, - ui::VKEY_ESCAPE}}, + {ui::EF_NONE, ui::DomCode::ESCAPE, ui::DomKey::ESCAPE, ui::VKEY_ESCAPE}}, {ui::EF_NONE, input_method::kNumModifierKeys, prefs::kLanguageRemapDiamondKeyTo, - {ui::EF_NONE, ui::DomCode::F15, ui::DomKey::F15, 0, ui::VKEY_F15}}}; + {ui::EF_NONE, ui::DomCode::F15, ui::DomKey::F15, ui::VKEY_F15}}}; const ModifierRemapping* kModifierRemappingCtrl = &kModifierRemappings[0]; const ModifierRemapping* kModifierRemappingNeoMod3 = &kModifierRemappings[1]; @@ -250,10 +230,8 @@ void ApplyRemapping(const EventRewriter::MutableKeyState& changes, state->flags |= changes.flags; if (changes.code != ui::DomCode::NONE) state->code = changes.code; - if (changes.key != ui::DomKey::NONE) { + if (changes.key != ui::DomKey::NONE) state->key = changes.key; - state->character = changes.character; - } if (changes.key_code != ui::VKEY_UNKNOWN) state->key_code = changes.key_code; } @@ -283,7 +261,6 @@ void SetMeaningForLayout(ui::EventType type, // current physical state, and extracting the layout results. ui::KeyEvent key(type, state->key_code, state->code, state->flags); state->key = key.GetDomKey(); - state->character = key.GetCharacter(); } ui::DomCode RelocateModifier(ui::DomCode code, ui::DomKeyLocation location) { @@ -319,8 +296,7 @@ EventRewriter::EventRewriter(ash::StickyKeysController* sticky_keys_controller) latched_modifier_latches_(ui::EF_NONE), used_modifier_latches_(ui::EF_NONE) {} -EventRewriter::~EventRewriter() { -} +EventRewriter::~EventRewriter() {} EventRewriter::DeviceType EventRewriter::KeyboardDeviceAddedForTesting( int device_id, @@ -385,9 +361,9 @@ void EventRewriter::BuildRewrittenKeyEvent( const ui::KeyEvent& key_event, const MutableKeyState& state, scoped_ptr<ui::Event>* rewritten_event) { - ui::KeyEvent* rewritten_key_event = new ui::KeyEvent( - key_event.type(), state.key_code, state.code, state.flags, state.key, - state.character, key_event.time_stamp()); + ui::KeyEvent* rewritten_key_event = + new ui::KeyEvent(key_event.type(), state.key_code, state.code, + state.flags, state.key, key_event.time_stamp()); rewritten_event->reset(rewritten_key_event); } @@ -516,11 +492,8 @@ ui::EventRewriteStatus EventRewriter::RewriteKeyEvent( return ui::EVENT_REWRITE_DISCARD; } - MutableKeyState state = {key_event.flags(), - key_event.code(), - key_event.GetDomKey(), - key_event.GetCharacter(), - key_event.key_code()}; + MutableKeyState state = {key_event.flags(), key_event.code(), + key_event.GetDomKey(), key_event.key_code()}; // Do not rewrite an event sent by ui_controls::SendKeyPress(). See // crbug.com/136465. @@ -808,7 +781,6 @@ bool EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event, state->key_code = remapped_key->result.key_code; state->code = remapped_key->result.code; state->key = remapped_key->result.key; - state->character = remapped_key->result.character; incoming.flags |= characteristic_flag; characteristic_flag = remapped_key->flag; state->code = RelocateModifier( @@ -855,72 +827,40 @@ void EventRewriter::RewriteNumPadKeys(const ui::KeyEvent& key_event, static const struct NumPadRemapping { ui::KeyboardCode input_key_code; EventRewriter::MutableKeyState result; - } kNumPadRemappings[] = {{ui::VKEY_DELETE, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '.', - ui::VKEY_DECIMAL}}, - {ui::VKEY_INSERT, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '0', - ui::VKEY_NUMPAD0}}, - {ui::VKEY_END, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '1', - ui::VKEY_NUMPAD1}}, - {ui::VKEY_DOWN, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '2', - ui::VKEY_NUMPAD2}}, - {ui::VKEY_NEXT, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '3', - ui::VKEY_NUMPAD3}}, - {ui::VKEY_LEFT, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '4', - ui::VKEY_NUMPAD4}}, - {ui::VKEY_CLEAR, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '5', - ui::VKEY_NUMPAD5}}, - {ui::VKEY_RIGHT, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '6', - ui::VKEY_NUMPAD6}}, - {ui::VKEY_HOME, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '7', - ui::VKEY_NUMPAD7}}, - {ui::VKEY_UP, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '8', - ui::VKEY_NUMPAD8}}, - {ui::VKEY_PRIOR, - {ui::EF_NONE, - ui::DomCode::NONE, - ui::DomKey::CHARACTER, - '9', - ui::VKEY_NUMPAD9}}}; + } kNumPadRemappings[] = { + {ui::VKEY_DELETE, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'.'>::Character, + ui::VKEY_DECIMAL}}, + {ui::VKEY_INSERT, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'0'>::Character, + ui::VKEY_NUMPAD0}}, + {ui::VKEY_END, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'1'>::Character, + ui::VKEY_NUMPAD1}}, + {ui::VKEY_DOWN, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'2'>::Character, + ui::VKEY_NUMPAD2}}, + {ui::VKEY_NEXT, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'3'>::Character, + ui::VKEY_NUMPAD3}}, + {ui::VKEY_LEFT, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'4'>::Character, + ui::VKEY_NUMPAD4}}, + {ui::VKEY_CLEAR, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'5'>::Character, + ui::VKEY_NUMPAD5}}, + {ui::VKEY_RIGHT, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'6'>::Character, + ui::VKEY_NUMPAD6}}, + {ui::VKEY_HOME, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'7'>::Character, + ui::VKEY_NUMPAD7}}, + {ui::VKEY_UP, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'8'>::Character, + ui::VKEY_NUMPAD8}}, + {ui::VKEY_PRIOR, + {ui::EF_NONE, ui::DomCode::NONE, ui::DomKey::Constant<'9'>::Character, + ui::VKEY_NUMPAD9}}}; for (const auto& map : kNumPadRemappings) { if (state->key_code == map.input_key_code) { if (ui::KeycodeConverter::DomCodeToLocation(state->code) == @@ -944,20 +884,17 @@ void EventRewriter::RewriteExtendedKeys(const ui::KeyEvent& key_event, // For these, we only remove the EF_COMMAND_DOWN flag. static const KeyboardRemapping::Condition kAvoidRemappings[] = { {// Alt+Backspace - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::VKEY_BACK}, + ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::VKEY_BACK}, {// Control+Alt+Up ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN, ui::VKEY_UP}, {// Alt+Up - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::VKEY_UP}, + ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::VKEY_UP}, {// Control+Alt+Down ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN, ui::VKEY_DOWN}, {// Alt+Down - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::VKEY_DOWN}}; + ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::VKEY_DOWN}}; for (const auto& condition : kAvoidRemappings) { if (MatchKeyboardRemapping(*state, condition)) { state->flags = incoming.flags & ~ui::EF_COMMAND_DOWN; @@ -970,37 +907,24 @@ void EventRewriter::RewriteExtendedKeys(const ui::KeyEvent& key_event, static const KeyboardRemapping kSearchRemappings[] = { {// Search+BackSpace -> Delete {ui::EF_COMMAND_DOWN, ui::VKEY_BACK}, - {ui::EF_NONE, - ui::DomCode::DEL, - ui::DomKey::DEL, - 0x7F, - ui::VKEY_DELETE}}, + {ui::EF_NONE, ui::DomCode::DEL, ui::DomKey::DEL, ui::VKEY_DELETE}}, {// Search+Left -> Home {ui::EF_COMMAND_DOWN, ui::VKEY_LEFT}, - {ui::EF_NONE, ui::DomCode::HOME, ui::DomKey::HOME, 0, ui::VKEY_HOME}}, + {ui::EF_NONE, ui::DomCode::HOME, ui::DomKey::HOME, ui::VKEY_HOME}}, {// Search+Up -> Prior (aka PageUp) {ui::EF_COMMAND_DOWN, ui::VKEY_UP}, - {ui::EF_NONE, - ui::DomCode::PAGE_UP, - ui::DomKey::PAGE_UP, - 0, + {ui::EF_NONE, ui::DomCode::PAGE_UP, ui::DomKey::PAGE_UP, ui::VKEY_PRIOR}}, {// Search+Right -> End {ui::EF_COMMAND_DOWN, ui::VKEY_RIGHT}, - {ui::EF_NONE, ui::DomCode::END, ui::DomKey::END, 0, ui::VKEY_END}}, + {ui::EF_NONE, ui::DomCode::END, ui::DomKey::END, ui::VKEY_END}}, {// Search+Down -> Next (aka PageDown) {ui::EF_COMMAND_DOWN, ui::VKEY_DOWN}, - {ui::EF_NONE, - ui::DomCode::PAGE_DOWN, - ui::DomKey::PAGE_DOWN, - 0, + {ui::EF_NONE, ui::DomCode::PAGE_DOWN, ui::DomKey::PAGE_DOWN, ui::VKEY_NEXT}}, {// Search+Period -> Insert {ui::EF_COMMAND_DOWN, ui::VKEY_OEM_PERIOD}, - {ui::EF_NONE, - ui::DomCode::INSERT, - ui::DomKey::INSERT, - 0, + {ui::EF_NONE, ui::DomCode::INSERT, ui::DomKey::INSERT, ui::VKEY_INSERT}}}; if (RewriteWithKeyboardRemappings( kSearchRemappings, arraysize(kSearchRemappings), incoming, state)) { @@ -1012,30 +936,20 @@ void EventRewriter::RewriteExtendedKeys(const ui::KeyEvent& key_event, static const KeyboardRemapping kNonSearchRemappings[] = { {// Alt+BackSpace -> Delete {ui::EF_ALT_DOWN, ui::VKEY_BACK}, - {ui::EF_NONE, - ui::DomCode::DEL, - ui::DomKey::DEL, - 0x7F, - ui::VKEY_DELETE}}, + {ui::EF_NONE, ui::DomCode::DEL, ui::DomKey::DEL, ui::VKEY_DELETE}}, {// Control+Alt+Up -> Home {ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::VKEY_UP}, - {ui::EF_NONE, ui::DomCode::HOME, ui::DomKey::HOME, 0, ui::VKEY_HOME}}, + {ui::EF_NONE, ui::DomCode::HOME, ui::DomKey::HOME, ui::VKEY_HOME}}, {// Alt+Up -> Prior (aka PageUp) {ui::EF_ALT_DOWN, ui::VKEY_UP}, - {ui::EF_NONE, - ui::DomCode::PAGE_UP, - ui::DomKey::PAGE_UP, - 0, + {ui::EF_NONE, ui::DomCode::PAGE_UP, ui::DomKey::PAGE_UP, ui::VKEY_PRIOR}}, {// Control+Alt+Down -> End {ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::VKEY_DOWN}, - {ui::EF_NONE, ui::DomCode::END, ui::DomKey::END, 0, ui::VKEY_END}}, + {ui::EF_NONE, ui::DomCode::END, ui::DomKey::END, ui::VKEY_END}}, {// Alt+Down -> Next (aka PageDown) {ui::EF_ALT_DOWN, ui::VKEY_DOWN}, - {ui::EF_NONE, - ui::DomCode::PAGE_DOWN, - ui::DomKey::PAGE_DOWN, - 0, + {ui::EF_NONE, ui::DomCode::PAGE_DOWN, ui::DomKey::PAGE_DOWN, ui::VKEY_NEXT}}}; if (RewriteWithKeyboardRemappings(kNonSearchRemappings, arraysize(kNonSearchRemappings), incoming, @@ -1067,64 +981,34 @@ void EventRewriter::RewriteFunctionKeys(const ui::KeyEvent& key_event, // Rewrite the F1-F12 keys on a Chromebook keyboard to system keys. static const KeyboardRemapping kFkeysToSystemKeys[] = { {{ui::EF_NONE, ui::VKEY_F1}, - {ui::EF_NONE, - ui::DomCode::BROWSER_BACK, - ui::DomKey::BROWSER_BACK, - 0, + {ui::EF_NONE, ui::DomCode::BROWSER_BACK, ui::DomKey::BROWSER_BACK, ui::VKEY_BROWSER_BACK}}, {{ui::EF_NONE, ui::VKEY_F2}, - {ui::EF_NONE, - ui::DomCode::BROWSER_FORWARD, - ui::DomKey::BROWSER_FORWARD, - 0, - ui::VKEY_BROWSER_FORWARD}}, + {ui::EF_NONE, ui::DomCode::BROWSER_FORWARD, + ui::DomKey::BROWSER_FORWARD, ui::VKEY_BROWSER_FORWARD}}, {{ui::EF_NONE, ui::VKEY_F3}, - {ui::EF_NONE, - ui::DomCode::BROWSER_REFRESH, - ui::DomKey::BROWSER_REFRESH, - 0, - ui::VKEY_BROWSER_REFRESH}}, + {ui::EF_NONE, ui::DomCode::BROWSER_REFRESH, + ui::DomKey::BROWSER_REFRESH, ui::VKEY_BROWSER_REFRESH}}, {{ui::EF_NONE, ui::VKEY_F4}, - {ui::EF_NONE, - ui::DomCode::ZOOM_TOGGLE, - ui::DomKey::ZOOM_TOGGLE, - 0, + {ui::EF_NONE, ui::DomCode::ZOOM_TOGGLE, ui::DomKey::ZOOM_TOGGLE, ui::VKEY_MEDIA_LAUNCH_APP2}}, {{ui::EF_NONE, ui::VKEY_F5}, - {ui::EF_NONE, - ui::DomCode::SELECT_TASK, - ui::DomKey::LAUNCH_MY_COMPUTER, - 0, - ui::VKEY_MEDIA_LAUNCH_APP1}}, + {ui::EF_NONE, ui::DomCode::SELECT_TASK, + ui::DomKey::LAUNCH_MY_COMPUTER, ui::VKEY_MEDIA_LAUNCH_APP1}}, {{ui::EF_NONE, ui::VKEY_F6}, - {ui::EF_NONE, - ui::DomCode::BRIGHTNESS_DOWN, - ui::DomKey::BRIGHTNESS_DOWN, - 0, - ui::VKEY_BRIGHTNESS_DOWN}}, + {ui::EF_NONE, ui::DomCode::BRIGHTNESS_DOWN, + ui::DomKey::BRIGHTNESS_DOWN, ui::VKEY_BRIGHTNESS_DOWN}}, {{ui::EF_NONE, ui::VKEY_F7}, - {ui::EF_NONE, - ui::DomCode::BRIGHTNESS_UP, - ui::DomKey::BRIGHTNESS_UP, - 0, + {ui::EF_NONE, ui::DomCode::BRIGHTNESS_UP, ui::DomKey::BRIGHTNESS_UP, ui::VKEY_BRIGHTNESS_UP}}, {{ui::EF_NONE, ui::VKEY_F8}, - {ui::EF_NONE, - ui::DomCode::VOLUME_MUTE, - ui::DomKey::VOLUME_MUTE, - 0, + {ui::EF_NONE, ui::DomCode::VOLUME_MUTE, ui::DomKey::VOLUME_MUTE, ui::VKEY_VOLUME_MUTE}}, {{ui::EF_NONE, ui::VKEY_F9}, - {ui::EF_NONE, - ui::DomCode::VOLUME_DOWN, - ui::DomKey::VOLUME_DOWN, - 0, + {ui::EF_NONE, ui::DomCode::VOLUME_DOWN, ui::DomKey::VOLUME_DOWN, ui::VKEY_VOLUME_DOWN}}, {{ui::EF_NONE, ui::VKEY_F10}, - {ui::EF_NONE, - ui::DomCode::VOLUME_UP, - ui::DomKey::VOLUME_UP, - 0, + {ui::EF_NONE, ui::DomCode::VOLUME_UP, ui::DomKey::VOLUME_UP, ui::VKEY_VOLUME_UP}}, }; MutableKeyState incoming_without_command = *state; @@ -1150,29 +1034,29 @@ void EventRewriter::RewriteFunctionKeys(const ui::KeyEvent& key_event, EventRewriter::MutableKeyState result; } kNumberKeysToFkeys[] = { {ui::DomCode::DIGIT1, - {ui::EF_NONE, ui::DomCode::F1, ui::DomKey::F1, 0, ui::VKEY_F1}}, + {ui::EF_NONE, ui::DomCode::F1, ui::DomKey::F1, ui::VKEY_F1}}, {ui::DomCode::DIGIT2, - {ui::EF_NONE, ui::DomCode::F2, ui::DomKey::F2, 0, ui::VKEY_F2}}, + {ui::EF_NONE, ui::DomCode::F2, ui::DomKey::F2, ui::VKEY_F2}}, {ui::DomCode::DIGIT3, - {ui::EF_NONE, ui::DomCode::F3, ui::DomKey::F3, 0, ui::VKEY_F3}}, + {ui::EF_NONE, ui::DomCode::F3, ui::DomKey::F3, ui::VKEY_F3}}, {ui::DomCode::DIGIT4, - {ui::EF_NONE, ui::DomCode::F4, ui::DomKey::F4, 0, ui::VKEY_F4}}, + {ui::EF_NONE, ui::DomCode::F4, ui::DomKey::F4, ui::VKEY_F4}}, {ui::DomCode::DIGIT5, - {ui::EF_NONE, ui::DomCode::F5, ui::DomKey::F5, 0, ui::VKEY_F5}}, + {ui::EF_NONE, ui::DomCode::F5, ui::DomKey::F5, ui::VKEY_F5}}, {ui::DomCode::DIGIT6, - {ui::EF_NONE, ui::DomCode::F6, ui::DomKey::F6, 0, ui::VKEY_F6}}, + {ui::EF_NONE, ui::DomCode::F6, ui::DomKey::F6, ui::VKEY_F6}}, {ui::DomCode::DIGIT7, - {ui::EF_NONE, ui::DomCode::F7, ui::DomKey::F7, 0, ui::VKEY_F7}}, + {ui::EF_NONE, ui::DomCode::F7, ui::DomKey::F7, ui::VKEY_F7}}, {ui::DomCode::DIGIT8, - {ui::EF_NONE, ui::DomCode::F8, ui::DomKey::F8, 0, ui::VKEY_F8}}, + {ui::EF_NONE, ui::DomCode::F8, ui::DomKey::F8, ui::VKEY_F8}}, {ui::DomCode::DIGIT9, - {ui::EF_NONE, ui::DomCode::F9, ui::DomKey::F9, 0, ui::VKEY_F9}}, + {ui::EF_NONE, ui::DomCode::F9, ui::DomKey::F9, ui::VKEY_F9}}, {ui::DomCode::DIGIT0, - {ui::EF_NONE, ui::DomCode::F10, ui::DomKey::F10, 0, ui::VKEY_F10}}, + {ui::EF_NONE, ui::DomCode::F10, ui::DomKey::F10, ui::VKEY_F10}}, {ui::DomCode::MINUS, - {ui::EF_NONE, ui::DomCode::F11, ui::DomKey::F11, 0, ui::VKEY_F11}}, + {ui::EF_NONE, ui::DomCode::F11, ui::DomKey::F11, ui::VKEY_F11}}, {ui::DomCode::EQUAL, - {ui::EF_NONE, ui::DomCode::F12, ui::DomKey::F12, 0, ui::VKEY_F12}}}; + {ui::EF_NONE, ui::DomCode::F12, ui::DomKey::F12, ui::VKEY_F12}}}; for (const auto& map : kNumberKeysToFkeys) { if (state->code == map.input_dom_code) { state->flags &= ~ui::EF_COMMAND_DOWN; diff --git a/chrome/browser/chromeos/events/event_rewriter.h b/chrome/browser/chromeos/events/event_rewriter.h index 1c3f01a..8235279 100644 --- a/chrome/browser/chromeos/events/event_rewriter.h +++ b/chrome/browser/chromeos/events/event_rewriter.h @@ -14,6 +14,7 @@ #include "base/memory/scoped_ptr.h" #include "ui/events/event.h" #include "ui/events/event_rewriter.h" +#include "ui/events/keycodes/dom/dom_key.h" class PrefService; @@ -23,7 +24,6 @@ class StickyKeysController; namespace ui { enum class DomCode; -enum class DomKey; }; namespace chromeos { @@ -54,8 +54,7 @@ class EventRewriter : public ui::EventRewriter { struct MutableKeyState { int flags; ui::DomCode code; - ui::DomKey key; - base::char16 character; + ui::DomKey::Base key; ui::KeyboardCode key_code; }; diff --git a/chrome/browser/chromeos/events/event_rewriter_unittest.cc b/chrome/browser/chromeos/events/event_rewriter_unittest.cc index 23e06aa..7b5b2b4 100644 --- a/chrome/browser/chromeos/events/event_rewriter_unittest.cc +++ b/chrome/browser/chromeos/events/event_rewriter_unittest.cc @@ -57,18 +57,17 @@ std::string GetExpectedResultAsString(ui::EventType ui_type, ui::KeyboardCode ui_keycode, ui::DomCode code, int ui_flags, // ui::EventFlags - ui::DomKey key, - base::char16 character) { + ui::DomKey key) { return base::StringPrintf( - "type=%d code=0x%06X flags=0x%X vk=0x%02X key=0x%03X c=0x%02X", ui_type, + "type=%d code=0x%06X flags=0x%X vk=0x%02X key=0x%08X", ui_type, static_cast<unsigned int>(code), ui_flags & ~ui::EF_IS_REPEAT, ui_keycode, - static_cast<unsigned int>(key), character); + static_cast<unsigned int>(key)); } std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) { - return GetExpectedResultAsString( - keyevent.type(), keyevent.key_code(), keyevent.code(), keyevent.flags(), - keyevent.GetDomKey(), keyevent.GetCharacter()); + return GetExpectedResultAsString(keyevent.type(), keyevent.key_code(), + keyevent.code(), keyevent.flags(), + keyevent.GetDomKey()); } std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter, @@ -76,9 +75,8 @@ std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter, ui::KeyboardCode ui_keycode, ui::DomCode code, int ui_flags, // ui::EventFlags - ui::DomKey key, - base::char16 character) { - const ui::KeyEvent event(ui_type, ui_keycode, code, ui_flags, key, character, + ui::DomKey key) { + const ui::KeyEvent event(ui_type, ui_keycode, code, ui_flags, key, ui::EventTimeForNow()); scoped_ptr<ui::Event> new_event; rewriter->RewriteEvent(event, &new_event); @@ -95,15 +93,14 @@ struct KeyTestCase { ui::KeyboardCode key_code; ui::DomCode code; int flags; // ui::EventFlags - ui::DomKey key; - base::char16 character; + ui::DomKey::Base key; } input, expected; }; std::string GetTestCaseAsString(ui::EventType ui_type, const KeyTestCase::Event& test) { return GetExpectedResultAsString(ui_type, test.key_code, test.code, - test.flags, test.key, test.character); + test.flags, test.key); } // Tests a single stateless key rewrite operation. @@ -111,10 +108,9 @@ void CheckKeyTestCase(chromeos::EventRewriter* rewriter, const KeyTestCase& test) { SCOPED_TRACE("\nSource: " + GetTestCaseAsString(test.type, test.input)); std::string expected = GetTestCaseAsString(test.type, test.expected); - EXPECT_EQ(expected, - GetRewrittenEventAsString(rewriter, test.type, test.input.key_code, - test.input.code, test.input.flags, - test.input.key, test.input.character)); + EXPECT_EQ(expected, GetRewrittenEventAsString( + rewriter, test.type, test.input.key_code, + test.input.code, test.input.flags, test.input.key)); } } // namespace @@ -173,68 +169,38 @@ TEST_F(EventRewriterTest, TestRewriteCommandToControl) { KeyTestCase pc_keyboard_tests[] = { // VKEY_A, Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN, + ui::DomKey::UNIDENTIFIED}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN, + ui::DomKey::UNIDENTIFIED}}, // VKEY_A, Win modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_COMMAND_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_COMMAND_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_COMMAND_DOWN, + ui::DomKey::UNIDENTIFIED}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_COMMAND_DOWN, + ui::DomKey::UNIDENTIFIED}}, // VKEY_A, Alt+Win modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, + ui::DomKey::UNIDENTIFIED}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, + ui::DomKey::UNIDENTIFIED}}, // VKEY_LWIN (left Windows key), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, + ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, + ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS}}, // VKEY_RWIN (right Windows key), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_RWIN, - ui::DomCode::OS_RIGHT, - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_RWIN, - ui::DomCode::OS_RIGHT, - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}}, + {ui::VKEY_RWIN, ui::DomCode::OS_RIGHT, + ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS}, + {ui::VKEY_RWIN, ui::DomCode::OS_RIGHT, + ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS}}, }; for (const auto& test : pc_keyboard_tests) { @@ -248,68 +214,38 @@ TEST_F(EventRewriterTest, TestRewriteCommandToControl) { KeyTestCase apple_keyboard_tests[] = { // VKEY_A, Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN, + ui::DomKey::UNIDENTIFIED}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN, + ui::DomKey::UNIDENTIFIED}}, // VKEY_A, Win modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_COMMAND_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, - 0x01}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_COMMAND_DOWN, + ui::DomKey::UNIDENTIFIED}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN, + ui::DomKey::Constant<0x01>::Character}}, // VKEY_A, Alt+Win modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, - 0x01}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, + ui::DomKey::UNIDENTIFIED}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, + ui::DomKey::Constant<0x01>::Character}}, // VKEY_LWIN (left Windows key), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, + ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::OS}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, + ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}}, // VKEY_RWIN (right Windows key), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_RWIN, - ui::DomCode::OS_RIGHT, - ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_RIGHT, - ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_RWIN, ui::DomCode::OS_RIGHT, + ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::OS}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT, + ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}}, }; for (const auto& test : apple_keyboard_tests) { @@ -334,16 +270,10 @@ TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { KeyTestCase pc_keyboard_tests[] = { // Control should be remapped to Alt. {ui::ET_KEY_PRESSED, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, + ui::DomKey::ALT}}, }; for (const auto& test : pc_keyboard_tests) { @@ -358,30 +288,18 @@ TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { // VKEY_LWIN (left Command key) with Alt modifier. The remapped Command // key should never be re-remapped to Alt. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, + ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::OS}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, + ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}}, // VKEY_RWIN (right Command key) with Alt modifier. The remapped Command // key should never be re-remapped to Alt. {ui::ET_KEY_PRESSED, - {ui::VKEY_RWIN, - ui::DomCode::OS_RIGHT, - ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_RIGHT, - ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_RWIN, ui::DomCode::OS_RIGHT, + ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::OS}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT, + ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}}, }; for (const auto& test : apple_keyboard_tests) { @@ -399,307 +317,166 @@ void EventRewriterTest::TestRewriteNumPadKeys() { KeyTestCase tests[] = { // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_INSERT, - ui::DomCode::NUMPAD0, - ui::EF_NONE, - ui::DomKey::INSERT, - 0}, - {ui::VKEY_NUMPAD0, - ui::DomCode::NUMPAD0, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '0'}}, + {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_NONE, ui::DomKey::INSERT}, + {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE, + ui::DomKey::Constant<'0'>::Character}}, // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_INSERT, - ui::DomCode::NUMPAD0, - ui::EF_ALT_DOWN, - ui::DomKey::INSERT, - 0}, - {ui::VKEY_NUMPAD0, - ui::DomCode::NUMPAD0, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '0'}}, + {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN, + ui::DomKey::INSERT}, + {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'0'>::Character}}, // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_DELETE, - ui::DomCode::NUMPAD_DECIMAL, - ui::EF_ALT_DOWN, - ui::DomKey::DEL, - 0x7F}, - {ui::VKEY_DECIMAL, - ui::DomCode::NUMPAD_DECIMAL, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '.'}}, + {ui::VKEY_DELETE, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN, + ui::DomKey::DEL}, + {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'.'>::Character}}, // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_END, - ui::DomCode::NUMPAD1, - ui::EF_ALT_DOWN, - ui::DomKey::END, - 0}, - {ui::VKEY_NUMPAD1, - ui::DomCode::NUMPAD1, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '1'}}, + {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN, ui::DomKey::END}, + {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'1'>::Character}}, // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_DOWN, - ui::DomCode::NUMPAD2, - ui::EF_ALT_DOWN, - ui::DomKey::ARROW_DOWN, - 0}, - {ui::VKEY_NUMPAD2, - ui::DomCode::NUMPAD2, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '2'}}, + {ui::VKEY_DOWN, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN, + ui::DomKey::ARROW_DOWN}, + {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'2'>::Character}}, // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NEXT, - ui::DomCode::NUMPAD3, - ui::EF_ALT_DOWN, - ui::DomKey::PAGE_DOWN, - 0}, - {ui::VKEY_NUMPAD3, - ui::DomCode::NUMPAD3, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '3'}}, + {ui::VKEY_NEXT, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN, + ui::DomKey::PAGE_DOWN}, + {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'3'>::Character}}, // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_LEFT, - ui::DomCode::NUMPAD4, - ui::EF_ALT_DOWN, - ui::DomKey::ARROW_LEFT, - 0}, - {ui::VKEY_NUMPAD4, - ui::DomCode::NUMPAD4, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '4'}}, + {ui::VKEY_LEFT, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN, + ui::DomKey::ARROW_LEFT}, + {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'4'>::Character}}, // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_CLEAR, - ui::DomCode::NUMPAD5, - ui::EF_ALT_DOWN, - ui::DomKey::CLEAR, - 0}, - {ui::VKEY_NUMPAD5, - ui::DomCode::NUMPAD5, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '5'}}, + {ui::VKEY_CLEAR, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN, + ui::DomKey::CLEAR}, + {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'5'>::Character}}, // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_RIGHT, - ui::DomCode::NUMPAD6, - ui::EF_ALT_DOWN, - ui::DomKey::ARROW_RIGHT, - 0}, - {ui::VKEY_NUMPAD6, - ui::DomCode::NUMPAD6, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '6'}}, + {ui::VKEY_RIGHT, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN, + ui::DomKey::ARROW_RIGHT}, + {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'6'>::Character}}, // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_HOME, - ui::DomCode::NUMPAD7, - ui::EF_ALT_DOWN, - ui::DomKey::HOME, - 0}, - {ui::VKEY_NUMPAD7, - ui::DomCode::NUMPAD7, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '7'}}, + {ui::VKEY_HOME, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN, ui::DomKey::HOME}, + {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'7'>::Character}}, // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_UP, - ui::DomCode::NUMPAD8, - ui::EF_ALT_DOWN, - ui::DomKey::ARROW_UP, - 0}, - {ui::VKEY_NUMPAD8, - ui::DomCode::NUMPAD8, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '8'}}, + {ui::VKEY_UP, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN, + ui::DomKey::ARROW_UP}, + {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'8'>::Character}}, // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_PRIOR, - ui::DomCode::NUMPAD9, - ui::EF_ALT_DOWN, - ui::DomKey::PAGE_UP, - 0}, - {ui::VKEY_NUMPAD9, - ui::DomCode::NUMPAD9, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - '9'}}, + {ui::VKEY_PRIOR, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN, + ui::DomKey::PAGE_UP}, + {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'9'>::Character}}, // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD0, - ui::DomCode::NUMPAD0, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '0'}, - {ui::VKEY_NUMPAD0, - ui::DomCode::NUMPAD0, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '0'}}, + {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE, + ui::DomKey::Constant<'0'>::Character}, + {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE, + ui::DomKey::Constant<'0'>::Character}}, // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_DECIMAL, - ui::DomCode::NUMPAD_DECIMAL, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '.'}, - {ui::VKEY_DECIMAL, - ui::DomCode::NUMPAD_DECIMAL, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '.'}}, + {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE, + ui::DomKey::Constant<'.'>::Character}, + {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE, + ui::DomKey::Constant<'.'>::Character}}, // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD1, - ui::DomCode::NUMPAD1, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '1'}, - {ui::VKEY_NUMPAD1, - ui::DomCode::NUMPAD1, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '1'}}, + {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE, + ui::DomKey::Constant<'1'>::Character}, + {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE, + ui::DomKey::Constant<'1'>::Character}}, // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD2, - ui::DomCode::NUMPAD2, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '2'}, - {ui::VKEY_NUMPAD2, - ui::DomCode::NUMPAD2, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '2'}}, + {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE, + ui::DomKey::Constant<'2'>::Character}, + {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE, + ui::DomKey::Constant<'2'>::Character}}, // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD3, - ui::DomCode::NUMPAD3, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '3'}, - {ui::VKEY_NUMPAD3, - ui::DomCode::NUMPAD3, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '3'}}, + {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE, + ui::DomKey::Constant<'3'>::Character}, + {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE, + ui::DomKey::Constant<'3'>::Character}}, // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD4, - ui::DomCode::NUMPAD4, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '4'}, - {ui::VKEY_NUMPAD4, - ui::DomCode::NUMPAD4, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '4'}}, + {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE, + ui::DomKey::Constant<'4'>::Character}, + {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE, + ui::DomKey::Constant<'4'>::Character}}, // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock // modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD5, - ui::DomCode::NUMPAD5, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '5'}, - {ui::VKEY_NUMPAD5, - ui::DomCode::NUMPAD5, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '5'}}, + {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE, + ui::DomKey::Constant<'5'>::Character}, + {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE, + ui::DomKey::Constant<'5'>::Character}}, // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock // modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD6, - ui::DomCode::NUMPAD6, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '6'}, - {ui::VKEY_NUMPAD6, - ui::DomCode::NUMPAD6, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '6'}}, + {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE, + ui::DomKey::Constant<'6'>::Character}, + {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE, + ui::DomKey::Constant<'6'>::Character}}, // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock // modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD7, - ui::DomCode::NUMPAD7, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '7'}, - {ui::VKEY_NUMPAD7, - ui::DomCode::NUMPAD7, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '7'}}, + {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE, + ui::DomKey::Constant<'7'>::Character}, + {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE, + ui::DomKey::Constant<'7'>::Character}}, // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock // modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD8, - ui::DomCode::NUMPAD8, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '8'}, - {ui::VKEY_NUMPAD8, - ui::DomCode::NUMPAD8, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '8'}}, + {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE, + ui::DomKey::Constant<'8'>::Character}, + {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE, + ui::DomKey::Constant<'8'>::Character}}, // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock // modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD9, - ui::DomCode::NUMPAD9, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '9'}, - {ui::VKEY_NUMPAD9, - ui::DomCode::NUMPAD9, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '9'}}, + {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE, + ui::DomKey::Constant<'9'>::Character}, + {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE, + ui::DomKey::Constant<'9'>::Character}}, }; for (const auto& test : tests) { @@ -733,31 +510,19 @@ void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. // The result should be "Num Pad 1 with Control + Num Lock modifiers". {ui::ET_KEY_PRESSED, - {ui::VKEY_END, - ui::DomCode::NUMPAD1, - ui::EF_COMMAND_DOWN, - ui::DomKey::END, - 0}, - {ui::VKEY_NUMPAD1, - ui::DomCode::NUMPAD1, - ui::EF_CONTROL_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}}, + {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN, + ui::DomKey::END}, + {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN, + ui::DomKey::UNIDENTIFIED}}, // XK_KP_1 (= NumPad 1 with Num Lock), Win modifier. // The result should also be "Num Pad 1 with Control + Num Lock // modifiers". {ui::ET_KEY_PRESSED, - {ui::VKEY_NUMPAD1, - ui::DomCode::NUMPAD1, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '1'}, - {ui::VKEY_NUMPAD1, - ui::DomCode::NUMPAD1, - ui::EF_CONTROL_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}}}; + {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'1'>::Character}, + {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN, + ui::DomKey::UNIDENTIFIED}}}; for (const auto& test : tests) { CheckKeyTestCase(&rewriter, test); @@ -788,70 +553,41 @@ TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { KeyTestCase tests[] = { // Press Search. Confirm the event is not rewritten. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS, 0}, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_COMMAND_DOWN, + ui::DomKey::OS}}, // Press left Control. Confirm the event is not rewritten. {ui::ET_KEY_PRESSED, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}}, // Press right Control. Confirm the event is not rewritten. {ui::ET_KEY_PRESSED, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}}, // Press left Alt. Confirm the event is not rewritten. {ui::ET_KEY_PRESSED, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, + ui::DomKey::ALT}}, // Press right Alt. Confirm the event is not rewritten. {ui::ET_KEY_PRESSED, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, + ui::DomKey::ALT}}, // Test KeyRelease event, just in case. // Release Search. Confirm the release event is not rewritten. {ui::ET_KEY_RELEASED, - {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS, 0}, - {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS, 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS}}, }; for (const auto& test : tests) { @@ -868,57 +604,35 @@ TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { KeyTestCase tests[] = { // Press Alt with Shift. Confirm the event is not rewritten. {ui::ET_KEY_PRESSED, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, + ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, + ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}}, // Press Search with Caps Lock mask. Confirm the event is not rewritten. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, + ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, + ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS}}, // Release Search with Caps Lock mask. Confirm the event is not rewritten. {ui::ET_KEY_RELEASED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_CAPS_LOCK_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_CAPS_LOCK_DOWN, - ui::DomKey::OS, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_CAPS_LOCK_DOWN, + ui::DomKey::OS}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_CAPS_LOCK_DOWN, + ui::DomKey::OS}}, // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten. {ui::ET_KEY_PRESSED, - {ui::VKEY_B, - ui::DomCode::KEY_B, + {ui::VKEY_B, ui::DomCode::KEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - 'B'}, - {ui::VKEY_B, - ui::DomCode::KEY_B, + ui::DomKey::Constant<'B'>::Character}, + {ui::VKEY_B, ui::DomCode::KEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - 'B'}}, + ui::DomKey::Constant<'B'>::Character}}, }; for (const auto& test : tests) { @@ -945,80 +659,47 @@ TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) { // Press Alt with Shift. This key press shouldn't be affected by the // pref. Confirm the event is not rewritten. {ui::ET_KEY_PRESSED, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, + ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, + ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}}, // Press Search. Confirm the event is now VKEY_UNKNOWN. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS, 0}, - {ui::VKEY_UNKNOWN, - ui::DomCode::NONE, - ui::EF_NONE, - ui::DomKey::UNIDENTIFIED, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS}, + {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE, + ui::DomKey::UNIDENTIFIED}}, // Press Control. Confirm the event is now VKEY_UNKNOWN. {ui::ET_KEY_PRESSED, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}, - {ui::VKEY_UNKNOWN, - ui::DomCode::NONE, - ui::EF_NONE, - ui::DomKey::UNIDENTIFIED, - 0}}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}, + {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE, + ui::DomKey::UNIDENTIFIED}}, // Press Control+Search. Confirm the event is now VKEY_UNKNOWN // without any modifiers. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_UNKNOWN, - ui::DomCode::NONE, - ui::EF_NONE, - ui::DomKey::UNIDENTIFIED, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::OS}, + {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE, + ui::DomKey::UNIDENTIFIED}}, // Press Control+Search+a. Confirm the event is now VKEY_A without any // modifiers. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, - 'a'}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_NONE, - ui::DomKey::CHARACTER, - 'a'}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN, + ui::DomKey::Constant<'a'>::Character}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, + ui::DomKey::Constant<'a'>::Character}}, // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with // the Alt modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - 'a'}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - 'a'}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, + ui::DomKey::Constant<'a'>::Character}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'a'>::Character}}, }; for (const auto& test : disabled_modifier_tests) { @@ -1034,30 +715,17 @@ TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) { // Press left Alt. Confirm the event is now VKEY_CONTROL // even though the Control key itself is disabled. {ui::ET_KEY_PRESSED, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}}, // Press Alt+a. Confirm the event is now Control+a even though the Control // key itself is disabled. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, - 'a'}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, - 0x01}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN, + ui::DomKey::Constant<'a'>::Character}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN, + ui::DomKey::Constant<0x01>::Character}}, }; for (const auto& test : tests) { @@ -1080,16 +748,10 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { KeyTestCase s_tests[] = { // Press Search. Confirm the event is now VKEY_CONTROL. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_COMMAND_DOWN, + ui::DomKey::OS}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}}, }; for (const auto& test : s_tests) { @@ -1104,72 +766,44 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { KeyTestCase sa_tests[] = { // Press Alt. Confirm the event is now VKEY_CONTROL. {ui::ET_KEY_PRESSED, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}}, // Press Alt+Search. Confirm the event is now VKEY_CONTROL. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, + ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}}, // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}}, + ui::DomKey::OS}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}}, // Press Shift+Control+Alt+Search. Confirm the event is now Control with // Shift and Control modifiers. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}}, + ui::DomKey::OS}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, + ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL}}, // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift // and Control modifiers. {ui::ET_KEY_PRESSED, - {ui::VKEY_B, - ui::DomCode::KEY_B, + {ui::VKEY_B, ui::DomCode::KEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - 'B'}, - {ui::VKEY_B, - ui::DomCode::KEY_B, - ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, - 0x02}}, + ui::DomKey::Constant<'B'>::Character}, + {ui::VKEY_B, ui::DomCode::KEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, + ui::DomKey::Constant<0x02>::Character}}, }; for (const auto& test : sa_tests) { @@ -1192,16 +826,9 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { KeyTestCase tests[] = { // Press Search. Confirm the event is now VKEY_ESCAPE. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_ESCAPE, - ui::DomCode::ESCAPE, - ui::EF_NONE, - ui::DomKey::ESCAPE, - 0x1B}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_COMMAND_DOWN, + ui::DomKey::OS}, + {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE}}, }; for (const auto& test : tests) { @@ -1224,16 +851,10 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { KeyTestCase s2a_tests[] = { // Press Search. Confirm the event is now VKEY_MENU. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_COMMAND_DOWN, + ui::DomKey::OS}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, + ui::DomKey::ALT}}, }; for (const auto& test : s2a_tests) { @@ -1248,42 +869,23 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { KeyTestCase a2c_tests[] = { // Press left Alt. Confirm the event is now VKEY_CONTROL. {ui::ET_KEY_PRESSED, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, - ui::EF_ALT_DOWN, - ui::DomKey::ALT, - 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}}, // Press Shift+comma. Verify that only the flags are changed. // The X11 portion of the test addresses crbug.com/390263 by verifying // that the X keycode remains that for ',<' and not for 105-key '<>'. {ui::ET_KEY_PRESSED, - {ui::VKEY_OEM_COMMA, - ui::DomCode::COMMA, - ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}, - {ui::VKEY_OEM_COMMA, - ui::DomCode::COMMA, - ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}}, + {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA, + ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::UNIDENTIFIED}, + {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA, + ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED}}, // Press Shift+9. Verify that only the flags are changed. {ui::ET_KEY_PRESSED, - {ui::VKEY_9, - ui::DomCode::DIGIT9, - ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}, - {ui::VKEY_9, - ui::DomCode::DIGIT9, - ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::UNIDENTIFIED, - 0}}, + {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, + ui::DomKey::UNIDENTIFIED}, + {ui::VKEY_9, ui::DomCode::DIGIT9, + ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED}}, }; for (const auto& test : a2c_tests) { @@ -1298,59 +900,41 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { KeyTestCase c2s_tests[] = { // Press left Control. Confirm the event is now VKEY_LWIN. {ui::ET_KEY_PRESSED, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, - ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_COMMAND_DOWN, + ui::DomKey::OS}}, // Then, press all of the three, Control+Alt+Search. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, + ui::DomKey::OS}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::ALT, - 0}}, + ui::DomKey::ALT}}, // Press Shift+Control+Alt+Search. {ui::ET_KEY_PRESSED, - {ui::VKEY_LWIN, - ui::DomCode::OS_LEFT, + {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::OS, - 0}, - {ui::VKEY_MENU, - ui::DomCode::ALT_LEFT, + ui::DomKey::OS}, + {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::ALT, - 0}}, + ui::DomKey::ALT}}, // Press Shift+Control+Alt+Search+B {ui::ET_KEY_PRESSED, - {ui::VKEY_B, - ui::DomCode::KEY_B, + {ui::VKEY_B, ui::DomCode::KEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - 'B'}, - {ui::VKEY_B, - ui::DomCode::KEY_B, + ui::DomKey::Constant<'B'>::Character}, + {ui::VKEY_B, ui::DomCode::KEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - 'B'}}, + ui::DomKey::Constant<'B'>::Character}}, }; for (const auto& test : c2s_tests) { @@ -1376,20 +960,20 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { // Press Search. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, ui::EF_MOD3_DOWN, - ui::DomKey::CAPS_LOCK, 0), + ui::DomKey::CAPS_LOCK), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_LWIN, ui::DomCode::OS_LEFT, - ui::EF_COMMAND_DOWN, ui::DomKey::OS, 0)); + ui::EF_COMMAND_DOWN, ui::DomKey::OS)); // Confirm that the Caps Lock status is changed. EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); // Release Search. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, ui::EF_NONE, - ui::DomKey::CAPS_LOCK, 0), + ui::DomKey::CAPS_LOCK), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, ui::VKEY_LWIN, ui::DomCode::OS_LEFT, - ui::EF_NONE, ui::DomKey::OS, 0)); + ui::EF_NONE, ui::DomKey::OS)); // Confirm that the Caps Lock status is not changed. EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); @@ -1397,20 +981,20 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { EXPECT_EQ( GetExpectedResultAsString( ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, - ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK, 0), + ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK), GetRewrittenEventAsString( &rewriter, ui::ET_KEY_PRESSED, ui::VKEY_LWIN, ui::DomCode::OS_LEFT, - ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_DOWN, ui::DomKey::OS, 0)); + ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_DOWN, ui::DomKey::OS)); // Confirm that the Caps Lock status is changed. EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); // Release Search. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, ui::EF_NONE, - ui::DomKey::CAPS_LOCK, 0), + ui::DomKey::CAPS_LOCK), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, ui::VKEY_LWIN, ui::DomCode::OS_LEFT, - ui::EF_NONE, ui::DomKey::OS, 0)); + ui::EF_NONE, ui::DomKey::OS)); // Confirm that the Caps Lock status is not changed. EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); @@ -1418,11 +1002,11 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, - ui::DomKey::CAPS_LOCK, 0), + ui::DomKey::CAPS_LOCK), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, - ui::DomKey::CAPS_LOCK, 0)); + ui::DomKey::CAPS_LOCK)); #if defined(USE_X11) // Confirm that calling RewriteForTesting() does not change the state of @@ -1439,10 +1023,10 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { // Release Caps Lock (on an external keyboard). EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, ui::EF_NONE, - ui::DomKey::CAPS_LOCK, 0), + ui::DomKey::CAPS_LOCK), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, - ui::EF_NONE, ui::DomKey::CAPS_LOCK, 0)); + ui::EF_NONE, ui::DomKey::CAPS_LOCK)); #if defined(USE_X11) EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); #elif defined(USE_OZONE) @@ -1465,10 +1049,10 @@ TEST_F(EventRewriterTest, TestRewriteCapsLock) { EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, - ui::DomKey::CAPS_LOCK, 0), + ui::DomKey::CAPS_LOCK), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_F16, ui::DomCode::F16, - ui::EF_MOD3_DOWN, ui::DomKey::F16, 0)); + ui::EF_MOD3_DOWN, ui::DomKey::F16)); EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); } @@ -1486,34 +1070,22 @@ TEST_F(EventRewriterTest, TestRewriteDiamondKey) { // F15 should work as Ctrl when --has-chromeos-diamond-key is not // specified. {ui::ET_KEY_PRESSED, - {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15, 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, + ui::DomKey::CONTROL}}, {ui::ET_KEY_RELEASED, - {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15, 0}, - {ui::VKEY_CONTROL, - ui::DomCode::CONTROL_LEFT, - ui::EF_NONE, - ui::DomKey::CONTROL, - 0}}, + {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15}, + {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE, + ui::DomKey::CONTROL}}, // However, Mod2Mask should not be rewritten to CtrlMask when // --has-chromeos-diamond-key is not specified. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_NONE, - ui::DomKey::CHARACTER, - 'a'}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_NONE, - ui::DomKey::CHARACTER, - 'a'}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, + ui::DomKey::Constant<'a'>::Character}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, + ui::DomKey::Constant<'a'>::Character}}, }; for (const auto& test : tests) { @@ -1536,33 +1108,33 @@ TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { rewriter.set_ime_keyboard_for_testing(&ime_keyboard); // By default, F15 should work as Control. - EXPECT_EQ(GetExpectedResultAsString( - ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL, 0), + EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, + ui::DomCode::CONTROL_LEFT, + ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_F15, ui::DomCode::F15, - ui::EF_NONE, ui::DomKey::F15, 0)); + ui::EF_NONE, ui::DomKey::F15)); // Check that Control is applied to a subsequent key press. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, 0x01), + ui::DomKey::Constant<0x01>::Character), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a')); + ui::DomKey::Constant<'a'>::Character)); // Release F15 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE, - ui::DomKey::CONTROL, 0), + ui::DomKey::CONTROL), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, ui::VKEY_F15, ui::DomCode::F15, - ui::EF_NONE, ui::DomKey::F15, 0)); + ui::EF_NONE, ui::DomKey::F15)); // Check that Control is no longer applied to a subsequent key press. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a'), + ui::DomKey::Constant<'a'>::Character), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a')); + ui::DomKey::Constant<'a'>::Character)); IntegerPrefMember diamond; diamond.Init(prefs::kLanguageRemapDiamondKeyTo, &prefs); @@ -1570,109 +1142,109 @@ TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE, - ui::DomKey::UNIDENTIFIED, 0), + ui::DomKey::UNIDENTIFIED), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_F15, ui::DomCode::F15, - ui::EF_NONE, ui::DomKey::F15, 0)); + ui::EF_NONE, ui::DomKey::F15)); // Check that no modifier is applied to another key. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a'), + ui::DomKey::Constant<'a'>::Character), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a')); + ui::DomKey::Constant<'a'>::Character)); diamond.SetValue(chromeos::input_method::kControlKey); - EXPECT_EQ(GetExpectedResultAsString( - ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL, 0), + EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, + ui::DomCode::CONTROL_LEFT, + ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_F15, ui::DomCode::F15, - ui::EF_NONE, ui::DomKey::F15, 0)); + ui::EF_NONE, ui::DomKey::F15)); // Check that Control is applied to a subsequent key press. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, 0x01), + ui::DomKey::Constant<0x01>::Character), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a')); + ui::DomKey::Constant<'a'>::Character)); // Release F15 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE, - ui::DomKey::CONTROL, 0), + ui::DomKey::CONTROL), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, ui::VKEY_F15, ui::DomCode::F15, - ui::EF_NONE, ui::DomKey::F15, 0)); + ui::EF_NONE, ui::DomKey::F15)); // Check that Control is no longer applied to a subsequent key press. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a'), + ui::DomKey::Constant<'a'>::Character), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a')); + ui::DomKey::Constant<'a'>::Character)); diamond.SetValue(chromeos::input_method::kAltKey); EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, - ui::DomKey::ALT, 0), + ui::DomKey::ALT), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_F15, ui::DomCode::F15, - ui::EF_NONE, ui::DomKey::F15, 0)); + ui::EF_NONE, ui::DomKey::F15)); // Check that Alt is applied to a subsequent key press. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN, - ui::DomKey::CHARACTER, 'a'), + ui::DomKey::Constant<'a'>::Character), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a')); + ui::DomKey::Constant<'a'>::Character)); // Release F15 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_NONE, - ui::DomKey::ALT, 0), + ui::DomKey::ALT), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, ui::VKEY_F15, ui::DomCode::F15, - ui::EF_NONE, ui::DomKey::F15, 0)); + ui::EF_NONE, ui::DomKey::F15)); // Check that Alt is no longer applied to a subsequent key press. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a'), + ui::DomKey::Constant<'a'>::Character), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a')); + ui::DomKey::Constant<'a'>::Character)); diamond.SetValue(chromeos::input_method::kCapsLockKey); EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, - ui::DomKey::CAPS_LOCK, 0), + ui::DomKey::CAPS_LOCK), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_F15, ui::DomCode::F15, - ui::EF_NONE, ui::DomKey::F15, 0)); + ui::EF_NONE, ui::DomKey::F15)); // Check that Caps is applied to a subsequent key press. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, - ui::DomKey::CHARACTER, 'A'), + ui::DomKey::Constant<'A'>::Character), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a')); + ui::DomKey::Constant<'a'>::Character)); // Release F15 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, ui::EF_NONE, - ui::DomKey::CAPS_LOCK, 0), + ui::DomKey::CAPS_LOCK), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, ui::VKEY_F15, ui::DomCode::F15, - ui::EF_NONE, ui::DomKey::F15, 0)); + ui::EF_NONE, ui::DomKey::F15)); // Check that Control is no longer applied to a subsequent key press. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a'), + ui::DomKey::Constant<'a'>::Character), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a')); + ui::DomKey::Constant<'a'>::Character)); *base::CommandLine::ForCurrentProcess() = original_cl; } @@ -1693,44 +1265,26 @@ TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. // On Chrome OS, CapsLock works as a Mod3 modifier. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_MOD3_DOWN, - ui::DomKey::CHARACTER, - 'a'}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, - 0x01}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_MOD3_DOWN, + ui::DomKey::Constant<'a'>::Character}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN, + ui::DomKey::Constant<0x01>::Character}}, // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to // ControlMask {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_CONTROL_DOWN | ui::EF_MOD3_DOWN, - ui::DomKey::CHARACTER, - 'a'}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, - 0x01}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN | ui::EF_MOD3_DOWN, + ui::DomKey::Constant<'a'>::Character}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN, + ui::DomKey::Constant<0x01>::Character}}, // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to // ControlMask. {ui::ET_KEY_PRESSED, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN | ui::EF_MOD3_DOWN, - ui::DomKey::CHARACTER, - 'a'}, - {ui::VKEY_A, - ui::DomCode::KEY_A, - ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, - 0x01}}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_MOD3_DOWN, + ui::DomKey::Constant<'a'>::Character}, + {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, + ui::DomKey::Constant<0x01>::Character}}, }; for (const auto& test : tests) { @@ -1755,10 +1309,10 @@ TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { // when Mod3Mask is already in use by the current XKB layout. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a'), + ui::DomKey::Constant<'a'>::Character), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE, - ui::DomKey::CHARACTER, 'a')); + ui::DomKey::Constant<'a'>::Character)); input_method_manager_mock_->set_mod3_used(false); } @@ -1774,247 +1328,135 @@ TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { KeyTestCase tests[] = { // Alt+Backspace -> Delete {ui::ET_KEY_PRESSED, - {ui::VKEY_BACK, - ui::DomCode::BACKSPACE, - ui::EF_ALT_DOWN, - ui::DomKey::BACKSPACE, - '\b'}, - {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL, 0x7F}}, + {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN, + ui::DomKey::BACKSPACE}, + {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}}, // Control+Alt+Backspace -> Control+Delete {ui::ET_KEY_PRESSED, - {ui::VKEY_BACK, - ui::DomCode::BACKSPACE, - ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::BACKSPACE, - '\b'}, - {ui::VKEY_DELETE, - ui::DomCode::DEL, - ui::EF_CONTROL_DOWN, - ui::DomKey::DEL, - 0x7F}}, + {ui::VKEY_BACK, ui::DomCode::BACKSPACE, + ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE}, + {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_CONTROL_DOWN, + ui::DomKey::DEL}}, // Search+Alt+Backspace -> Alt+Backspace {ui::ET_KEY_PRESSED, - {ui::VKEY_BACK, - ui::DomCode::BACKSPACE, - ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::BACKSPACE, - '\b'}, - {ui::VKEY_BACK, - ui::DomCode::BACKSPACE, - ui::EF_ALT_DOWN, - ui::DomKey::BACKSPACE, - '\b'}}, + {ui::VKEY_BACK, ui::DomCode::BACKSPACE, + ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE}, + {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN, + ui::DomKey::BACKSPACE}}, // Search+Control+Alt+Backspace -> Control+Alt+Backspace {ui::ET_KEY_PRESSED, - {ui::VKEY_BACK, - ui::DomCode::BACKSPACE, + {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::BACKSPACE, - '\b'}, - {ui::VKEY_BACK, - ui::DomCode::BACKSPACE, - ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::BACKSPACE, - '\b'}}, + ui::DomKey::BACKSPACE}, + {ui::VKEY_BACK, ui::DomCode::BACKSPACE, + ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE}}, // Alt+Up -> Prior {ui::ET_KEY_PRESSED, - {ui::VKEY_UP, - ui::DomCode::ARROW_UP, - ui::EF_ALT_DOWN, - ui::DomKey::ARROW_UP, - 0}, - {ui::VKEY_PRIOR, - ui::DomCode::PAGE_UP, - ui::EF_NONE, - ui::DomKey::PAGE_UP, - 0}}, + {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN, + ui::DomKey::ARROW_UP}, + {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE, + ui::DomKey::PAGE_UP}}, // Alt+Down -> Next {ui::ET_KEY_PRESSED, - {ui::VKEY_DOWN, - ui::DomCode::ARROW_DOWN, - ui::EF_ALT_DOWN, - ui::DomKey::ARROW_DOWN, - 0}, - {ui::VKEY_NEXT, - ui::DomCode::PAGE_DOWN, - ui::EF_NONE, - ui::DomKey::PAGE_DOWN, - 0}}, + {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN, + ui::DomKey::ARROW_DOWN}, + {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE, + ui::DomKey::PAGE_DOWN}}, // Ctrl+Alt+Up -> Home {ui::ET_KEY_PRESSED, - {ui::VKEY_UP, - ui::DomCode::ARROW_UP, - ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::ARROW_UP, - 0}, - {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME, 0}}, + {ui::VKEY_UP, ui::DomCode::ARROW_UP, + ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP}, + {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}}, // Ctrl+Alt+Down -> End {ui::ET_KEY_PRESSED, - {ui::VKEY_DOWN, - ui::DomCode::ARROW_DOWN, - ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::ARROW_DOWN, - 0}, - {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END, 0}}, + {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, + ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN}, + {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}}, // Search+Alt+Up -> Alt+Up {ui::ET_KEY_PRESSED, - {ui::VKEY_UP, - ui::DomCode::ARROW_UP, - ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::ARROW_UP, - 0}, - {ui::VKEY_UP, - ui::DomCode::ARROW_UP, - ui::EF_ALT_DOWN, - ui::DomKey::ARROW_UP, - 0}}, + {ui::VKEY_UP, ui::DomCode::ARROW_UP, + ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_UP}, + {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN, + ui::DomKey::ARROW_UP}}, // Search+Alt+Down -> Alt+Down {ui::ET_KEY_PRESSED, - {ui::VKEY_DOWN, - ui::DomCode::ARROW_DOWN, - ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, - ui::DomKey::ARROW_DOWN, - 0}, - {ui::VKEY_DOWN, - ui::DomCode::ARROW_DOWN, - ui::EF_ALT_DOWN, - ui::DomKey::ARROW_DOWN, - 0}}, + {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, + ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_DOWN}, + {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN, + ui::DomKey::ARROW_DOWN}}, // Search+Ctrl+Alt+Up -> Search+Ctrl+Alt+Up {ui::ET_KEY_PRESSED, - {ui::VKEY_UP, - ui::DomCode::ARROW_UP, + {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::ARROW_UP, - 0}, - {ui::VKEY_UP, - ui::DomCode::ARROW_UP, - ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::ARROW_UP, - 0}}, + ui::DomKey::ARROW_UP}, + {ui::VKEY_UP, ui::DomCode::ARROW_UP, + ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP}}, // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down {ui::ET_KEY_PRESSED, - {ui::VKEY_DOWN, - ui::DomCode::ARROW_DOWN, + {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::ARROW_DOWN, - 0}, - {ui::VKEY_DOWN, - ui::DomCode::ARROW_DOWN, - ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::ARROW_DOWN, - 0}}, + ui::DomKey::ARROW_DOWN}, + {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, + ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN}}, // Period -> Period {ui::ET_KEY_PRESSED, - {ui::VKEY_OEM_PERIOD, - ui::DomCode::PERIOD, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '.'}, - {ui::VKEY_OEM_PERIOD, - ui::DomCode::PERIOD, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '.'}}, + {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE, + ui::DomKey::Constant<'.'>::Character}, + {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE, + ui::DomKey::Constant<'.'>::Character}}, // Search+Backspace -> Delete {ui::ET_KEY_PRESSED, - {ui::VKEY_BACK, - ui::DomCode::BACKSPACE, - ui::EF_COMMAND_DOWN, - ui::DomKey::BACKSPACE, - '\b'}, - {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL, 0x7F}}, + {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_COMMAND_DOWN, + ui::DomKey::BACKSPACE}, + {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}}, // Search+Up -> Prior {ui::ET_KEY_PRESSED, - {ui::VKEY_UP, - ui::DomCode::ARROW_UP, - ui::EF_COMMAND_DOWN, - ui::DomKey::ARROW_UP, - 0}, - {ui::VKEY_PRIOR, - ui::DomCode::PAGE_UP, - ui::EF_NONE, - ui::DomKey::PAGE_UP, - 0}}, + {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_COMMAND_DOWN, + ui::DomKey::ARROW_UP}, + {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE, + ui::DomKey::PAGE_UP}}, // Search+Down -> Next {ui::ET_KEY_PRESSED, - {ui::VKEY_DOWN, - ui::DomCode::ARROW_DOWN, - ui::EF_COMMAND_DOWN, - ui::DomKey::ARROW_DOWN, - 0}, - {ui::VKEY_NEXT, - ui::DomCode::PAGE_DOWN, - ui::EF_NONE, - ui::DomKey::PAGE_DOWN, - 0}}, + {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_COMMAND_DOWN, + ui::DomKey::ARROW_DOWN}, + {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE, + ui::DomKey::PAGE_DOWN}}, // Search+Left -> Home {ui::ET_KEY_PRESSED, - {ui::VKEY_LEFT, - ui::DomCode::ARROW_LEFT, - ui::EF_COMMAND_DOWN, - ui::DomKey::ARROW_LEFT, - 0}, - {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME, 0}}, + {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT, ui::EF_COMMAND_DOWN, + ui::DomKey::ARROW_LEFT}, + {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}}, // Control+Search+Left -> Home {ui::ET_KEY_PRESSED, - {ui::VKEY_LEFT, - ui::DomCode::ARROW_LEFT, - ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::ARROW_LEFT, - 0}, - {ui::VKEY_HOME, - ui::DomCode::HOME, - ui::EF_CONTROL_DOWN, - ui::DomKey::HOME, - 0}}, + {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT, + ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_LEFT}, + {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_CONTROL_DOWN, + ui::DomKey::HOME}}, // Search+Right -> End {ui::ET_KEY_PRESSED, - {ui::VKEY_RIGHT, - ui::DomCode::ARROW_RIGHT, - ui::EF_COMMAND_DOWN, - ui::DomKey::ARROW_RIGHT, - 0}, - {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END, 0}}, + {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT, ui::EF_COMMAND_DOWN, + ui::DomKey::ARROW_RIGHT}, + {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}}, // Control+Search+Right -> End {ui::ET_KEY_PRESSED, - {ui::VKEY_RIGHT, - ui::DomCode::ARROW_RIGHT, - ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::ARROW_RIGHT, - 0}, - {ui::VKEY_END, - ui::DomCode::END, - ui::EF_CONTROL_DOWN, - ui::DomKey::END, - 0}}, + {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT, + ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_RIGHT}, + {ui::VKEY_END, ui::DomCode::END, ui::EF_CONTROL_DOWN, ui::DomKey::END}}, // Search+Period -> Insert {ui::ET_KEY_PRESSED, - {ui::VKEY_OEM_PERIOD, - ui::DomCode::PERIOD, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '.'}, - {ui::VKEY_INSERT, - ui::DomCode::INSERT, - ui::EF_NONE, - ui::DomKey::INSERT, - 0}}, + {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'.'>::Character}, + {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_NONE, ui::DomKey::INSERT}}, // Control+Search+Period -> Control+Insert {ui::ET_KEY_PRESSED, - {ui::VKEY_OEM_PERIOD, - ui::DomCode::PERIOD, + {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, - ui::DomKey::CHARACTER, - '.'}, - {ui::VKEY_INSERT, - ui::DomCode::INSERT, - ui::EF_CONTROL_DOWN, - ui::DomKey::INSERT, - 0}}}; + ui::DomKey::Constant<'.'>::Character}, + {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_CONTROL_DOWN, + ui::DomKey::INSERT}}}; for (const auto& test : tests) { CheckKeyTestCase(&rewriter, test); @@ -2031,535 +1473,305 @@ TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { KeyTestCase tests[] = { // F1 -> Back {ui::ET_KEY_PRESSED, - {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1, 0}, - {ui::VKEY_BROWSER_BACK, - ui::DomCode::BROWSER_BACK, - ui::EF_NONE, - ui::DomKey::BROWSER_BACK, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1, 0}, - {ui::VKEY_BROWSER_BACK, - ui::DomCode::BROWSER_BACK, - ui::EF_CONTROL_DOWN, - ui::DomKey::BROWSER_BACK, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1, 0}, - {ui::VKEY_BROWSER_BACK, - ui::DomCode::BROWSER_BACK, - ui::EF_ALT_DOWN, - ui::DomKey::BROWSER_BACK, - 0}}, + {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}, + {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE, + ui::DomKey::BROWSER_BACK}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1}, + {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_CONTROL_DOWN, + ui::DomKey::BROWSER_BACK}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1}, + {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_ALT_DOWN, + ui::DomKey::BROWSER_BACK}}, // F2 -> Forward {ui::ET_KEY_PRESSED, - {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2, 0}, - {ui::VKEY_BROWSER_FORWARD, - ui::DomCode::BROWSER_FORWARD, - ui::EF_NONE, - ui::DomKey::BROWSER_FORWARD, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2, 0}, - {ui::VKEY_BROWSER_FORWARD, - ui::DomCode::BROWSER_FORWARD, - ui::EF_CONTROL_DOWN, - ui::DomKey::BROWSER_FORWARD, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2, 0}, - {ui::VKEY_BROWSER_FORWARD, - ui::DomCode::BROWSER_FORWARD, - ui::EF_ALT_DOWN, - ui::DomKey::BROWSER_FORWARD, - 0}}, + {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}, + {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_NONE, + ui::DomKey::BROWSER_FORWARD}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2}, + {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, + ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_FORWARD}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2}, + {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_ALT_DOWN, + ui::DomKey::BROWSER_FORWARD}}, // F3 -> Refresh {ui::ET_KEY_PRESSED, - {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3, 0}, - {ui::VKEY_BROWSER_REFRESH, - ui::DomCode::BROWSER_REFRESH, - ui::EF_NONE, - ui::DomKey::BROWSER_REFRESH, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3, 0}, - {ui::VKEY_BROWSER_REFRESH, - ui::DomCode::BROWSER_REFRESH, - ui::EF_CONTROL_DOWN, - ui::DomKey::BROWSER_REFRESH, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3, 0}, - {ui::VKEY_BROWSER_REFRESH, - ui::DomCode::BROWSER_REFRESH, - ui::EF_ALT_DOWN, - ui::DomKey::BROWSER_REFRESH, - 0}}, + {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}, + {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE, + ui::DomKey::BROWSER_REFRESH}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3}, + {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, + ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_REFRESH}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3}, + {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_ALT_DOWN, + ui::DomKey::BROWSER_REFRESH}}, // F4 -> Launch App 2 {ui::ET_KEY_PRESSED, - {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4, 0}, - {ui::VKEY_MEDIA_LAUNCH_APP2, - ui::DomCode::ZOOM_TOGGLE, - ui::EF_NONE, - ui::DomKey::ZOOM_TOGGLE, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4, 0}, - {ui::VKEY_MEDIA_LAUNCH_APP2, - ui::DomCode::ZOOM_TOGGLE, - ui::EF_CONTROL_DOWN, - ui::DomKey::ZOOM_TOGGLE, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4, 0}, - {ui::VKEY_MEDIA_LAUNCH_APP2, - ui::DomCode::ZOOM_TOGGLE, - ui::EF_ALT_DOWN, - ui::DomKey::ZOOM_TOGGLE, - 0}}, + {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}, + {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE, + ui::DomKey::ZOOM_TOGGLE}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4}, + {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, + ui::EF_CONTROL_DOWN, ui::DomKey::ZOOM_TOGGLE}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4}, + {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_ALT_DOWN, + ui::DomKey::ZOOM_TOGGLE}}, // F5 -> Launch App 1 {ui::ET_KEY_PRESSED, - {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5, 0}, - {ui::VKEY_MEDIA_LAUNCH_APP1, - ui::DomCode::SELECT_TASK, - ui::EF_NONE, - ui::DomKey::LAUNCH_MY_COMPUTER, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5, 0}, - {ui::VKEY_MEDIA_LAUNCH_APP1, - ui::DomCode::SELECT_TASK, - ui::EF_CONTROL_DOWN, - ui::DomKey::LAUNCH_MY_COMPUTER, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5, 0}, - {ui::VKEY_MEDIA_LAUNCH_APP1, - ui::DomCode::SELECT_TASK, - ui::EF_ALT_DOWN, - ui::DomKey::LAUNCH_MY_COMPUTER, - 0}}, + {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}, + {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE, + ui::DomKey::LAUNCH_MY_COMPUTER}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5}, + {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, + ui::EF_CONTROL_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5}, + {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_ALT_DOWN, + ui::DomKey::LAUNCH_MY_COMPUTER}}, // F6 -> Brightness down {ui::ET_KEY_PRESSED, - {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6, 0}, - {ui::VKEY_BRIGHTNESS_DOWN, - ui::DomCode::BRIGHTNESS_DOWN, - ui::EF_NONE, - ui::DomKey::BRIGHTNESS_DOWN, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6, 0}, - {ui::VKEY_BRIGHTNESS_DOWN, - ui::DomCode::BRIGHTNESS_DOWN, - ui::EF_CONTROL_DOWN, - ui::DomKey::BRIGHTNESS_DOWN, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6, 0}, - {ui::VKEY_BRIGHTNESS_DOWN, - ui::DomCode::BRIGHTNESS_DOWN, - ui::EF_ALT_DOWN, - ui::DomKey::BRIGHTNESS_DOWN, - 0}}, + {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}, + {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE, + ui::DomKey::BRIGHTNESS_DOWN}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6}, + {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, + ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_DOWN}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6}, + {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_ALT_DOWN, + ui::DomKey::BRIGHTNESS_DOWN}}, // F7 -> Brightness up {ui::ET_KEY_PRESSED, - {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7, 0}, - {ui::VKEY_BRIGHTNESS_UP, - ui::DomCode::BRIGHTNESS_UP, - ui::EF_NONE, - ui::DomKey::BRIGHTNESS_UP, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7, 0}, - {ui::VKEY_BRIGHTNESS_UP, - ui::DomCode::BRIGHTNESS_UP, - ui::EF_CONTROL_DOWN, - ui::DomKey::BRIGHTNESS_UP, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7, 0}, - {ui::VKEY_BRIGHTNESS_UP, - ui::DomCode::BRIGHTNESS_UP, - ui::EF_ALT_DOWN, - ui::DomKey::BRIGHTNESS_UP, - 0}}, + {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}, + {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE, + ui::DomKey::BRIGHTNESS_UP}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7}, + {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_CONTROL_DOWN, + ui::DomKey::BRIGHTNESS_UP}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7}, + {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_ALT_DOWN, + ui::DomKey::BRIGHTNESS_UP}}, // F8 -> Volume Mute {ui::ET_KEY_PRESSED, - {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8, 0}, - {ui::VKEY_VOLUME_MUTE, - ui::DomCode::VOLUME_MUTE, - ui::EF_NONE, - ui::DomKey::VOLUME_MUTE, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8, 0}, - {ui::VKEY_VOLUME_MUTE, - ui::DomCode::VOLUME_MUTE, - ui::EF_CONTROL_DOWN, - ui::DomKey::VOLUME_MUTE, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8, 0}, - {ui::VKEY_VOLUME_MUTE, - ui::DomCode::VOLUME_MUTE, - ui::EF_ALT_DOWN, - ui::DomKey::VOLUME_MUTE, - 0}}, + {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}, + {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE, + ui::DomKey::VOLUME_MUTE}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8}, + {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_CONTROL_DOWN, + ui::DomKey::VOLUME_MUTE}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8}, + {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_ALT_DOWN, + ui::DomKey::VOLUME_MUTE}}, // F9 -> Volume Down {ui::ET_KEY_PRESSED, - {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9, 0}, - {ui::VKEY_VOLUME_DOWN, - ui::DomCode::VOLUME_DOWN, - ui::EF_NONE, - ui::DomKey::VOLUME_DOWN, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9, 0}, - {ui::VKEY_VOLUME_DOWN, - ui::DomCode::VOLUME_DOWN, - ui::EF_CONTROL_DOWN, - ui::DomKey::VOLUME_DOWN, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9, 0}, - {ui::VKEY_VOLUME_DOWN, - ui::DomCode::VOLUME_DOWN, - ui::EF_ALT_DOWN, - ui::DomKey::VOLUME_DOWN, - 0}}, + {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}, + {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE, + ui::DomKey::VOLUME_DOWN}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9}, + {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_CONTROL_DOWN, + ui::DomKey::VOLUME_DOWN}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9}, + {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_ALT_DOWN, + ui::DomKey::VOLUME_DOWN}}, // F10 -> Volume Up {ui::ET_KEY_PRESSED, - {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10, 0}, - {ui::VKEY_VOLUME_UP, - ui::DomCode::VOLUME_UP, - ui::EF_NONE, - ui::DomKey::VOLUME_UP, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F10, - ui::DomCode::F10, - ui::EF_CONTROL_DOWN, - ui::DomKey::F10, - 0}, - {ui::VKEY_VOLUME_UP, - ui::DomCode::VOLUME_UP, - ui::EF_CONTROL_DOWN, - ui::DomKey::VOLUME_UP, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10, 0}, - {ui::VKEY_VOLUME_UP, - ui::DomCode::VOLUME_UP, - ui::EF_ALT_DOWN, - ui::DomKey::VOLUME_UP, - 0}}, + {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}, + {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE, + ui::DomKey::VOLUME_UP}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10}, + {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_CONTROL_DOWN, + ui::DomKey::VOLUME_UP}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10}, + {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_ALT_DOWN, + ui::DomKey::VOLUME_UP}}, // F11 -> F11 {ui::ET_KEY_PRESSED, - {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11, 0}, - {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F11, - ui::DomCode::F11, - ui::EF_CONTROL_DOWN, - ui::DomKey::F11, - 0}, - {ui::VKEY_F11, - ui::DomCode::F11, - ui::EF_CONTROL_DOWN, - ui::DomKey::F11, - 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11, 0}, - {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11, 0}}, + {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}, + {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}, + {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}, + {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}}, // F12 -> F12 {ui::ET_KEY_PRESSED, - {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12, 0}, - {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12, 0}}, + {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}, + {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F12, - ui::DomCode::F12, - ui::EF_CONTROL_DOWN, - ui::DomKey::F12, - 0}, - {ui::VKEY_F12, - ui::DomCode::F12, - ui::EF_CONTROL_DOWN, - ui::DomKey::F12, - 0}}, + {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}, + {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12, 0}, - {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12, 0}}, + {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}, + {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}}, // The number row should not be rewritten without Search key. {ui::ET_KEY_PRESSED, - {ui::VKEY_1, - ui::DomCode::DIGIT1, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '1'}, - {ui::VKEY_1, - ui::DomCode::DIGIT1, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '1'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_2, - ui::DomCode::DIGIT2, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '2'}, - {ui::VKEY_2, - ui::DomCode::DIGIT2, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '2'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_3, - ui::DomCode::DIGIT3, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '3'}, - {ui::VKEY_3, - ui::DomCode::DIGIT3, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '3'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_4, - ui::DomCode::DIGIT4, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '4'}, - {ui::VKEY_4, - ui::DomCode::DIGIT4, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '4'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_5, - ui::DomCode::DIGIT5, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '5'}, - {ui::VKEY_5, - ui::DomCode::DIGIT5, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '5'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_6, - ui::DomCode::DIGIT6, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '6'}, - {ui::VKEY_6, - ui::DomCode::DIGIT6, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '6'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_7, - ui::DomCode::DIGIT7, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '7'}, - {ui::VKEY_7, - ui::DomCode::DIGIT7, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '7'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_8, - ui::DomCode::DIGIT8, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '8'}, - {ui::VKEY_8, - ui::DomCode::DIGIT8, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '8'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_9, - ui::DomCode::DIGIT9, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '9'}, - {ui::VKEY_9, - ui::DomCode::DIGIT9, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '9'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_0, - ui::DomCode::DIGIT0, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '0'}, - {ui::VKEY_0, - ui::DomCode::DIGIT0, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '0'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_OEM_MINUS, - ui::DomCode::MINUS, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '-'}, - {ui::VKEY_OEM_MINUS, - ui::DomCode::MINUS, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '-'}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_OEM_PLUS, - ui::DomCode::EQUAL, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '='}, - {ui::VKEY_OEM_PLUS, - ui::DomCode::EQUAL, - ui::EF_NONE, - ui::DomKey::CHARACTER, - '='}}, + {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE, + ui::DomKey::Constant<'1'>::Character}, + {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE, + ui::DomKey::Constant<'1'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE, + ui::DomKey::Constant<'2'>::Character}, + {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE, + ui::DomKey::Constant<'2'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE, + ui::DomKey::Constant<'3'>::Character}, + {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE, + ui::DomKey::Constant<'3'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE, + ui::DomKey::Constant<'4'>::Character}, + {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE, + ui::DomKey::Constant<'4'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE, + ui::DomKey::Constant<'5'>::Character}, + {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE, + ui::DomKey::Constant<'5'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE, + ui::DomKey::Constant<'6'>::Character}, + {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE, + ui::DomKey::Constant<'6'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE, + ui::DomKey::Constant<'7'>::Character}, + {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE, + ui::DomKey::Constant<'7'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE, + ui::DomKey::Constant<'8'>::Character}, + {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE, + ui::DomKey::Constant<'8'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE, + ui::DomKey::Constant<'9'>::Character}, + {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE, + ui::DomKey::Constant<'9'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE, + ui::DomKey::Constant<'0'>::Character}, + {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE, + ui::DomKey::Constant<'0'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE, + ui::DomKey::Constant<'-'>::Character}, + {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE, + ui::DomKey::Constant<'-'>::Character}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE, + ui::DomKey::Constant<'='>::Character}, + {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE, + ui::DomKey::Constant<'='>::Character}}, // The number row should be rewritten as the F<number> row with Search // key. {ui::ET_KEY_PRESSED, - {ui::VKEY_1, - ui::DomCode::DIGIT1, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '1'}, - {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_2, - ui::DomCode::DIGIT2, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '2'}, - {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_3, - ui::DomCode::DIGIT3, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '3'}, - {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_4, - ui::DomCode::DIGIT4, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '4'}, - {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_5, - ui::DomCode::DIGIT5, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '5'}, - {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_6, - ui::DomCode::DIGIT6, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '6'}, - {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_7, - ui::DomCode::DIGIT7, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '7'}, - {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_8, - ui::DomCode::DIGIT8, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '8'}, - {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_9, - ui::DomCode::DIGIT9, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '9'}, - {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_0, - ui::DomCode::DIGIT0, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '0'}, - {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_OEM_MINUS, - ui::DomCode::MINUS, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '-'}, - {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11, 0}}, - {ui::ET_KEY_PRESSED, - {ui::VKEY_OEM_PLUS, - ui::DomCode::EQUAL, - ui::EF_COMMAND_DOWN, - ui::DomKey::CHARACTER, - '='}, - {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12, 0}}, + {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'1'>::Character}, + {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'2'>::Character}, + {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'3'>::Character}, + {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'4'>::Character}, + {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'5'>::Character}, + {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'6'>::Character}, + {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'7'>::Character}, + {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'8'>::Character}, + {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'9'>::Character}, + {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'0'>::Character}, + {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'-'>::Character}, + {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}}, + {ui::ET_KEY_PRESSED, + {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN, + ui::DomKey::Constant<'='>::Character}, + {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}}, // The function keys should not be rewritten with Search key pressed. {ui::ET_KEY_PRESSED, - {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1, 0}, - {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1, 0}}, + {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1}, + {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2, 0}, - {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2, 0}}, + {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2}, + {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3, 0}, - {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3, 0}}, + {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3}, + {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4, 0}, - {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4, 0}}, + {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4}, + {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5, 0}, - {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5, 0}}, + {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5}, + {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6, 0}, - {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6, 0}}, + {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6}, + {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7, 0}, - {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7, 0}}, + {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7}, + {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8, 0}, - {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8, 0}}, + {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8}, + {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9, 0}, - {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9, 0}}, + {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9}, + {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F10, - ui::DomCode::F10, - ui::EF_COMMAND_DOWN, - ui::DomKey::F10, - 0}, - {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10, 0}}, + {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10}, + {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F11, - ui::DomCode::F11, - ui::EF_COMMAND_DOWN, - ui::DomKey::F11, - 0}, - {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11, 0}}, + {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11}, + {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}}, {ui::ET_KEY_PRESSED, - {ui::VKEY_F12, - ui::DomCode::F12, - ui::EF_COMMAND_DOWN, - ui::DomKey::F12, - 0}, - {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12, 0}}}; + {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12}, + {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}}}; for (const auto& test : tests) { CheckKeyTestCase(&rewriter, test); @@ -2581,21 +1793,16 @@ TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { KeyTestCase tests[] = { // Alt+Search+Down -> End {ui::ET_KEY_PRESSED, - {ui::VKEY_DOWN, - ui::DomCode::ARROW_DOWN, - ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::ARROW_DOWN, - 0}, - {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END, 0}}, + {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, + ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::ARROW_DOWN}, + {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}}, // Shift+Alt+Search+Down -> Shift+End {ui::ET_KEY_PRESSED, - {ui::VKEY_DOWN, - ui::DomCode::ARROW_DOWN, + {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, - ui::DomKey::ARROW_DOWN, - 0}, - {ui::VKEY_END, ui::DomCode::END, ui::EF_SHIFT_DOWN, ui::DomKey::END, 0}}, + ui::DomKey::ARROW_DOWN}, + {ui::VKEY_END, ui::DomCode::END, ui::EF_SHIFT_DOWN, ui::DomKey::END}}, }; for (const auto& test : tests) { @@ -2619,7 +1826,7 @@ TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { { ui::KeyEvent keyevent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_FINAL, - ui::DomKey::CONTROL, 0, ui::EventTimeForNow()); + ui::DomKey::CONTROL, ui::EventTimeForNow()); scoped_ptr<ui::Event> new_event; // Control should NOT be remapped to Alt if EF_FINAL is set. EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, @@ -2740,9 +1947,8 @@ class EventRewriterAshTest : public ash::test::AshTestBase { void SendKeyEvent(ui::EventType type, ui::KeyboardCode key_code, ui::DomCode code, - ui::DomKey key, - base::char16 character) { - ui::KeyEvent press(type, key_code, code, ui::EF_NONE, key, character, + ui::DomKey key) { + ui::KeyEvent press(type, key_code, code, ui::EF_NONE, key, ui::EventTimeForNow()); ui::EventDispatchDetails details = Send(&press); CHECK(!details.dispatcher_destroyed); @@ -2750,10 +1956,9 @@ class EventRewriterAshTest : public ash::test::AshTestBase { void SendActivateStickyKeyPattern(ui::KeyboardCode key_code, ui::DomCode code, - ui::DomKey key, - base::char16 character) { - SendKeyEvent(ui::ET_KEY_PRESSED, key_code, code, key, character); - SendKeyEvent(ui::ET_KEY_RELEASED, key_code, code, key, character); + ui::DomKey key) { + SendKeyEvent(ui::ET_KEY_PRESSED, key_code, code, key); + SendKeyEvent(ui::ET_KEY_RELEASED, key_code, code, key); } protected: @@ -2804,7 +2009,7 @@ TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { // Create a simulated keypress of F1 targetted at the window. ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, ui::DomCode::F1, - ui::EF_NONE, ui::DomKey::F1, 0, ui::EventTimeForNow()); + ui::EF_NONE, ui::DomKey::F1, ui::EventTimeForNow()); // Simulate an apps v2 window that has requested top row keys as function // keys. The event should not be rewritten. @@ -2813,10 +2018,10 @@ TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { ASSERT_FALSE(details.dispatcher_destroyed); PopEvents(&events); EXPECT_EQ(1u, events.size()); - EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1, - ui::DomCode::F1, ui::EF_NONE, - ui::DomKey::F1, 0), - GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); + EXPECT_EQ( + GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1, + ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1), + GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); // The event should also not be rewritten if the send-function-keys pref is // additionally set, for both apps v2 and regular windows. @@ -2828,10 +2033,10 @@ TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { ASSERT_FALSE(details.dispatcher_destroyed); PopEvents(&events); EXPECT_EQ(1u, events.size()); - EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1, - ui::DomCode::F1, ui::EF_NONE, - ui::DomKey::F1, 0), - GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); + EXPECT_EQ( + GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1, + ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1), + GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); // If the pref isn't set when an event is sent to a regular window, F1 is // rewritten to the back key. @@ -2842,7 +2047,7 @@ TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { EXPECT_EQ(1u, events.size()); EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE, - ui::DomKey::BROWSER_BACK, 0), + ui::DomKey::BROWSER_BACK), GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); } @@ -3093,7 +2298,7 @@ TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) { ScopedVector<ui::Event> events; SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); PopEvents(&events); EXPECT_EQ(1u, events.size()); EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); @@ -3103,7 +2308,7 @@ TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) { // Test key press event is correctly modified and modifier release // event is sent. ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::DomCode::KEY_C, - ui::EF_NONE, ui::DomKey::CHARACTER, 'c', + ui::EF_NONE, ui::DomKey::Constant<'c'>::Character, ui::EventTimeForNow()); ui::EventDispatchDetails details = Send(&press); PopEvents(&events); @@ -3117,7 +2322,7 @@ TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) { // Test key release event is not modified. ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::DomCode::KEY_C, - ui::EF_NONE, ui::DomKey::CHARACTER, 'c', + ui::EF_NONE, ui::DomKey::Constant<'c'>::Character, ui::EventTimeForNow()); details = Send(&release); ASSERT_FALSE(details.dispatcher_destroyed); @@ -3132,7 +2337,7 @@ TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) { ScopedVector<ui::Event> events; SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); PopEvents(&events); // Test mouse press event is correctly modified. @@ -3169,7 +2374,7 @@ TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) { // Test positive mouse wheel event is correctly modified and modifier release // event is sent. SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); PopEvents(&events); gfx::Point location(0, 0); ui::MouseEvent mev(ui::ET_MOUSEWHEEL, location, location, @@ -3189,7 +2394,7 @@ TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) { // Test negative mouse wheel event is correctly modified and modifier release // event is sent. SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); PopEvents(&events); ui::MouseWheelEvent negative(mev, 0, -ui::MouseWheelEvent::kWheelDelta); details = Send(&negative); @@ -3225,14 +2430,14 @@ TEST_F(StickyKeysOverlayTest, OneModifierEnabled) { // Pressing modifier key should show overlay. SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); EXPECT_TRUE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); // Pressing a normal key should hide overlay. SendActivateStickyKeyPattern(ui::VKEY_T, ui::DomCode::KEY_T, - ui::DomKey::CHARACTER, 't'); + ui::DomKey::Constant<'t'>::Character); EXPECT_FALSE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); @@ -3247,9 +2452,9 @@ TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) { // Pressing two modifiers should show overlay. SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT, - ui::DomKey::SHIFT, 0); + ui::DomKey::SHIFT); SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); EXPECT_TRUE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); @@ -3258,7 +2463,7 @@ TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) { // Pressing a normal key should hide overlay. SendActivateStickyKeyPattern(ui::VKEY_N, ui::DomCode::KEY_N, - ui::DomKey::CHARACTER, 'n'); + ui::DomKey::Constant<'n'>::Character); EXPECT_FALSE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); @@ -3273,16 +2478,16 @@ TEST_F(StickyKeysOverlayTest, LockedModifier) { // Pressing a modifier key twice should lock modifier and show overlay. SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT, - ui::DomKey::ALT, 0); + ui::DomKey::ALT); SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT, - ui::DomKey::ALT, 0); + ui::DomKey::ALT); EXPECT_TRUE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); // Pressing a normal key should not hide overlay. SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::KEY_D, - ui::DomKey::CHARACTER, 'd'); + ui::DomKey::Constant<'d'>::Character); EXPECT_TRUE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); @@ -3297,16 +2502,16 @@ TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) { // Pressing a modifier key twice should lock modifier and show overlay. SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); EXPECT_TRUE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); // Pressing another modifier key should still show overlay. SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT, - ui::DomKey::SHIFT, 0); + ui::DomKey::SHIFT); EXPECT_TRUE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); @@ -3315,7 +2520,7 @@ TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) { // Pressing a normal key should not hide overlay but disable normal modifier. SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::KEY_D, - ui::DomKey::CHARACTER, 'd'); + ui::DomKey::Constant<'d'>::Character); EXPECT_TRUE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); @@ -3336,17 +2541,17 @@ TEST_F(StickyKeysOverlayTest, ModifiersDisabled) { // Enable modifiers. SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT, - ui::DomKey::SHIFT, 0); + ui::DomKey::SHIFT); SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT, - ui::DomKey::SHIFT, 0); + ui::DomKey::SHIFT); SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT, - ui::DomKey::ALT, 0); + ui::DomKey::ALT); SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::OS_LEFT, - ui::DomKey::OS, 0); + ui::DomKey::OS); SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::OS_LEFT, - ui::DomKey::OS, 0); + ui::DomKey::OS); EXPECT_TRUE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, @@ -3360,17 +2565,17 @@ TEST_F(StickyKeysOverlayTest, ModifiersDisabled) { // Disable modifiers and overlay should be hidden. SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, - ui::DomKey::CONTROL, 0); + ui::DomKey::CONTROL); SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT, - ui::DomKey::SHIFT, 0); + ui::DomKey::SHIFT); SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT, - ui::DomKey::ALT, 0); + ui::DomKey::ALT); SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT, - ui::DomKey::ALT, 0); + ui::DomKey::ALT); SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::OS_LEFT, - ui::DomKey::OS, 0); + ui::DomKey::OS); EXPECT_FALSE(overlay_->is_visible()); EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, diff --git a/chrome/browser/chromeos/events/keyboard_driven_event_rewriter.cc b/chrome/browser/chromeos/events/keyboard_driven_event_rewriter.cc index a2cf5bf..9a10aa7 100644 --- a/chrome/browser/chromeos/events/keyboard_driven_event_rewriter.cc +++ b/chrome/browser/chromeos/events/keyboard_driven_event_rewriter.cc @@ -81,7 +81,6 @@ ui::EventRewriteStatus KeyboardDrivenEventRewriter::Rewrite( flags & ~(ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN), key_event.code(), key_event.GetDomKey(), - key_event.GetCharacter(), key_event.key_code()}; chromeos::EventRewriter::BuildRewrittenKeyEvent(key_event, state, diff --git a/chrome/browser/chromeos/input_method/input_method_engine.cc b/chrome/browser/chromeos/input_method/input_method_engine.cc index 8d85220..4fc93b2 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine.cc +++ b/chrome/browser/chromeos/input_method/input_method_engine.cc @@ -309,18 +309,10 @@ bool InputMethodEngine::SendKeyEvents( flags |= event.shift_key ? ui::EF_SHIFT_DOWN : ui::EF_NONE; flags |= event.caps_lock ? ui::EF_CAPS_LOCK_DOWN : ui::EF_NONE; - base::char16 ch = 0; - // 4-bytes UTF-8 string is at least 2-characters UTF-16 string. - // And Key char can only be single UTF-16 character. - if (!event.key.empty() && event.key.size() < 4) { - base::string16 key_char = base::UTF8ToUTF16(event.key); - if (key_char.size() == 1) - ch = key_char[0]; - } ui::KeyEvent ui_event( type, key_code, ui::KeycodeConverter::CodeStringToDomCode(event.code.c_str()), flags, - ui::KeycodeConverter::KeyStringToDomKey(event.key.c_str()), ch, + ui::KeycodeConverter::KeyStringToDomKey(event.key.c_str()), ui::EventTimeForNow()); base::AutoReset<const ui::KeyEvent*> reset_sent_key(&sent_key_event_, &ui_event); diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 5be1e02..111b414 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1904,6 +1904,7 @@ '../net/net.gyp:net', '../third_party/zlib/google/zip.gyp:zip', '../ui/base/ui_base.gyp:ui_base', + '../ui/events/events.gyp:dom_keycode_converter', '../ui/events/events.gyp:events_base', '../ui/events/ozone/events_ozone.gyp:events_ozone_layout', '../ui/gfx/gfx.gyp:gfx', diff --git a/chrome/test/chromedriver/BUILD.gn b/chrome/test/chromedriver/BUILD.gn index 42ca016..20a1d82 100644 --- a/chrome/test/chromedriver/BUILD.gn +++ b/chrome/test/chromedriver/BUILD.gn @@ -162,6 +162,7 @@ source_set("lib") { "//net:http_server", "//third_party/zlib", "//ui/base", + "//ui/events:dom_keycode_converter", "//ui/events:events_base", "//ui/gfx", "//ui/gfx/geometry", diff --git a/chrome/test/chromedriver/keycode_text_conversion_ozone.cc b/chrome/test/chromedriver/keycode_text_conversion_ozone.cc index 0f15a1f..15217e8 100644 --- a/chrome/test/chromedriver/keycode_text_conversion_ozone.cc +++ b/chrome/test/chromedriver/keycode_text_conversion_ozone.cc @@ -10,6 +10,7 @@ #include "chrome/test/chromedriver/keycode_text_conversion.h" #include "ui/events/event_constants.h" #include "ui/events/keycodes/dom/dom_code.h" +#include "ui/events/keycodes/dom/keycode_converter.h" #include "ui/events/keycodes/keyboard_code_conversion.h" #include "ui/events/ozone/layout/keyboard_layout_engine.h" #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h" @@ -32,13 +33,12 @@ bool ConvertKeyCodeToText(ui::KeyboardCode key_code, if (modifiers & kShiftKeyModifierMask) event_flags |= ui::EF_SHIFT_DOWN; - ui::DomKey dom_key_ignored; - base::char16 str[2] = {'\0'}; + ui::DomKey dom_key; ui::KeyboardCode key_code_ignored; uint32 platform_keycode_ignored; - if (!keyboard_layout_engine->Lookup(dom_code, event_flags, &dom_key_ignored, - &str[0], &key_code_ignored, + if (!keyboard_layout_engine->Lookup(dom_code, event_flags, &dom_key, + &key_code_ignored, &platform_keycode_ignored)) { // Key codes like ui::VKEY_UNKNOWN need to be mapped to the empty string, so // even if the lookup fails we still need to return true here. @@ -46,13 +46,14 @@ bool ConvertKeyCodeToText(ui::KeyboardCode key_code, return true; } - if (!base::UTF16ToUTF8(str, base::c16len(str), text)) { + if (!dom_key.IsCharacter()) { *error_msg = base::StringPrintf( "unicode conversion failed for keycode %d with modifiers 0x%x", key_code, modifiers); return false; } + *text = ui::KeycodeConverter::DomKeyToKeyString(dom_key); return true; } diff --git a/content/browser/renderer_host/web_input_event_aura_unittest.cc b/content/browser/renderer_host/web_input_event_aura_unittest.cc index 88cc6e1..12e178d 100644 --- a/content/browser/renderer_host/web_input_event_aura_unittest.cc +++ b/content/browser/renderer_host/web_input_event_aura_unittest.cc @@ -135,7 +135,7 @@ TEST(WebInputEventAuraTest, MAYBE_TestMakeWebKeyboardEventWindowsKeyCode) { // Press left Ctrl. ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, 0, ui::EventTimeForNow()); + ui::DomKey::CONTROL, ui::EventTimeForNow()); blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); // ui::VKEY_LCONTROL, instead of ui::VKEY_CONTROL, should be filled. EXPECT_EQ(ui::VKEY_LCONTROL, webkit_event.windowsKeyCode); @@ -144,7 +144,7 @@ TEST(WebInputEventAuraTest, MAYBE_TestMakeWebKeyboardEventWindowsKeyCode) { // Press right Ctrl. ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT, ui::EF_CONTROL_DOWN, - ui::DomKey::CONTROL, 0, ui::EventTimeForNow()); + ui::DomKey::CONTROL, ui::EventTimeForNow()); blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); // ui::VKEY_RCONTROL, instead of ui::VKEY_CONTROL, should be filled. EXPECT_EQ(ui::VKEY_RCONTROL, webkit_event.windowsKeyCode); diff --git a/ui/base/ime/chromeos/character_composer.cc b/ui/base/ime/chromeos/character_composer.cc index 20b27ef..cfb208e 100644 --- a/ui/base/ime/chromeos/character_composer.cc +++ b/ui/base/ime/chromeos/character_composer.cc @@ -110,8 +110,7 @@ bool CharacterComposer::FilterKeyPress(const ui::KeyEvent& event) { bool CharacterComposer::FilterKeyPressSequenceMode(const KeyEvent& event) { DCHECK(composition_mode_ == KEY_SEQUENCE_MODE); - compose_buffer_.push_back( - KeystrokeMeaning(event.GetDomKey(), event.GetCharacter())); + compose_buffer_.push_back(event.GetDomKey()); // Check compose table. uint32 composed_character_utf32 = 0; @@ -214,17 +213,22 @@ ComposeChecker::CheckSequenceResult TreeComposeChecker::CheckSequence( DCHECK(tree_index < data_.tree_entries); // If we are looking up a dead key, skip over the character tables. - if (keystroke.key == ui::DomKey::DEAD) { + int32_t character = -1; + if (keystroke.IsDeadKey()) { tree_index += 2 * data_.tree[tree_index] + 1; // internal unicode table tree_index += 2 * data_.tree[tree_index] + 1; // leaf unicode table - } else if (keystroke.key != ui::DomKey::CHARACTER) { - return CheckSequenceResult::NO_MATCH; + character = keystroke.ToDeadKeyCombiningCharacter(); + } else if (keystroke.IsCharacter()) { + character = keystroke.ToCharacter(); } + if (character < 0 || character > 0xFFFF) + return CheckSequenceResult::NO_MATCH; // Check the internal subtree table. uint16_t result = 0; uint16_t entries = data_.tree[tree_index++]; - if (entries && Find(tree_index, entries, keystroke.character, &result)) { + if (entries && + Find(tree_index, entries, static_cast<uint16_t>(character), &result)) { tree_index = result; continue; } @@ -232,7 +236,8 @@ ComposeChecker::CheckSequenceResult TreeComposeChecker::CheckSequence( // Skip over the internal subtree table and check the leaf table. tree_index += 2 * entries; entries = data_.tree[tree_index++]; - if (entries && Find(tree_index, entries, keystroke.character, &result)) { + if (entries && + Find(tree_index, entries, static_cast<uint16_t>(character), &result)) { *composed_character = result; return CheckSequenceResult::FULL_MATCH; } diff --git a/ui/base/ime/chromeos/character_composer.h b/ui/base/ime/chromeos/character_composer.h index bcb4db9..78fae69 100644 --- a/ui/base/ime/chromeos/character_composer.h +++ b/ui/base/ime/chromeos/character_composer.h @@ -9,21 +9,16 @@ #include "base/strings/string_util.h" #include "ui/base/ime/ui_base_ime_export.h" +#include "ui/events/keycodes/dom/dom_key.h" namespace ui { class KeyEvent; -enum class DomKey; // A class to recognize compose and dead key sequence. // Outputs composed character. class UI_BASE_IME_EXPORT CharacterComposer { public: - struct KeystrokeMeaning { - KeystrokeMeaning(DomKey k, base::char16 c) : key(k), character(c) {} - DomKey key; - base::char16 character; - }; - using ComposeBuffer = std::vector<KeystrokeMeaning>; + using ComposeBuffer = std::vector<DomKey>; CharacterComposer(); ~CharacterComposer(); @@ -68,7 +63,7 @@ class UI_BASE_IME_EXPORT CharacterComposer { void UpdatePreeditStringHexMode(); // Remembers keypresses previously filtered. - std::vector<KeystrokeMeaning> compose_buffer_; + std::vector<DomKey> compose_buffer_; // Records hexadecimal digits previously filtered. std::vector<unsigned int> hex_buffer_; diff --git a/ui/base/ime/chromeos/character_composer_unittest.cc b/ui/base/ime/chromeos/character_composer_unittest.cc index 1e305c7..51b585f 100644 --- a/ui/base/ime/chromeos/character_composer_unittest.cc +++ b/ui/base/ime/chromeos/character_composer_unittest.cc @@ -34,7 +34,8 @@ class CharacterComposerTest : public testing::Test { KeyEvent* DeadKeyPress(base::char16 combining_character) const { KeyEvent* event = new KeyEvent(ET_KEY_PRESSED, VKEY_UNKNOWN, DomCode::NONE, EF_NONE, - DomKey::DEAD, combining_character, EventTimeForNow()); + DomKey::DeadKeyFromCombiningCharacter(combining_character), + EventTimeForNow()); return event; } @@ -59,7 +60,7 @@ class CharacterComposerTest : public testing::Test { int flags, base::char16 character) const { KeyEvent* event = new KeyEvent(ET_KEY_PRESSED, vkey, code, flags, - CharacterToDomKey(character), character, + DomKey::FromCharacter(character), EventTimeForNow()); return event; } diff --git a/ui/events/event.cc b/ui/events/event.cc index 8b5b47d..383e373 100644 --- a/ui/events/event.cc +++ b/ui/events/event.cc @@ -673,9 +673,7 @@ KeyEvent::KeyEvent(const base::NativeEvent& native_event) key_code_(KeyboardCodeFromNative(native_event)), code_(CodeFromNative(native_event)), is_char_(IsCharFromNative(native_event)), - platform_keycode_(PlatformKeycodeFromNative(native_event)), - key_(DomKey::NONE), - character_(0) { + platform_keycode_(PlatformKeycodeFromNative(native_event)) { if (IsRepeated(*this)) set_flags(flags() | ui::EF_IS_REPEAT); @@ -685,7 +683,7 @@ KeyEvent::KeyEvent(const base::NativeEvent& native_event) #if defined(OS_WIN) // Only Windows has native character events. if (is_char_) - character_ = native_event.wParam; + key_ = DomKey::FromCharacter(native_event.wParam); #endif } @@ -694,11 +692,7 @@ KeyEvent::KeyEvent(EventType type, int flags) : Event(type, EventTimeForNow(), flags), key_code_(key_code), - code_(UsLayoutKeyboardCodeToDomCode(key_code)), - is_char_(false), - platform_keycode_(0), - key_(DomKey::NONE), - character_() { + code_(UsLayoutKeyboardCodeToDomCode(key_code)) { } KeyEvent::KeyEvent(EventType type, @@ -707,11 +701,7 @@ KeyEvent::KeyEvent(EventType type, int flags) : Event(type, EventTimeForNow(), flags), key_code_(key_code), - code_(code), - is_char_(false), - platform_keycode_(0), - key_(DomKey::NONE), - character_(0) { + code_(code) { } KeyEvent::KeyEvent(EventType type, @@ -719,15 +709,11 @@ KeyEvent::KeyEvent(EventType type, DomCode code, int flags, DomKey key, - base::char16 character, base::TimeDelta time_stamp) : Event(type, time_stamp, flags), key_code_(key_code), code_(code), - is_char_(false), - platform_keycode_(0), - key_(key), - character_(character) { + key_(key) { } KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags) @@ -735,9 +721,7 @@ KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags) key_code_(key_code), code_(DomCode::NONE), is_char_(true), - platform_keycode_(0), - key_(DomKey::CHARACTER), - character_(character) { + key_(DomKey::FromCharacter(character)) { } KeyEvent::KeyEvent(const KeyEvent& rhs) @@ -746,8 +730,7 @@ KeyEvent::KeyEvent(const KeyEvent& rhs) code_(rhs.code_), is_char_(rhs.is_char_), platform_keycode_(rhs.platform_keycode_), - key_(rhs.key_), - character_(rhs.character_) { + key_(rhs.key_) { if (rhs.extended_key_event_data_) extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); } @@ -760,7 +743,6 @@ KeyEvent& KeyEvent::operator=(const KeyEvent& rhs) { key_ = rhs.key_; is_char_ = rhs.is_char_; platform_keycode_ = rhs.platform_keycode_; - character_ = rhs.character_; if (rhs.extended_key_event_data_) extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); @@ -775,14 +757,6 @@ void KeyEvent::SetExtendedKeyEventData(scoped_ptr<ExtendedKeyEventData> data) { } void KeyEvent::ApplyLayout() const { - // If the client has set the character (e.g. faked key events from virtual - // keyboard), it's client's responsibility to set the dom key correctly. - // Otherwise, set the dom key as unidentified. - // Please refer to crbug.com/443889. - if (character_ != 0) { - key_ = DomKey::UNIDENTIFIED; - return; - } ui::DomCode code = code_; if (code == DomCode::NONE) { // Catch old code that tries to do layout without a physical key, and try @@ -806,13 +780,12 @@ void KeyEvent::ApplyLayout() const { // returns 'a' for VKEY_A even if the key is actually bound to 'à ' in X11. // GetCharacterFromXEvent returns 'à ' in that case. if (!IsControlDown() && native_event()) { - GetMeaningFromXEvent(native_event(), &key_, &character_); + key_ = GetDomKeyFromXEvent(native_event()); return; } #elif defined(USE_OZONE) if (KeyboardLayoutEngineManager::GetKeyboardLayoutEngine()->Lookup( - code, flags(), &key_, &character_, &dummy_key_code, - &platform_keycode_)) { + code, flags(), &key_, &dummy_key_code, &platform_keycode_)) { return; } #else @@ -821,33 +794,38 @@ void KeyEvent::ApplyLayout() const { EventTypeFromNative(native_event()) == ET_KEY_RELEASED); } #endif - if (!DomCodeToUsLayoutMeaning(code, flags(), &key_, &character_, - &dummy_key_code)) { + if (!DomCodeToUsLayoutDomKey(code, flags(), &key_, &dummy_key_code)) key_ = DomKey::UNIDENTIFIED; - } } DomKey KeyEvent::GetDomKey() const { - // Determination of character_ and key_ may be done lazily. + // Determination of key_ may be done lazily. if (key_ == DomKey::NONE) ApplyLayout(); return key_; } base::char16 KeyEvent::GetCharacter() const { - // Determination of character_ and key_ may be done lazily. + // Determination of key_ may be done lazily. if (key_ == DomKey::NONE) ApplyLayout(); - return character_; + if (key_.IsCharacter()) { + // Historically ui::KeyEvent has held only BMP characters. + // Until this explicitly changes, require |key_| to hold a BMP character. + DomKey::Base utf32_character = key_.ToCharacter(); + base::char16 ucs2_character = static_cast<base::char16>(utf32_character); + DCHECK(static_cast<DomKey::Base>(ucs2_character) == utf32_character); + return ucs2_character; + } + return 0; } base::char16 KeyEvent::GetText() const { if ((flags() & EF_CONTROL_DOWN) != 0) { - base::char16 character; ui::DomKey key; ui::KeyboardCode key_code; - if (DomCodeToControlCharacter(code_, flags(), &key, &character, &key_code)) - return character; + if (DomCodeToControlCharacter(code_, flags(), &key, &key_code)) + return key.ToCharacter(); } return GetUnmodifiedText(); } @@ -908,7 +886,7 @@ KeyboardCode KeyEvent::GetLocatedWindowsKeyboardCode() const { uint16 KeyEvent::GetConflatedWindowsKeyCode() const { if (is_char_) - return character_; + return key_.ToCharacter(); return key_code_; } diff --git a/ui/events/event.h b/ui/events/event.h index 0667824..d06a181 100644 --- a/ui/events/event.h +++ b/ui/events/event.h @@ -15,6 +15,7 @@ #include "ui/events/event_constants.h" #include "ui/events/gesture_event_details.h" #include "ui/events/gestures/gesture_types.h" +#include "ui/events/keycodes/dom/dom_key.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/events/latency_info.h" #include "ui/gfx/geometry/point.h" @@ -27,7 +28,6 @@ class Transform; namespace ui { class EventTarget; enum class DomCode; -enum class DomKey; class EVENTS_EXPORT Event { public: @@ -659,40 +659,38 @@ class EVENTS_EXPORT ExtendedKeyEventData { // or a character event (is_char_ == true). // // For a keystroke event, -// -- is_char_ is false. -// -- Event::type() can be any one of ET_KEY_PRESSED, ET_KEY_RELEASED. -// -- code_ and Event::flags() represent the physical key event. +// -- |bool is_char_| is false. +// -- |EventType Event::type()| can be ET_KEY_PRESSED or ET_KEY_RELEASED. +// -- |DomCode code_| and |int Event::flags()| represent the physical key event. // - code_ is a platform-independent representation of the physical key, -// based on DOM KeyboardEvent |code| values. It does not vary depending -// on key layout. +// based on DOM UI Events KeyboardEvent |code| values. It does not +// vary depending on key layout. +// http://www.w3.org/TR/DOM-Level-3-Events-code/ // - Event::flags() provides the active modifiers for the physical key // press. Its value reflects the state after the event; that is, for // a modifier key, a press includes the corresponding flag and a release // does not. -// -- key_ and character_ provide the meaning of the key event, in the context -// of the active layout and modifiers. Together they correspond to DOM -// KeyboardEvent |key| values. -// - key_ is an enumeration of non-Unicode meanings, plus sentinels -// (specifically DomKey::CHARACTER for Unicode meanings). -// - character_ is the code point for Unicode meanings. -// -- key_code_ is a KeyboardCode value associated with the key. This supports -// the legacy web event |keyCode| field, and the VKEY_ values are chosen -// to match Windows/IE for compatibility. For printable characters, this -// may or may not be a layout-mapped value, imitating MS Windows: -// if the mapped key generates a character that has an associated VKEY_ -// code, then key_code_ is that code; if not, then key_code_ is the unmapped -// VKEY_ code. For example, US, Greek, Cyrillic, Japanese, etc. all use -// VKEY_Q for the key beside Tab, while French uses VKEY_A. The stored -// key_code_ is non-located (e.g. VKEY_SHIFT rather than VKEY_LSHIFT, -// VKEY_1 rather than VKEY_NUMPAD1). +// -- |DomKey key_| provides the meaning (character or action) of the key +// event, in the context of the active layout and modifiers. It corresponds +// to DOM UI Events KeyboardEvent |key| values. +// http://www.w3.org/TR/DOM-Level-3-Events-key/ +// -- |KeyboardCode key_code_| supports the legacy web event |keyCode| field, +// and its VKEY_ values are chosen to match Windows/IE for compatibility. +// For printable characters, this may or may not be a layout-mapped value, +// imitating MS Windows: if the mapped key generates a character that has +// an associated VKEY_ code, then key_code_ is that code; if not, then +// key_code_ is the unmapped VKEY_ code. For example, US, Greek, Cyrillic, +// Japanese, etc. all use VKEY_Q for the key beside Tab, while French uses +// VKEY_A. The stored key_code_ is non-located (e.g. VKEY_SHIFT rather than +// VKEY_LSHIFT, VKEY_1 rather than VKEY_NUMPAD1). // // For a character event, -// -- is_char_ is true. -// -- type() is ET_KEY_PRESSED. -// -- code_ is DomCode::NONE. -// -- key_ is DomKey::CHARACTER and character_ is a UTF-16 code point. -// -- key_code_ is conflated with character_ by some code, because both -// arrive in the wParam field of a Windows event. +// -- |bool is_char_| is true. +// -- |EventType Event::type()| is ET_KEY_PRESSED. +// -- |DomCode code_| is DomCode::NONE. +// -- |DomKey key_| is a UTF-16 code point. +// -- |KeyboardCode key_code_| is conflated with the character-valued key_ +// by some code, because both arrive in the wParam field of a Windows event. // class EVENTS_EXPORT KeyEvent : public Event { public: @@ -701,7 +699,8 @@ class EVENTS_EXPORT KeyEvent : public Event { // (WM_CHAR). Other systems have only keystroke events. explicit KeyEvent(const base::NativeEvent& native_event); - // Create a keystroke event. + // Create a keystroke event from a legacy KeyboardCode. + // This should not be used in new code. KeyEvent(EventType type, KeyboardCode key_code, int flags); // Create a fully defined keystroke event. @@ -710,7 +709,6 @@ class EVENTS_EXPORT KeyEvent : public Event { DomCode code, int flags, DomKey key, - base::char16 character, base::TimeDelta time_stamp); // Create a character event. @@ -744,7 +742,9 @@ class EVENTS_EXPORT KeyEvent : public Event { // which allows an I18N virtual keyboard to fabricate a keyboard event that // does not have a corresponding KeyboardCode (example: U+00E1 Latin small // letter A with acute, U+0410 Cyrillic capital letter A). - void set_character(base::char16 character) { character_ = character; } + void set_character(base::char16 character) { + key_ = DomKey::FromCharacter(character); + } // Gets the character generated by this key event. It only supports Unicode // BMP characters. @@ -760,6 +760,7 @@ class EVENTS_EXPORT KeyEvent : public Event { base::char16 GetText() const; // Gets the platform key code. For XKB, this is the xksym value. + // This should not be used in new code. void set_platform_keycode(uint32 keycode) { platform_keycode_ = keycode; } uint32 platform_keycode() const { return platform_keycode_; } @@ -810,7 +811,7 @@ class EVENTS_EXPORT KeyEvent : public Event { void set_is_char(bool is_char) { is_char_ = is_char; } private: - // Determine key_ and character_ on a keystroke event from code_ and flags(). + // Determine key_ on a keystroke event from code_ and flags(). void ApplyLayout() const; KeyboardCode key_code_; @@ -823,13 +824,13 @@ class EVENTS_EXPORT KeyEvent : public Event { DomCode code_; // True if this is a character event, false if this is a keystroke event. - bool is_char_; + bool is_char_ = false; // The platform related keycode value. For XKB, it's keysym value. // For now, this is used for CharacterComposer in ChromeOS. - mutable uint32 platform_keycode_; + mutable uint32 platform_keycode_ = 0; - // TODO(kpschoedel): refactor so that key_ and character_ are not mutable. + // TODO(kpschoedel): refactor so that key_ is not mutable. // This requires defining the KeyEvent completely at construction rather // than lazily under GetCharacter(), which likely also means removing // the two 'incomplete' constructors. crbug.com/444045 @@ -837,20 +838,11 @@ class EVENTS_EXPORT KeyEvent : public Event { // DOM KeyboardEvent |key| // http://www.w3.org/TR/DOM-Level-3-Events-key/ // - // This value, together with character_, represents the meaning of a key. - // The value is DomKey::CHARACTER when the interpretation is a character. - // This, along with character_, is not necessarily initialized when the - // event is constructed; it may be set only if and when GetCharacter() - // or GetDomKey() is called. - mutable DomKey key_; - - // String of 'key' defined in DOM KeyboardEvent (e.g. 'a', 'â') - // http://www.w3.org/TR/uievents/#keyboard-key-codes. - // - // This value represents the text that the key event will insert to input - // field. For key with modifier key, it may have specifial text. - // e.g. CTRL+A has '\x01'. - mutable base::char16 character_; + // This value represents the meaning of a key, which is either a Unicode + // character, or a named DomKey:: value. + // This is not necessarily initialized when the event is constructed; + // it may be set only if and when GetCharacter() or GetDomKey() is called. + mutable DomKey key_ = DomKey::NONE; // Parts of our event handling require raw native events (see both the // windows and linux implementations of web_input_event in content/). Because diff --git a/ui/events/keycodes/dom/dom_key.h b/ui/events/keycodes/dom/dom_key.h index 25ea092..9c88478 100644 --- a/ui/events/keycodes/dom/dom_key.h +++ b/ui/events/keycodes/dom/dom_key.h @@ -5,13 +5,154 @@ #ifndef UI_EVENTS_KEYCODES_DOM3_DOM_KEY_H_ #define UI_EVENTS_KEYCODES_DOM3_DOM_KEY_H_ +#include <stdint.h> + +#include "base/logging.h" + namespace ui { +// Integer representation of UI Events KeyboardEvent.key value. +// +// The semantics follow the web string form[1]: the value is either a +// Unicode character or one of a defined set of additional values[2]. +// There is one notable difference from the UI Events string key: for +// the 'Dead' key, this type provides a whole range of values that also +// encode the associated combining character. (They are not quite the +// same thing: a dead key is a non-printing operator that modifies a +// subsequent printing character, whereas a Unicode combining character +// is a printable character in its own right that attaches to a preceding +// character in a string.) This allows the interpretation of any keystroke +// to be carried as a single integer value. +// +// DomKey::NONE is a sentinel used to indicate an error or undefined value. +// It is not the same as Unicode code point 0 (ASCII NUL) or the valid DOM +// key 'Unidentified'. +// +// References: +// [1] http://www.w3.org/TR/uievents/#widl-KeyboardEvent-key +// [2] http://www.w3.org/TR/DOM-Level-3-Events-key/ +// +class DomKey { + public: + using Base = int32_t; + + private: + // Integer representation of DomKey. This is arranged so that DomKey encoded + // values are distinct from Unicode code points, so that we can dynamically + // verify that they are not accidentally conflated. + // + // 31 24 16 8 0 + // | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + // | z |c|s| v | + // + // From low to high: + // - |v| is a value whose interpretation depends on the kind of key: + // - for a Unicode value, it is the code point (0 <= v <= 0x10FFFF); + // - for a dead key, the code point of the associated combining character; + // - for others, an arbitrary distinct value. + // - |s| is set for a valid symbolic key (i.e. not a Unicode character). + // - |c| is set if |v| holds a code point (for either a Unicode character + // directly, or a dead-key combining character). + // - |z| is reserved and always zero. + // + // As consequences of this representation, + // - all valid DomKey encodings have at least one of |c| or |s| set, so + // they can't be confused with raw Unicode characters (where both are 0). + // - integer 0 is not a valid encoding, and can be used for DomKey::NONE. + // + enum { VALUE_BITS = 21 }; + enum Type : Base { + VALUE_MASK = (1L << VALUE_BITS) - 1, + TF_SYMBOLIC = (1L << VALUE_BITS), + TF_CODEPOINT = (1L << (VALUE_BITS + 1)), + TYPE_MASK = TF_CODEPOINT | TF_SYMBOLIC, + TYPE_UNICODE = TF_CODEPOINT, + TYPE_NON_UNICODE = TF_SYMBOLIC, + TYPE_DEAD = TF_CODEPOINT | TF_SYMBOLIC, + }; + static_assert(TYPE_UNICODE != 0 && TYPE_NON_UNICODE != 0 && TYPE_DEAD != 0, + "suspicious representation change"); + + public: + enum InvalidKey : Base { NONE = 0 }; +// |dom_key_data.inc| describes the non-printable DomKey values, and is +// included here to create constants for them in the DomKey:: scope. +#define DOM_KEY_MAP_DECLARATION enum Key : Base +#define DOM_KEY_UNI(key, id, value) id = (TYPE_UNICODE | (value)) +#define DOM_KEY_MAP_BEGIN FIRST_NON_UNICODE = TYPE_NON_UNICODE, #define DOM_KEY_MAP(key, id) id -#define DOM_KEY_MAP_DECLARATION enum class DomKey +#define DOM_KEY_MAP_END LAST_NON_UNICODE #include "ui/events/keycodes/dom/dom_key_data.inc" -#undef DOM_KEY_MAP #undef DOM_KEY_MAP_DECLARATION +#undef DOM_KEY_MAP_BEGIN +#undef DOM_KEY_MAP +#undef DOM_KEY_MAP_END +#undef DOM_KEY_UNI + + // Create a DomKey, with the undefined-value sentinel DomKey::NONE. + DomKey() : value_(NONE) {} + + // Create a DomKey from an encoded integer value. This is implicit so + // that DomKey::NAME constants don't need to be explicitly converted + // to DomKey. + DomKey(Base value) : value_(value) { + DCHECK(value == 0 || IsValid()) << value; + } + + // Obtain the encoded integer representation of the DomKey. + operator Base() const { return value_; } + + // True if the value is a valid DomKey (which excludes DomKey::NONE and + // integers not following the DomKey format). + bool IsValid() const { return (value_ & TYPE_MASK) != 0; } + + // True if the value is a Unicode code point. + bool IsCharacter() const { return (value_ & TYPE_MASK) == TYPE_UNICODE; } + + // True if the value is a dead key. + bool IsDeadKey() const { return (value_ & TYPE_MASK) == TYPE_DEAD; } + + // Returns the Unicode code point for a Unicode key. + // It is incorrect to call this for other kinds of key. + int32_t ToCharacter() const { + DCHECK(IsCharacter()) << value_; + return value_ & VALUE_MASK; + } + + // Returns the associated combining code point for a dead key. + // It is incorrect to call this for other kinds of key. + int32_t ToDeadKeyCombiningCharacter() const { + DCHECK(IsDeadKey()) << value_; + return value_ & VALUE_MASK; + } + + // Returns a DomKey for the given Unicode character. + static DomKey FromCharacter(int32_t character) { + DCHECK(character >= 0 && character <= 0x10FFFF); + return DomKey(TYPE_UNICODE | character); + } + + // Returns a dead-key DomKey for the given combining character. + static DomKey DeadKeyFromCombiningCharacter(int32_t combining_character) { + DCHECK(combining_character >= 0 && combining_character <= 0x10FFFF); + return DomKey(TYPE_DEAD | combining_character); + } + + // Provide means to generate constant DomKey::Base values, primarily to + // allow conversion tables to be constant, without startup construction. + // In the future (cue the theremin) this can be replaced with constexpr + // functions. + template<Base C> struct Constant { + enum : Base { + Character = TYPE_UNICODE | C, + Dead = TYPE_DEAD | C, + }; + }; + + private: + Base value_; +}; } // namespace ui diff --git a/ui/events/keycodes/dom/dom_key_data.inc b/ui/events/keycodes/dom/dom_key_data.inc index a035ecb..c4a8450 100644 --- a/ui/events/keycodes/dom/dom_key_data.inc +++ b/ui/events/keycodes/dom/dom_key_data.inc @@ -21,17 +21,20 @@ DOM_KEY_MAP_DECLARATION { - // The first entry, whose enum value will be zero, is reserved to mean - // no value; there is no corresponding DOM string. (This is not the same - // as the valid DOM .key value 'Unidentified'.) - - // Key Enum - DOM_KEY_MAP(nullptr, NONE), // No value - - // A value of DomKey::CHARACTER indicates that the KeyboardEvent |key| - // string is determined by the Unicode character interpretation and is - // not one of the fixed string values. - DOM_KEY_MAP(nullptr, CHARACTER), + // To avoid ambiguities, a small number of .key values that do have + // standard names are encoded identical to corresponding Unicode characters; + // for example, DomKey('\t') == DomKey::TAB. + // + // Key Enum Unicode code point + DOM_KEY_UNI("Backspace", BACKSPACE, 0x0008), + DOM_KEY_UNI("Tab", TAB, 0x0009), + DOM_KEY_UNI("Enter", ENTER, 0x000D), + DOM_KEY_UNI("Escape", ESCAPE, 0x001B), + // The enum constant for 'Delete' (Forward Delete) is named DEL because + // DELETE conflicts with an unscoped declaration in Windows' <windows.h>. + DOM_KEY_UNI("Delete", DEL, 0x007F), + + DOM_KEY_MAP_BEGIN // ========================================================= // Special Key Values @@ -84,9 +87,9 @@ DOM_KEY_MAP_DECLARATION { // ============================================================ // Key Enum - DOM_KEY_MAP("Enter", ENTER), // Enter, Return + // "Enter" is encoded in the Unicode space (at the end of this list). DOM_KEY_MAP("Separator", SEPARATOR), - DOM_KEY_MAP("Tab", TAB), + // "Tab" is encoded in the Unicode space. // ============================================================ // Navigation Keys @@ -109,13 +112,12 @@ DOM_KEY_MAP_DECLARATION { // ========================================================= // Key Enum - DOM_KEY_MAP("Backspace", BACKSPACE), + // "Backspace" is encoded in the Unicode space. DOM_KEY_MAP("Clear", CLEAR), DOM_KEY_MAP("Copy", COPY), DOM_KEY_MAP("CrSel", CR_SEL), // Cursor Select DOM_KEY_MAP("Cut", CUT), - // Delete (Forward Delete) named DEL because DELETE conflicts with <windows.h> - DOM_KEY_MAP("Delete", DEL), + // "Delete" is encoded in the Unicode space. DOM_KEY_MAP("EraseEof", ERASE_EOF), // Erase to End of Field DOM_KEY_MAP("ExSel", EX_SEL), // Extend Selection DOM_KEY_MAP("Insert", INSERT), @@ -134,7 +136,7 @@ DOM_KEY_MAP_DECLARATION { DOM_KEY_MAP("Attn", ATTN), // Attention DOM_KEY_MAP("Cancel", CANCEL), DOM_KEY_MAP("ContextMenu", CONTEXT_MENU), - DOM_KEY_MAP("Escape", ESCAPE), + // "Escape" is encoded in the Unicode space. DOM_KEY_MAP("Execute", EXECUTE), DOM_KEY_MAP("Find", FIND), DOM_KEY_MAP("Help", HELP), @@ -174,7 +176,7 @@ DOM_KEY_MAP_DECLARATION { DOM_KEY_MAP("CodeInput", CODE_INPUT), DOM_KEY_MAP("Compose", COMPOSE), DOM_KEY_MAP("Convert", CONVERT), - DOM_KEY_MAP("Dead", DEAD), + // "Dead" is represented as a flag plus combining character. DOM_KEY_MAP("FinalMode", FINAL_MODE), DOM_KEY_MAP("GroupFirst", GROUP_FIRST), DOM_KEY_MAP("GroupLast", GROUP_LAST), @@ -387,4 +389,6 @@ DOM_KEY_MAP_DECLARATION { DOM_KEY_MAP("VideoModeNext", VIDEO_MODE_NEXT), DOM_KEY_MAP("Wink", WINK), DOM_KEY_MAP("ZoomToggle", ZOOM_TOGGLE), + + DOM_KEY_MAP_END }; diff --git a/ui/events/keycodes/dom/keycode_converter.cc b/ui/events/keycodes/dom/keycode_converter.cc index 9aef53f..0ce3452 100644 --- a/ui/events/keycodes/dom/keycode_converter.cc +++ b/ui/events/keycodes/dom/keycode_converter.cc @@ -5,6 +5,7 @@ #include "ui/events/keycodes/dom/keycode_converter.h" #include "base/logging.h" +#include "base/strings/utf_string_conversion_utils.h" #include "ui/events/keycodes/dom/dom_code.h" #include "ui/events/keycodes/dom/dom_key.h" @@ -36,11 +37,17 @@ struct DomKeyMapEntry { const char* string; }; -#define DOM_KEY_MAP(key, id) {DomKey::id, key} #define DOM_KEY_MAP_DECLARATION const DomKeyMapEntry dom_key_map[] = +#define DOM_KEY_UNI(key, id, value) {DomKey::id, key} +#define DOM_KEY_MAP_BEGIN +#define DOM_KEY_MAP(key, id) {DomKey::id, key} +#define DOM_KEY_MAP_END #include "ui/events/keycodes/dom/dom_key_data.inc" -#undef DOM_KEY_MAP #undef DOM_KEY_MAP_DECLARATION +#undef DOM_KEY_MAP_BEGIN +#undef DOM_KEY_MAP +#undef DOM_KEY_MAP_END +#undef DOM_KEY_UNI const size_t kDomKeyMapEntries = arraysize(dom_key_map); @@ -166,22 +173,51 @@ DomKeyLocation KeycodeConverter::DomCodeToLocation(DomCode dom_code) { DomKey KeycodeConverter::KeyStringToDomKey(const char* key) { if (!key || !*key) return DomKey::NONE; + // Check for standard key names. for (size_t i = 0; i < kDomKeyMapEntries; ++i) { - if (dom_key_map[i].string && - strcmp(dom_key_map[i].string, key) == 0) { + if (dom_key_map[i].string && strcmp(dom_key_map[i].string, key) == 0) { return dom_key_map[i].dom_key; } } + if (strcmp(key, "Dead") == 0) { + // The web KeyboardEvent string does not encode the combining character, + // so we just set it to the Unicode designated non-character 0xFFFF. + // This will round-trip convert back to 'Dead' but take no part in + // character composition. + return DomKey::DeadKeyFromCombiningCharacter(0xFFFF); + } + // Otherwise, if the string contains a single Unicode character, + // the key value is that character. + int32_t char_index = 0; + uint32_t character; + if (base::ReadUnicodeCharacter(key, static_cast<int32_t>(strlen(key)), + &char_index, &character) && + key[++char_index] == 0) { + return DomKey::FromCharacter(character); + } return DomKey::NONE; } // static -const char* KeycodeConverter::DomKeyToKeyString(DomKey dom_key) { +std::string KeycodeConverter::DomKeyToKeyString(DomKey dom_key) { + if (dom_key.IsDeadKey()) { + // All dead-key combining codes collapse to 'Dead', as UI Events + // KeyboardEvent represents the combining character separately. + return "Dead"; + } for (size_t i = 0; i < kDomKeyMapEntries; ++i) { - if (dom_key_map[i].dom_key == dom_key) - return dom_key_map[i].string; + if (dom_key_map[i].dom_key == dom_key) { + if (dom_key_map[i].string) + return dom_key_map[i].string; + break; + } } - return ""; + if (dom_key.IsCharacter()) { + std::string s; + base::WriteUnicodeCharacter(dom_key.ToCharacter(), &s); + return s; + } + return std::string(); } // static diff --git a/ui/events/keycodes/dom/keycode_converter.h b/ui/events/keycodes/dom/keycode_converter.h index 71c3fd3..6a2547c 100644 --- a/ui/events/keycodes/dom/keycode_converter.h +++ b/ui/events/keycodes/dom/keycode_converter.h @@ -6,7 +6,10 @@ #define UI_EVENTS_KEYCODES_DOM4_KEYCODE_CONVERTER_H_ #include <stdint.h> +#include <string> + #include "base/basictypes.h" +#include "ui/events/keycodes/dom/dom_key.h" // For reference, the W3C UI Event spec is located at: // http://www.w3.org/TR/uievents/ @@ -14,7 +17,6 @@ namespace ui { enum class DomCode; -enum class DomKey; enum class DomKeyLocation { STANDARD, LEFT, RIGHT, NUMPAD }; @@ -64,10 +66,15 @@ class KeycodeConverter { static DomKeyLocation DomCodeToLocation(DomCode dom_code); // Convert a UI Events |key| string value into a DomKey. + // Accepts a character string containing either + // - a key name from http://www.w3.org/TR/DOM-Level-3-Events-key/, or + // - a single Unicode character (represented in UTF-8). + // Returns DomKey::NONE for other inputs, including |nullptr|. static DomKey KeyStringToDomKey(const char* key); // Convert a DomKey into a UI Events |key| string value. - static const char* DomKeyToKeyString(DomKey dom_key); + // For an invalid DomKey, returns an empty string. + static std::string DomKeyToKeyString(DomKey dom_key); // Returns true if the DomKey is a modifier. static bool IsDomKeyForModifier(DomKey dom_key); diff --git a/ui/events/keycodes/dom/keycode_converter_unittest.cc b/ui/events/keycodes/dom/keycode_converter_unittest.cc index f5da9a0..09dc5af 100644 --- a/ui/events/keycodes/dom/keycode_converter_unittest.cc +++ b/ui/events/keycodes/dom/keycode_converter_unittest.cc @@ -131,18 +131,68 @@ TEST(KeycodeConverter, DomCode) { } TEST(KeycodeConverter, DomKey) { - // Test invalid and unknown arguments to KeyStringToDomKey() - EXPECT_EQ(ui::DomKey::NONE, ui::KeycodeConverter::KeyStringToDomKey(nullptr)); - EXPECT_EQ(ui::DomKey::NONE, ui::KeycodeConverter::KeyStringToDomKey("-")); - // Round-trip test DOM Level 3 .key strings. + const struct { + ui::DomKey::Base key; + bool is_character; + bool is_dead; + bool test_to_string; + const char* const string; + } test_cases[] = { + // Invalid arguments to KeyStringToDomKey(). + {ui::DomKey::NONE, false, false, false, nullptr}, + {ui::DomKey::NONE, false, false, true, ""}, + {ui::DomKey::NONE, false, false, false, "?!?"}, + {ui::DomKey::NONE, false, false, false, "\x61\xCC\x81"}, + // Some single Unicode characters. + {ui::DomKey::Constant<'-'>::Character, true, false, true, "-"}, + {ui::DomKey::Constant<'A'>::Character, true, false, true, "A"}, + {ui::DomKey::Constant<0xE1>::Character, true, false, true, "\xC3\xA1"}, + {ui::DomKey::Constant<0x1F648>::Character, true, false, true, + "\xF0\x9F\x99\x88"}, + // Unicode-equivalent named values. + {ui::DomKey::BACKSPACE, true, false, true, "Backspace"}, + {ui::DomKey::TAB, true, false, true, "Tab"}, + {ui::DomKey::ENTER, true, false, true, "Enter"}, + {ui::DomKey::ESCAPE, true, false, true, "Escape"}, + {ui::DomKey::DEL, true, false, true, "Delete"}, + {ui::DomKey::BACKSPACE, true, false, false, "\b"}, + {ui::DomKey::TAB, true, false, false, "\t"}, + {ui::DomKey::ENTER, true, false, false, "\r"}, + {ui::DomKey::ESCAPE, true, false, false, "\x1B"}, + {ui::DomKey::DEL, true, false, false, "\x7F"}, + {ui::DomKey::Constant<'\b'>::Character, true, false, true, "Backspace"}, + {ui::DomKey::Constant<'\t'>::Character, true, false, true, "Tab"}, + {ui::DomKey::Constant<'\r'>::Character, true, false, true, "Enter"}, + {ui::DomKey::Constant<0x1B>::Character, true, false, true, "Escape"}, + {ui::DomKey::Constant<0x7F>::Character, true, false, true, "Delete"}, + // 'Dead' key. + {ui::DomKey::Constant<0xFFFF>::Dead, false, true, true, "Dead"}, + // Sample non-Unicode key names. + {ui::DomKey::SHIFT, false, false, true, "Shift"}, + {ui::DomKey::F16, false, false, true, "F16"}, + {ui::DomKey::ZOOM_IN, false, false, true, "ZoomIn"}, + {ui::DomKey::UNIDENTIFIED, false, false, true, "Unidentified"}, + }; + for (const auto& test : test_cases) { + // Check KeyStringToDomKey(). + ui::DomKey key = ui::KeycodeConverter::KeyStringToDomKey(test.string); + EXPECT_EQ(test.is_character, key.IsCharacter()); + EXPECT_EQ(test.is_dead, key.IsDeadKey()); + EXPECT_EQ(test.key, key); + // Check |DomKeyToKeyString()|. + if (test.test_to_string) { + std::string s(ui::KeycodeConverter::DomKeyToKeyString(test.key)); + EXPECT_STREQ(test.string, s.c_str()); + } + } + // Round-trip test all UI Events KeyboardEvent.key strings. const char* s = nullptr; for (size_t i = 0; - (s = ui::KeycodeConverter::DomKeyStringForTest(i)) != nullptr; - ++i) { + (s = ui::KeycodeConverter::DomKeyStringForTest(i)) != nullptr; ++i) { SCOPED_TRACE(i); ui::DomKey key = ui::KeycodeConverter::KeyStringToDomKey(s); if (s) { - EXPECT_STREQ(s, ui::KeycodeConverter::DomKeyToKeyString(key)); + EXPECT_STREQ(s, ui::KeycodeConverter::DomKeyToKeyString(key).c_str()); } else { EXPECT_EQ(ui::DomKey::NONE, key); } diff --git a/ui/events/keycodes/dom_us_layout_data.h b/ui/events/keycodes/dom_us_layout_data.h index f520dc7..d3fe962 100644 --- a/ui/events/keycodes/dom_us_layout_data.h +++ b/ui/events/keycodes/dom_us_layout_data.h @@ -8,7 +8,7 @@ namespace ui { // This table maps a DomCode to a printable character, assuming US layout. -// It is used by DomCodeToUsLayoutMeaning(), which provides a fallback +// It is used by DomCodeToUsLayoutDomKey(), which provides a fallback // interpretation when there is no other way to map a physical key. const struct PrintableCodeEntry { DomCode dom_code; @@ -88,12 +88,11 @@ const struct PrintableCodeEntry { }; // This table maps a DomCode to a DomKey, assuming US keyboard layout. -// It is used by DomCodeToUsLayoutMeaning(), which provides a fallback +// It is used by DomCodeToUsLayoutDomKey(), which provides a fallback // interpretation when there is no other way to map a physical key. const struct NonPrintableCodeEntry { DomCode dom_code; - DomKey dom_key; - base::char16 character; + DomKey::Base dom_key; } kNonPrintableCodeMap[] = { {DomCode::ABORT, DomKey::CANCEL}, {DomCode::AGAIN, DomKey::AGAIN}, @@ -103,7 +102,7 @@ const struct NonPrintableCodeEntry { {DomCode::ARROW_LEFT, DomKey::ARROW_LEFT}, {DomCode::ARROW_RIGHT, DomKey::ARROW_RIGHT}, {DomCode::ARROW_UP, DomKey::ARROW_UP}, - {DomCode::BACKSPACE, DomKey::BACKSPACE, 0x0008}, + {DomCode::BACKSPACE, DomKey::BACKSPACE}, {DomCode::BRIGHTNESS_DOWN, DomKey::BRIGHTNESS_DOWN}, {DomCode::BRIGHTNESS_UP, DomKey::BRIGHTNESS_UP}, // {DomCode::BRIGHTNESS_AUTO, DomKey::_} @@ -124,11 +123,11 @@ const struct NonPrintableCodeEntry { {DomCode::CONVERT, DomKey::CONVERT}, {DomCode::COPY, DomKey::COPY}, {DomCode::CUT, DomKey::CUT}, - {DomCode::DEL, DomKey::DEL, 0x007F}, + {DomCode::DEL, DomKey::DEL}, {DomCode::EJECT, DomKey::EJECT}, {DomCode::END, DomKey::END}, - {DomCode::ENTER, DomKey::ENTER, 0x000D}, - {DomCode::ESCAPE, DomKey::ESCAPE, 0x001B}, + {DomCode::ENTER, DomKey::ENTER}, + {DomCode::ESCAPE, DomKey::ESCAPE}, {DomCode::F1, DomKey::F1}, {DomCode::F2, DomKey::F2}, {DomCode::F3, DomKey::F3}, @@ -186,9 +185,9 @@ const struct NonPrintableCodeEntry { // {DomCode::MENU, DomKey::_} {DomCode::NON_CONVERT, DomKey::NON_CONVERT}, {DomCode::NUM_LOCK, DomKey::NUM_LOCK}, - {DomCode::NUMPAD_BACKSPACE, DomKey::BACKSPACE, 0x0008}, + {DomCode::NUMPAD_BACKSPACE, DomKey::BACKSPACE}, {DomCode::NUMPAD_CLEAR, DomKey::CLEAR}, - {DomCode::NUMPAD_ENTER, DomKey::ENTER, 0x000D}, + {DomCode::NUMPAD_ENTER, DomKey::ENTER}, // {DomCode::NUMPAD_CLEAR_ENTRY, DomKey::_} // {DomCode::NUMPAD_MEMORY_ADD, DomKey::_} // {DomCode::NUMPAD_MEMORY_CLEAR, DomKey::_} @@ -211,7 +210,7 @@ const struct NonPrintableCodeEntry { {DomCode::SHIFT_LEFT, DomKey::SHIFT}, {DomCode::SHIFT_RIGHT, DomKey::SHIFT}, {DomCode::SUPER, DomKey::SUPER}, - {DomCode::TAB, DomKey::TAB, 0x0009}, + {DomCode::TAB, DomKey::TAB}, {DomCode::UNDO, DomKey::UNDO}, // {DomCode::VOICE_COMMAND, DomKey::_} {DomCode::VOLUME_DOWN, DomKey::VOLUME_DOWN}, @@ -223,7 +222,7 @@ const struct NonPrintableCodeEntry { // This table maps a DomKey to a non-located KeyboardCode. const struct DomKeyToKeyboardCodeEntry { - DomKey dom_key; + DomKey::Base dom_key; KeyboardCode key_code; } kDomKeyToKeyboardCodeMap[] = { // No value. diff --git a/ui/events/keycodes/keyboard_code_conversion.cc b/ui/events/keycodes/keyboard_code_conversion.cc index 5996f56..6229ab3 100644 --- a/ui/events/keycodes/keyboard_code_conversion.cc +++ b/ui/events/keycodes/keyboard_code_conversion.cc @@ -16,115 +16,126 @@ namespace ui { namespace { // This table maps a subset of |KeyboardCode| (VKEYs) to DomKey and character. -// Only values not otherwise handled by GetMeaningFromKeyCode() are here. -const struct KeyboardCodeToMeaning { +// Only values not otherwise handled by GetDomKeyFromKeyCode() are here. +const struct KeyboardCodeToDomKey { KeyboardCode key_code; - DomKey key; - base::char16 plain_character; - base::char16 shift_character; -} kKeyboardCodeToMeaning[] = { - {VKEY_BACK, DomKey::BACKSPACE, '\b', 0}, - {VKEY_TAB, DomKey::TAB, '\t', 0}, - {VKEY_RETURN, DomKey::ENTER, '\r', 0}, - {VKEY_ESCAPE, DomKey::ESCAPE, 0x1B, 0}, - {VKEY_SPACE, DomKey::CHARACTER, ' ', 0}, - {VKEY_MULTIPLY, DomKey::CHARACTER, '*', 0}, - {VKEY_ADD, DomKey::CHARACTER, '+', 0}, - {VKEY_SEPARATOR, DomKey::CHARACTER, ',', 0}, - {VKEY_SUBTRACT, DomKey::CHARACTER, '-', 0}, - {VKEY_DECIMAL, DomKey::CHARACTER, '.', 0}, - {VKEY_DIVIDE, DomKey::CHARACTER, '/', 0}, - {VKEY_OEM_1, DomKey::CHARACTER, ';', ':'}, - {VKEY_OEM_PLUS, DomKey::CHARACTER, '=', '+'}, - {VKEY_OEM_COMMA, DomKey::CHARACTER, ',', '<'}, - {VKEY_OEM_MINUS, DomKey::CHARACTER, '-', '_'}, - {VKEY_OEM_PERIOD, DomKey::CHARACTER, '.', '>'}, - {VKEY_OEM_2, DomKey::CHARACTER, '/', '?'}, - {VKEY_OEM_3, DomKey::CHARACTER, '`', '~'}, - {VKEY_OEM_4, DomKey::CHARACTER, '[', '{'}, - {VKEY_OEM_5, DomKey::CHARACTER, '\\', '|'}, - {VKEY_OEM_6, DomKey::CHARACTER, ']', '}'}, - {VKEY_OEM_7, DomKey::CHARACTER, '\'', '"'}, - {VKEY_OEM_102, DomKey::CHARACTER, '<', '>'}, - {VKEY_CLEAR, DomKey::CLEAR, 0, 0}, - {VKEY_SHIFT, DomKey::SHIFT, 0, 0}, - {VKEY_CONTROL, DomKey::CONTROL, 0, 0}, - {VKEY_MENU, DomKey::ALT, 0, 0}, - {VKEY_PAUSE, DomKey::PAUSE, 0, 0}, - {VKEY_CAPITAL, DomKey::CAPS_LOCK, 0, 0}, + DomKey::Base plain; + DomKey::Base shift; +} kKeyboardCodeToDomKey[] = { + {VKEY_BACK, DomKey::BACKSPACE}, + {VKEY_TAB, DomKey::TAB}, + {VKEY_RETURN, DomKey::ENTER}, + {VKEY_ESCAPE, DomKey::ESCAPE}, + {VKEY_SPACE, DomKey::Constant<' '>::Character}, + {VKEY_MULTIPLY, DomKey::Constant<'*'>::Character}, + {VKEY_ADD, DomKey::Constant<'+'>::Character}, + {VKEY_SEPARATOR, DomKey::Constant<','>::Character}, + {VKEY_SUBTRACT, DomKey::Constant<'-'>::Character}, + {VKEY_DECIMAL, DomKey::Constant<'.'>::Character}, + {VKEY_DIVIDE, DomKey::Constant<'/'>::Character}, + {VKEY_OEM_1, DomKey::Constant<';'>::Character, + DomKey::Constant<':'>::Character}, + {VKEY_OEM_PLUS, DomKey::Constant<'='>::Character, + DomKey::Constant<'+'>::Character}, + {VKEY_OEM_COMMA, DomKey::Constant<','>::Character, + DomKey::Constant<'<'>::Character}, + {VKEY_OEM_MINUS, DomKey::Constant<'-'>::Character, + DomKey::Constant<'_'>::Character}, + {VKEY_OEM_PERIOD, DomKey::Constant<'.'>::Character, + DomKey::Constant<'>'>::Character}, + {VKEY_OEM_2, DomKey::Constant<'/'>::Character, + DomKey::Constant<'?'>::Character}, + {VKEY_OEM_3, DomKey::Constant<'`'>::Character, + DomKey::Constant<'~'>::Character}, + {VKEY_OEM_4, DomKey::Constant<'['>::Character, + DomKey::Constant<'{'>::Character}, + {VKEY_OEM_5, DomKey::Constant<'\\'>::Character, + DomKey::Constant<'|'>::Character}, + {VKEY_OEM_6, DomKey::Constant<']'>::Character, + DomKey::Constant<'}'>::Character}, + {VKEY_OEM_7, DomKey::Constant<'\''>::Character, + DomKey::Constant<'"'>::Character}, + {VKEY_OEM_102, DomKey::Constant<'<'>::Character, + DomKey::Constant<'>'>::Character}, + {VKEY_CLEAR, DomKey::CLEAR}, + {VKEY_SHIFT, DomKey::SHIFT}, + {VKEY_CONTROL, DomKey::CONTROL}, + {VKEY_MENU, DomKey::ALT}, + {VKEY_PAUSE, DomKey::PAUSE}, + {VKEY_CAPITAL, DomKey::CAPS_LOCK}, // Windows conflates 'KanaMode' and 'HangulMode'. - {VKEY_KANA, DomKey::KANA_MODE, 0, 0}, - {VKEY_JUNJA, DomKey::JUNJA_MODE, 0, 0}, - {VKEY_FINAL, DomKey::FINAL_MODE, 0, 0}, + {VKEY_KANA, DomKey::KANA_MODE}, + {VKEY_JUNJA, DomKey::JUNJA_MODE}, + {VKEY_FINAL, DomKey::FINAL_MODE}, // Windows conflates 'HanjaMode' and 'KanjiMode'. - {VKEY_HANJA, DomKey::HANJA_MODE, 0, 0}, - {VKEY_CONVERT, DomKey::CONVERT, 0, 0}, - {VKEY_NONCONVERT, DomKey::NON_CONVERT, 0, 0}, - {VKEY_ACCEPT, DomKey::ACCEPT, 0, 0}, - {VKEY_MODECHANGE, DomKey::MODE_CHANGE, 0, 0}, - {VKEY_PRIOR, DomKey::PAGE_UP, 0, 0}, - {VKEY_NEXT, DomKey::PAGE_DOWN, 0, 0}, - {VKEY_END, DomKey::END, 0, 0}, - {VKEY_HOME, DomKey::HOME, 0, 0}, - {VKEY_LEFT, DomKey::ARROW_LEFT, 0, 0}, - {VKEY_UP, DomKey::ARROW_UP, 0, 0}, - {VKEY_RIGHT, DomKey::ARROW_RIGHT, 0, 0}, - {VKEY_DOWN, DomKey::ARROW_DOWN, 0, 0}, - {VKEY_SELECT, DomKey::SELECT, 0, 0}, - {VKEY_PRINT, DomKey::PRINT, 0, 0}, - {VKEY_EXECUTE, DomKey::EXECUTE, 0, 0}, - {VKEY_SNAPSHOT, DomKey::PRINT_SCREEN, 0, 0}, - {VKEY_INSERT, DomKey::INSERT, 0, 0}, - {VKEY_DELETE, DomKey::DEL, 0, 0}, - {VKEY_HELP, DomKey::HELP, 0, 0}, - {VKEY_LWIN, DomKey::OS, 0, 0}, - {VKEY_RWIN, DomKey::OS, 0, 0}, - {VKEY_APPS, DomKey::MEDIA_APPS, 0, 0}, - {VKEY_NUMLOCK, DomKey::NUM_LOCK, 0, 0}, - {VKEY_SCROLL, DomKey::SCROLL_LOCK, 0, 0}, - {VKEY_LSHIFT, DomKey::SHIFT, 0, 0}, - {VKEY_RSHIFT, DomKey::SHIFT, 0, 0}, - {VKEY_LCONTROL, DomKey::CONTROL, 0, 0}, - {VKEY_RCONTROL, DomKey::CONTROL, 0, 0}, - {VKEY_LMENU, DomKey::ALT, 0, 0}, - {VKEY_RMENU, DomKey::ALT, 0, 0}, - {VKEY_BROWSER_BACK, DomKey::BROWSER_BACK, 0, 0}, - {VKEY_BROWSER_FORWARD, DomKey::BROWSER_FORWARD, 0, 0}, - {VKEY_BROWSER_REFRESH, DomKey::BROWSER_REFRESH, 0, 0}, - {VKEY_BROWSER_STOP, DomKey::BROWSER_STOP, 0, 0}, - {VKEY_BROWSER_SEARCH, DomKey::BROWSER_SEARCH, 0, 0}, - {VKEY_BROWSER_FAVORITES, DomKey::BROWSER_FAVORITES, 0, 0}, - {VKEY_BROWSER_HOME, DomKey::BROWSER_HOME, 0, 0}, - {VKEY_VOLUME_MUTE, DomKey::VOLUME_MUTE, 0, 0}, - {VKEY_VOLUME_DOWN, DomKey::VOLUME_DOWN, 0, 0}, - {VKEY_VOLUME_UP, DomKey::VOLUME_UP, 0, 0}, - {VKEY_MEDIA_NEXT_TRACK, DomKey::MEDIA_TRACK_NEXT, 0, 0}, - {VKEY_MEDIA_PREV_TRACK, DomKey::MEDIA_TRACK_PREVIOUS, 0, 0}, - {VKEY_MEDIA_STOP, DomKey::MEDIA_STOP, 0, 0}, - {VKEY_MEDIA_PLAY_PAUSE, DomKey::MEDIA_PLAY_PAUSE, 0, 0}, - {VKEY_MEDIA_LAUNCH_MAIL, DomKey::LAUNCH_MAIL, 0, 0}, - {VKEY_MEDIA_LAUNCH_MEDIA_SELECT, DomKey::LAUNCH_MEDIA_PLAYER, 0, 0}, - {VKEY_MEDIA_LAUNCH_APP1, DomKey::LAUNCH_MY_COMPUTER, 0, 0}, - {VKEY_MEDIA_LAUNCH_APP2, DomKey::LAUNCH_CALCULATOR, 0, 0}, - {VKEY_OEM_8, DomKey::SUPER, 0, 0}, // ISO Level 5 Shift in ChromeOS - {VKEY_PROCESSKEY, DomKey::PROCESS, 0, 0}, - {VKEY_DBE_SBCSCHAR, DomKey::HANKAKU, 0, 0}, - {VKEY_DBE_DBCSCHAR, DomKey::ZENKAKU, 0, 0}, - {VKEY_ATTN, DomKey::ATTN, 0, 0}, - {VKEY_CRSEL, DomKey::CR_SEL, 0, 0}, - {VKEY_EXSEL, DomKey::EX_SEL, 0, 0}, - {VKEY_EREOF, DomKey::ERASE_EOF, 0, 0}, - {VKEY_PLAY, DomKey::MEDIA_PLAY, 0, 0}, - {VKEY_ZOOM, DomKey::ZOOM_TOGGLE, 0, 0}, - {VKEY_OEM_CLEAR, DomKey::CLEAR, 0, 0}, - {VKEY_ALTGR, DomKey::ALT_GRAPH, 0, 0}, + {VKEY_HANJA, DomKey::HANJA_MODE}, + {VKEY_CONVERT, DomKey::CONVERT}, + {VKEY_NONCONVERT, DomKey::NON_CONVERT}, + {VKEY_ACCEPT, DomKey::ACCEPT}, + {VKEY_MODECHANGE, DomKey::MODE_CHANGE}, + {VKEY_PRIOR, DomKey::PAGE_UP}, + {VKEY_NEXT, DomKey::PAGE_DOWN}, + {VKEY_END, DomKey::END}, + {VKEY_HOME, DomKey::HOME}, + {VKEY_LEFT, DomKey::ARROW_LEFT}, + {VKEY_UP, DomKey::ARROW_UP}, + {VKEY_RIGHT, DomKey::ARROW_RIGHT}, + {VKEY_DOWN, DomKey::ARROW_DOWN}, + {VKEY_SELECT, DomKey::SELECT}, + {VKEY_PRINT, DomKey::PRINT}, + {VKEY_EXECUTE, DomKey::EXECUTE}, + {VKEY_SNAPSHOT, DomKey::PRINT_SCREEN}, + {VKEY_INSERT, DomKey::INSERT}, + {VKEY_DELETE, DomKey::DEL}, + {VKEY_HELP, DomKey::HELP}, + {VKEY_LWIN, DomKey::OS}, + {VKEY_RWIN, DomKey::OS}, + {VKEY_APPS, DomKey::MEDIA_APPS}, + {VKEY_NUMLOCK, DomKey::NUM_LOCK}, + {VKEY_SCROLL, DomKey::SCROLL_LOCK}, + {VKEY_LSHIFT, DomKey::SHIFT}, + {VKEY_RSHIFT, DomKey::SHIFT}, + {VKEY_LCONTROL, DomKey::CONTROL}, + {VKEY_RCONTROL, DomKey::CONTROL}, + {VKEY_LMENU, DomKey::ALT}, + {VKEY_RMENU, DomKey::ALT}, + {VKEY_BROWSER_BACK, DomKey::BROWSER_BACK}, + {VKEY_BROWSER_FORWARD, DomKey::BROWSER_FORWARD}, + {VKEY_BROWSER_REFRESH, DomKey::BROWSER_REFRESH}, + {VKEY_BROWSER_STOP, DomKey::BROWSER_STOP}, + {VKEY_BROWSER_SEARCH, DomKey::BROWSER_SEARCH}, + {VKEY_BROWSER_FAVORITES, DomKey::BROWSER_FAVORITES}, + {VKEY_BROWSER_HOME, DomKey::BROWSER_HOME}, + {VKEY_VOLUME_MUTE, DomKey::VOLUME_MUTE}, + {VKEY_VOLUME_DOWN, DomKey::VOLUME_DOWN}, + {VKEY_VOLUME_UP, DomKey::VOLUME_UP}, + {VKEY_MEDIA_NEXT_TRACK, DomKey::MEDIA_TRACK_NEXT}, + {VKEY_MEDIA_PREV_TRACK, DomKey::MEDIA_TRACK_PREVIOUS}, + {VKEY_MEDIA_STOP, DomKey::MEDIA_STOP}, + {VKEY_MEDIA_PLAY_PAUSE, DomKey::MEDIA_PLAY_PAUSE}, + {VKEY_MEDIA_LAUNCH_MAIL, DomKey::LAUNCH_MAIL}, + {VKEY_MEDIA_LAUNCH_MEDIA_SELECT, DomKey::LAUNCH_MEDIA_PLAYER}, + {VKEY_MEDIA_LAUNCH_APP1, DomKey::LAUNCH_MY_COMPUTER}, + {VKEY_MEDIA_LAUNCH_APP2, DomKey::LAUNCH_CALCULATOR}, + {VKEY_OEM_8, DomKey::SUPER}, // ISO Level 5 Shift in ChromeOS + {VKEY_PROCESSKEY, DomKey::PROCESS}, + {VKEY_DBE_SBCSCHAR, DomKey::HANKAKU}, + {VKEY_DBE_DBCSCHAR, DomKey::ZENKAKU}, + {VKEY_ATTN, DomKey::ATTN}, + {VKEY_CRSEL, DomKey::CR_SEL}, + {VKEY_EXSEL, DomKey::EX_SEL}, + {VKEY_EREOF, DomKey::ERASE_EOF}, + {VKEY_PLAY, DomKey::MEDIA_PLAY}, + {VKEY_ZOOM, DomKey::ZOOM_TOGGLE}, + {VKEY_OEM_CLEAR, DomKey::CLEAR}, + {VKEY_ALTGR, DomKey::ALT_GRAPH}, #if defined(OS_POSIX) - {VKEY_POWER, DomKey::POWER, 0, 0}, - {VKEY_BRIGHTNESS_DOWN, DomKey::BRIGHTNESS_DOWN, 0, 0}, - {VKEY_BRIGHTNESS_UP, DomKey::BRIGHTNESS_UP, 0, 0}, - {VKEY_COMPOSE, DomKey::COMPOSE, 0, 0}, - {VKEY_OEM_103, DomKey::MEDIA_REWIND, 0, 0}, - {VKEY_OEM_104, DomKey::MEDIA_FAST_FORWARD, 0, 0}, + {VKEY_POWER, DomKey::POWER}, + {VKEY_BRIGHTNESS_DOWN, DomKey::BRIGHTNESS_DOWN}, + {VKEY_BRIGHTNESS_UP, DomKey::BRIGHTNESS_UP}, + {VKEY_COMPOSE, DomKey::COMPOSE}, + {VKEY_OEM_103, DomKey::MEDIA_REWIND}, + {VKEY_OEM_104, DomKey::MEDIA_FAST_FORWARD}, #endif }; @@ -143,17 +154,13 @@ bool IsModifierDomCode(DomCode code) { } // anonymous namespace base::char16 GetCharacterFromKeyCode(KeyboardCode key_code, int flags) { - ui::DomKey dom_key; - base::char16 character; - if (GetMeaningFromKeyCode(key_code, flags, &dom_key, &character)) - return character; + DomKey key = GetDomKeyFromKeyCode(key_code, flags); + if (key.IsCharacter()) + return key.ToCharacter(); return 0; } -bool GetMeaningFromKeyCode(KeyboardCode key_code, - int flags, - DomKey* dom_key, - base::char16* character) { +DomKey GetDomKeyFromKeyCode(KeyboardCode key_code, int flags) { const bool ctrl = (flags & EF_CONTROL_DOWN) != 0; const bool shift = (flags & EF_SHIFT_DOWN) != 0; const bool upper = shift ^ ((flags & EF_CAPS_LOCK_DOWN) != 0); @@ -161,135 +168,80 @@ bool GetMeaningFromKeyCode(KeyboardCode key_code, // Control characters. if (ctrl) { // Following Windows behavior to map ctrl-a ~ ctrl-z to \x01 ~ \x1A. - if (key_code >= VKEY_A && key_code <= VKEY_Z) { - *character = static_cast<uint16>(key_code - VKEY_A + 1); - switch (key_code) { - case VKEY_H: - *dom_key = DomKey::BACKSPACE; - break; - case VKEY_I: - *dom_key = DomKey::TAB; - break; - case VKEY_J: - case VKEY_M: - *dom_key = DomKey::ENTER; - break; - default: - *dom_key = DomKey::CHARACTER; - break; - } - return true; - } + if (key_code >= VKEY_A && key_code <= VKEY_Z) + return DomKey::FromCharacter(key_code - VKEY_A + 1); // Other control characters. if (shift) { // The following graphics characters require the shift key to input. switch (key_code) { // ctrl-@ maps to \x00 (Null byte) case VKEY_2: - *dom_key = DomKey::CHARACTER; - *character = 0; - return true; + return DomKey::FromCharacter(0); // ctrl-^ maps to \x1E (Record separator, Information separator two) case VKEY_6: - *dom_key = DomKey::CHARACTER; - *character = 0x1E; - return true; + return DomKey::FromCharacter(0x1E); // ctrl-_ maps to \x1F (Unit separator, Information separator one) case VKEY_OEM_MINUS: - *dom_key = DomKey::CHARACTER; - *character = 0x1F; - return true; - // Returns 0 for all other keys to avoid inputting unexpected chars. + return DomKey::FromCharacter(0x1F); + // Returns UNIDENTIFIED for all other keys to avoid inputting + // unexpected chars. default: - *dom_key = DomKey::UNIDENTIFIED; - *character = 0; - return false; + return DomKey::UNIDENTIFIED; } } else { switch (key_code) { // ctrl-[ maps to \x1B (Escape) case VKEY_OEM_4: - *dom_key = DomKey::ESCAPE; - *character = 0x1B; - return true; + return DomKey::ESCAPE; // ctrl-\ maps to \x1C (File separator, Information separator four) case VKEY_OEM_5: - *dom_key = DomKey::CHARACTER; - *character = 0x1C; - return true; + return DomKey::FromCharacter(0x1C); // ctrl-] maps to \x1D (Group separator, Information separator three) case VKEY_OEM_6: - *dom_key = DomKey::CHARACTER; - *character = 0x1D; - return true; + return DomKey::FromCharacter(0x1D); // ctrl-Enter maps to \x0A (Line feed) case VKEY_RETURN: - *dom_key = DomKey::CHARACTER; - *character = 0x0A; - return true; - // Returns 0 for all other keys to avoid inputting unexpected chars. + return DomKey::FromCharacter(0x0A); + // Returns UNIDENTIFIED for all other keys to avoid inputting + // unexpected chars. default: - *dom_key = DomKey::UNIDENTIFIED; - *character = 0; - return false; + return DomKey::UNIDENTIFIED; } } } // ASCII alphanumeric characters. - if (key_code >= VKEY_A && key_code <= VKEY_Z) { - *dom_key = DomKey::CHARACTER; - *character = static_cast<uint16>(key_code - VKEY_A + (upper ? 'A' : 'a')); - return true; - } + if (key_code >= VKEY_A && key_code <= VKEY_Z) + return DomKey::FromCharacter(key_code - VKEY_A + (upper ? 'A' : 'a')); if (key_code >= VKEY_0 && key_code <= VKEY_9) { - *dom_key = DomKey::CHARACTER; - *character = - shift ? ")!@#$%^&*("[key_code - VKEY_0] : static_cast<uint16>(key_code); - return true; - } - if (key_code >= VKEY_NUMPAD0 && key_code <= VKEY_NUMPAD9) { - *dom_key = DomKey::CHARACTER; - *character = static_cast<uint16>(key_code - VKEY_NUMPAD0 + '0'); - return true; + return DomKey::FromCharacter(shift ? ")!@#$%^&*("[key_code - VKEY_0] + : '0' + key_code - VKEY_0); } + if (key_code >= VKEY_NUMPAD0 && key_code <= VKEY_NUMPAD9) + return DomKey::FromCharacter(key_code - VKEY_NUMPAD0 + '0'); // Function keys. - if (key_code >= VKEY_F1 && key_code <= VKEY_F24) { - *dom_key = - static_cast<DomKey>(key_code - VKEY_F1 + static_cast<int>(DomKey::F1)); - *character = 0; - return true; - } + if (key_code >= VKEY_F1 && key_code <= VKEY_F24) + return DomKey::FromCharacter(key_code - VKEY_F1 + DomKey::F1); // Other keys. - for (size_t i = 0; i < arraysize(kKeyboardCodeToMeaning); ++i) { - if (kKeyboardCodeToMeaning[i].key_code == key_code) { - const KeyboardCodeToMeaning* p = &kKeyboardCodeToMeaning[i]; - *dom_key = p->key; - *character = (shift && p->shift_character) ? p->shift_character - : p->plain_character; - return true; - } + for (const auto& k : kKeyboardCodeToDomKey) { + if (k.key_code == key_code) + return (shift && k.shift) ? k.shift : k.plain; } - *dom_key = DomKey::UNIDENTIFIED; - *character = 0; - return false; + return DomKey::UNIDENTIFIED; } -bool DomCodeToUsLayoutMeaning(DomCode dom_code, - int flags, - DomKey* out_dom_key, - base::char16* out_character, - KeyboardCode* out_key_code) { +bool DomCodeToUsLayoutDomKey(DomCode dom_code, + int flags, + DomKey* out_dom_key, + KeyboardCode* out_key_code) { if ((flags & EF_CONTROL_DOWN) == EF_CONTROL_DOWN) { - if (DomCodeToControlCharacter(dom_code, flags, out_dom_key, out_character, - out_key_code)) { + if (DomCodeToControlCharacter(dom_code, flags, out_dom_key, out_key_code)) { return true; } if (!IsModifierDomCode(dom_code)) { *out_dom_key = DomKey::UNIDENTIFIED; - *out_character = 0; *out_key_code = LocatedToNonLocatedKeyboardCode( DomCodeToUsLayoutKeyboardCode(dom_code)); return true; @@ -299,13 +251,12 @@ bool DomCodeToUsLayoutMeaning(DomCode dom_code, if (it.dom_code == dom_code) { int state = ((flags & EF_SHIFT_DOWN) == EF_SHIFT_DOWN); base::char16 ch = it.character[state]; - *out_dom_key = DomKey::CHARACTER; - *out_character = ch; if ((flags & EF_CAPS_LOCK_DOWN) == EF_CAPS_LOCK_DOWN) { ch |= 0x20; if ((ch >= 'a') && (ch <= 'z')) - *out_character = it.character[state ^ 1]; + ch = it.character[state ^ 1]; } + *out_dom_key = DomKey::FromCharacter(ch); *out_key_code = LocatedToNonLocatedKeyboardCode( DomCodeToUsLayoutKeyboardCode(dom_code)); return true; @@ -315,14 +266,12 @@ bool DomCodeToUsLayoutMeaning(DomCode dom_code, for (const auto& it : kNonPrintableCodeMap) { if (it.dom_code == dom_code) { *out_dom_key = it.dom_key; - *out_character = it.character; *out_key_code = NonPrintableDomKeyToKeyboardCode(it.dom_key); return true; } } if ((flags & EF_CONTROL_DOWN) == EF_CONTROL_DOWN) { *out_dom_key = DomKey::UNIDENTIFIED; - *out_character = 0; *out_key_code = LocatedToNonLocatedKeyboardCode( DomCodeToUsLayoutKeyboardCode(dom_code)); return true; @@ -333,7 +282,6 @@ bool DomCodeToUsLayoutMeaning(DomCode dom_code, bool DomCodeToControlCharacter(DomCode dom_code, int flags, DomKey* dom_key, - base::char16* character, KeyboardCode* key_code) { if ((flags & EF_CONTROL_DOWN) == 0) return false; @@ -342,23 +290,19 @@ bool DomCodeToControlCharacter(DomCode dom_code, const int kKeyA = static_cast<int>(DomCode::KEY_A); // Control-A - Control-Z map to 0x01 - 0x1A. if (code >= kKeyA && code <= static_cast<int>(DomCode::KEY_Z)) { - *character = static_cast<base::char16>(code - kKeyA + 1); + *dom_key = DomKey::FromCharacter(code - kKeyA + 1); + *key_code = static_cast<KeyboardCode>(code - kKeyA + VKEY_A); switch (dom_code) { case DomCode::KEY_H: - *dom_key = DomKey::BACKSPACE; *key_code = VKEY_BACK; break; case DomCode::KEY_I: - *dom_key = DomKey::TAB; *key_code = VKEY_TAB; break; case DomCode::KEY_M: - *dom_key = DomKey::ENTER; *key_code = VKEY_RETURN; break; default: - *dom_key = DomKey::CHARACTER; - *key_code = static_cast<KeyboardCode>(code - kKeyA + VKEY_A); break; } return true; @@ -368,20 +312,17 @@ bool DomCodeToControlCharacter(DomCode dom_code, switch (dom_code) { case DomCode::DIGIT2: // NUL - *character = 0; - *dom_key = DomKey::CHARACTER; + *dom_key = DomKey::FromCharacter(0); *key_code = VKEY_2; return true; case DomCode::DIGIT6: // RS - *character = 0x1E; - *dom_key = DomKey::CHARACTER; + *dom_key = DomKey::FromCharacter(0x1E); *key_code = VKEY_6; return true; case DomCode::MINUS: // US - *character = 0x1F; - *dom_key = DomKey::CHARACTER; + *dom_key = DomKey::FromCharacter(0x1F); *key_code = VKEY_OEM_MINUS; return true; default: @@ -392,26 +333,22 @@ bool DomCodeToControlCharacter(DomCode dom_code, switch (dom_code) { case DomCode::ENTER: // NL - *character = 0x0A; - *dom_key = DomKey::CHARACTER; + *dom_key = DomKey::FromCharacter(0x0A); *key_code = VKEY_RETURN; return true; case DomCode::BRACKET_LEFT: // ESC - *character = 0x1B; - *dom_key = DomKey::ESCAPE; + *dom_key = DomKey::FromCharacter(0x1B); *key_code = VKEY_OEM_4; return true; case DomCode::BACKSLASH: // FS - *character = 0x1C; - *dom_key = DomKey::CHARACTER; + *dom_key = DomKey::FromCharacter(0x1C); *key_code = VKEY_OEM_5; return true; case DomCode::BRACKET_RIGHT: // GS - *character = 0x1D; - *dom_key = DomKey::CHARACTER; + *dom_key = DomKey::FromCharacter(0x1D); *key_code = VKEY_OEM_6; return true; default: @@ -419,23 +356,6 @@ bool DomCodeToControlCharacter(DomCode dom_code, } } -DomKey CharacterToDomKey(uint32 character) { - switch (character) { - case 0x08: - return DomKey::BACKSPACE; - case 0x09: - return DomKey::TAB; - case 0x0D: - return DomKey::ENTER; - case 0x1B: - return DomKey::ESCAPE; - case 0x7F: - return DomKey::DEL; - default: - return DomKey::CHARACTER; - } -} - // Returns a Windows-based VKEY for a non-printable DOM Level 3 |key|. // The returned VKEY is non-positional (e.g. VKEY_SHIFT). KeyboardCode NonPrintableDomKeyToKeyboardCode(DomKey dom_key) { diff --git a/ui/events/keycodes/keyboard_code_conversion.h b/ui/events/keycodes/keyboard_code_conversion.h index 7b7618b..526ead5 100644 --- a/ui/events/keycodes/keyboard_code_conversion.h +++ b/ui/events/keycodes/keyboard_code_conversion.h @@ -8,12 +8,12 @@ #include "base/compiler_specific.h" #include "base/strings/string16.h" #include "ui/events/events_base_export.h" +#include "ui/events/keycodes/dom/dom_key.h" #include "ui/events/keycodes/keyboard_codes.h" namespace ui { enum class DomCode; -enum class DomKey; // Helper functions to get the meaning of a Windows key code in a // platform independent way. It supports control characters as well. @@ -35,10 +35,8 @@ enum class DomKey; // crbug.com/444045 EVENTS_BASE_EXPORT base::char16 GetCharacterFromKeyCode(KeyboardCode key_code, int flags); -EVENTS_BASE_EXPORT bool GetMeaningFromKeyCode(KeyboardCode key_code, - int flags, - DomKey* dom_key, - base::char16* character); +EVENTS_BASE_EXPORT DomKey GetDomKeyFromKeyCode(KeyboardCode key_code, + int flags); // Helper function to map a physical key state (dom_code and flags) // to a meaning (dom_key and character, together corresponding to the @@ -50,11 +48,10 @@ EVENTS_BASE_EXPORT bool GetMeaningFromKeyCode(KeyboardCode key_code, // Returns true and sets the output parameters if the (dom_code, flags) pair // has an interpretation in the US English layout; otherwise the output // parameters are untouched. -EVENTS_BASE_EXPORT bool DomCodeToUsLayoutMeaning(DomCode dom_code, - int flags, - DomKey* dom_key, - base::char16* character, - KeyboardCode* key_code) +EVENTS_BASE_EXPORT bool DomCodeToUsLayoutDomKey(DomCode dom_code, + int flags, + DomKey* dom_key, + KeyboardCode* key_code) WARN_UNUSED_RESULT; // Obtains the control character corresponding to a physical key; @@ -66,15 +63,9 @@ EVENTS_BASE_EXPORT bool DomCodeToUsLayoutMeaning(DomCode dom_code, EVENTS_BASE_EXPORT bool DomCodeToControlCharacter(DomCode dom_code, int flags, DomKey* dom_key, - base::char16* character, KeyboardCode* key_code) WARN_UNUSED_RESULT; -// Returns the DomKey value associated with an ASCII/Unicode character. -// All printable characters and most other character codes use -// DomKey::CHARACTER, but a few ASCII C0 codes have their own DomKey. -EVENTS_BASE_EXPORT DomKey CharacterToDomKey(uint32 character); - // Returns a Windows-based VKEY for a non-printable DOM Level 3 |key|. // The returned VKEY is non-located (e.g. VKEY_SHIFT). EVENTS_BASE_EXPORT KeyboardCode diff --git a/ui/events/keycodes/keyboard_code_conversion_unittest.cc b/ui/events/keycodes/keyboard_code_conversion_unittest.cc index fbf3dbe..eb76451 100644 --- a/ui/events/keycodes/keyboard_code_conversion_unittest.cc +++ b/ui/events/keycodes/keyboard_code_conversion_unittest.cc @@ -18,27 +18,23 @@ namespace { struct Meaning { bool defined; - ui::DomKey dom_key; - base::char16 character; - ui::KeyboardCode legacy_key_code; + ui::DomKey::Base dom_key; + ui::KeyboardCode key_code; }; -const Meaning kUndefined = {false, ui::DomKey::NONE, 0, ui::VKEY_UNKNOWN}; +const Meaning kUndefined = {false, ui::DomKey::NONE, ui::VKEY_UNKNOWN}; void CheckDomCodeToMeaning(const char* label, bool f(ui::DomCode dom_code, int flags, ui::DomKey* out_dom_key, - base::char16* out_character, ui::KeyboardCode* out_key_code), ui::DomCode dom_code, int event_flags, const Meaning& result) { ui::DomKey result_dom_key = ui::DomKey::NONE; - base::char16 result_character = 0; - ui::KeyboardCode result_legacy_key_code = ui::VKEY_UNKNOWN; - bool success = f(dom_code, event_flags, &result_dom_key, &result_character, - &result_legacy_key_code); + ui::KeyboardCode result_key_code = ui::VKEY_UNKNOWN; + bool success = f(dom_code, event_flags, &result_dom_key, &result_key_code); SCOPED_TRACE( base::StringPrintf("%s %s %06X:%04X", label, ui::KeycodeConverter::DomCodeToCodeString(dom_code), @@ -50,13 +46,11 @@ void CheckDomCodeToMeaning(const char* label, << ui::KeycodeConverter::DomKeyToKeyString(result.dom_key) << "' Actual '" << ui::KeycodeConverter::DomKeyToKeyString(result_dom_key) << "'"; - EXPECT_EQ(result.character, result_character); - EXPECT_EQ(result.legacy_key_code, result_legacy_key_code); + EXPECT_EQ(result.key_code, result_key_code); } else { // Should not have touched output parameters. EXPECT_EQ(ui::DomKey::NONE, result_dom_key); - EXPECT_EQ(0, result_character); - EXPECT_EQ(ui::VKEY_UNKNOWN, result_legacy_key_code); + EXPECT_EQ(ui::VKEY_UNKNOWN, result_key_code); } } @@ -68,83 +62,83 @@ TEST(KeyboardCodeConversion, ControlCharacters) { Meaning control_shift; } kControlCharacters[] = { {ui::DomCode::KEY_A, - {true, ui::DomKey::CHARACTER, 0x01, ui::VKEY_A}, - {true, ui::DomKey::CHARACTER, 0x01, ui::VKEY_A}}, + {true, ui::DomKey::Constant<0x01>::Character, ui::VKEY_A}, + {true, ui::DomKey::Constant<0x01>::Character, ui::VKEY_A}}, {ui::DomCode::KEY_B, - {true, ui::DomKey::CHARACTER, 0x02, ui::VKEY_B}, - {true, ui::DomKey::CHARACTER, 0x02, ui::VKEY_B}}, + {true, ui::DomKey::Constant<0x02>::Character, ui::VKEY_B}, + {true, ui::DomKey::Constant<0x02>::Character, ui::VKEY_B}}, {ui::DomCode::KEY_C, - {true, ui::DomKey::CHARACTER, 0x03, ui::VKEY_C}, - {true, ui::DomKey::CHARACTER, 0x03, ui::VKEY_C}}, + {true, ui::DomKey::Constant<0x03>::Character, ui::VKEY_C}, + {true, ui::DomKey::Constant<0x03>::Character, ui::VKEY_C}}, {ui::DomCode::KEY_D, - {true, ui::DomKey::CHARACTER, 0x04, ui::VKEY_D}, - {true, ui::DomKey::CHARACTER, 0x04, ui::VKEY_D}}, + {true, ui::DomKey::Constant<0x04>::Character, ui::VKEY_D}, + {true, ui::DomKey::Constant<0x04>::Character, ui::VKEY_D}}, {ui::DomCode::KEY_E, - {true, ui::DomKey::CHARACTER, 0x05, ui::VKEY_E}, - {true, ui::DomKey::CHARACTER, 0x05, ui::VKEY_E}}, + {true, ui::DomKey::Constant<0x05>::Character, ui::VKEY_E}, + {true, ui::DomKey::Constant<0x05>::Character, ui::VKEY_E}}, {ui::DomCode::KEY_F, - {true, ui::DomKey::CHARACTER, 0x06, ui::VKEY_F}, - {true, ui::DomKey::CHARACTER, 0x06, ui::VKEY_F}}, + {true, ui::DomKey::Constant<0x06>::Character, ui::VKEY_F}, + {true, ui::DomKey::Constant<0x06>::Character, ui::VKEY_F}}, {ui::DomCode::KEY_G, - {true, ui::DomKey::CHARACTER, 0x07, ui::VKEY_G}, - {true, ui::DomKey::CHARACTER, 0x07, ui::VKEY_G}}, + {true, ui::DomKey::Constant<0x07>::Character, ui::VKEY_G}, + {true, ui::DomKey::Constant<0x07>::Character, ui::VKEY_G}}, {ui::DomCode::KEY_H, - {true, ui::DomKey::BACKSPACE, 0x08, ui::VKEY_BACK}, - {true, ui::DomKey::BACKSPACE, 0x08, ui::VKEY_BACK}}, + {true, ui::DomKey::BACKSPACE, ui::VKEY_BACK}, + {true, ui::DomKey::BACKSPACE, ui::VKEY_BACK}}, {ui::DomCode::KEY_I, - {true, ui::DomKey::TAB, 0x09, ui::VKEY_TAB}, - {true, ui::DomKey::TAB, 0x09, ui::VKEY_TAB}}, + {true, ui::DomKey::TAB, ui::VKEY_TAB}, + {true, ui::DomKey::TAB, ui::VKEY_TAB}}, {ui::DomCode::KEY_J, - {true, ui::DomKey::CHARACTER, 0x0A, ui::VKEY_J}, - {true, ui::DomKey::CHARACTER, 0x0A, ui::VKEY_J}}, + {true, ui::DomKey::Constant<0x0A>::Character, ui::VKEY_J}, + {true, ui::DomKey::Constant<0x0A>::Character, ui::VKEY_J}}, {ui::DomCode::KEY_K, - {true, ui::DomKey::CHARACTER, 0x0B, ui::VKEY_K}, - {true, ui::DomKey::CHARACTER, 0x0B, ui::VKEY_K}}, + {true, ui::DomKey::Constant<0x0B>::Character, ui::VKEY_K}, + {true, ui::DomKey::Constant<0x0B>::Character, ui::VKEY_K}}, {ui::DomCode::KEY_L, - {true, ui::DomKey::CHARACTER, 0x0C, ui::VKEY_L}, - {true, ui::DomKey::CHARACTER, 0x0C, ui::VKEY_L}}, + {true, ui::DomKey::Constant<0x0C>::Character, ui::VKEY_L}, + {true, ui::DomKey::Constant<0x0C>::Character, ui::VKEY_L}}, {ui::DomCode::KEY_M, - {true, ui::DomKey::ENTER, 0x0D, ui::VKEY_RETURN}, - {true, ui::DomKey::ENTER, 0x0D, ui::VKEY_RETURN}}, + {true, ui::DomKey::ENTER, ui::VKEY_RETURN}, + {true, ui::DomKey::ENTER, ui::VKEY_RETURN}}, {ui::DomCode::KEY_N, - {true, ui::DomKey::CHARACTER, 0x0E, ui::VKEY_N}, - {true, ui::DomKey::CHARACTER, 0x0E, ui::VKEY_N}}, + {true, ui::DomKey::Constant<0x0E>::Character, ui::VKEY_N}, + {true, ui::DomKey::Constant<0x0E>::Character, ui::VKEY_N}}, {ui::DomCode::KEY_O, - {true, ui::DomKey::CHARACTER, 0x0F, ui::VKEY_O}, - {true, ui::DomKey::CHARACTER, 0x0F, ui::VKEY_O}}, + {true, ui::DomKey::Constant<0x0F>::Character, ui::VKEY_O}, + {true, ui::DomKey::Constant<0x0F>::Character, ui::VKEY_O}}, {ui::DomCode::KEY_P, - {true, ui::DomKey::CHARACTER, 0x10, ui::VKEY_P}, - {true, ui::DomKey::CHARACTER, 0x10, ui::VKEY_P}}, + {true, ui::DomKey::Constant<0x10>::Character, ui::VKEY_P}, + {true, ui::DomKey::Constant<0x10>::Character, ui::VKEY_P}}, {ui::DomCode::KEY_Q, - {true, ui::DomKey::CHARACTER, 0x11, ui::VKEY_Q}, - {true, ui::DomKey::CHARACTER, 0x11, ui::VKEY_Q}}, + {true, ui::DomKey::Constant<0x11>::Character, ui::VKEY_Q}, + {true, ui::DomKey::Constant<0x11>::Character, ui::VKEY_Q}}, {ui::DomCode::KEY_R, - {true, ui::DomKey::CHARACTER, 0x12, ui::VKEY_R}, - {true, ui::DomKey::CHARACTER, 0x12, ui::VKEY_R}}, + {true, ui::DomKey::Constant<0x12>::Character, ui::VKEY_R}, + {true, ui::DomKey::Constant<0x12>::Character, ui::VKEY_R}}, {ui::DomCode::KEY_S, - {true, ui::DomKey::CHARACTER, 0x13, ui::VKEY_S}, - {true, ui::DomKey::CHARACTER, 0x13, ui::VKEY_S}}, + {true, ui::DomKey::Constant<0x13>::Character, ui::VKEY_S}, + {true, ui::DomKey::Constant<0x13>::Character, ui::VKEY_S}}, {ui::DomCode::KEY_T, - {true, ui::DomKey::CHARACTER, 0x14, ui::VKEY_T}, - {true, ui::DomKey::CHARACTER, 0x14, ui::VKEY_T}}, + {true, ui::DomKey::Constant<0x14>::Character, ui::VKEY_T}, + {true, ui::DomKey::Constant<0x14>::Character, ui::VKEY_T}}, {ui::DomCode::KEY_U, - {true, ui::DomKey::CHARACTER, 0x15, ui::VKEY_U}, - {true, ui::DomKey::CHARACTER, 0x15, ui::VKEY_U}}, + {true, ui::DomKey::Constant<0x15>::Character, ui::VKEY_U}, + {true, ui::DomKey::Constant<0x15>::Character, ui::VKEY_U}}, {ui::DomCode::KEY_V, - {true, ui::DomKey::CHARACTER, 0x16, ui::VKEY_V}, - {true, ui::DomKey::CHARACTER, 0x16, ui::VKEY_V}}, + {true, ui::DomKey::Constant<0x16>::Character, ui::VKEY_V}, + {true, ui::DomKey::Constant<0x16>::Character, ui::VKEY_V}}, {ui::DomCode::KEY_W, - {true, ui::DomKey::CHARACTER, 0x17, ui::VKEY_W}, - {true, ui::DomKey::CHARACTER, 0x17, ui::VKEY_W}}, + {true, ui::DomKey::Constant<0x17>::Character, ui::VKEY_W}, + {true, ui::DomKey::Constant<0x17>::Character, ui::VKEY_W}}, {ui::DomCode::KEY_X, - {true, ui::DomKey::CHARACTER, 0x18, ui::VKEY_X}, - {true, ui::DomKey::CHARACTER, 0x18, ui::VKEY_X}}, + {true, ui::DomKey::Constant<0x18>::Character, ui::VKEY_X}, + {true, ui::DomKey::Constant<0x18>::Character, ui::VKEY_X}}, {ui::DomCode::KEY_Y, - {true, ui::DomKey::CHARACTER, 0x19, ui::VKEY_Y}, - {true, ui::DomKey::CHARACTER, 0x19, ui::VKEY_Y}}, + {true, ui::DomKey::Constant<0x19>::Character, ui::VKEY_Y}, + {true, ui::DomKey::Constant<0x19>::Character, ui::VKEY_Y}}, {ui::DomCode::KEY_Z, - {true, ui::DomKey::CHARACTER, 0x1A, ui::VKEY_Z}, - {true, ui::DomKey::CHARACTER, 0x1A, ui::VKEY_Z}}, + {true, ui::DomKey::Constant<0x1A>::Character, ui::VKEY_Z}, + {true, ui::DomKey::Constant<0x1A>::Character, ui::VKEY_Z}}, }; for (const auto& it : kControlCharacters) { // Verify |DomCodeToControlCharacter()|. @@ -155,17 +149,17 @@ TEST(KeyboardCodeConversion, ControlCharacters) { CheckDomCodeToMeaning("c_cc_cs", ui::DomCodeToControlCharacter, it.dom_code, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, it.control_shift); - // Verify |DomCodeToUsLayoutMeaning()|. - CheckDomCodeToMeaning("c_us_c", ui::DomCodeToUsLayoutMeaning, it.dom_code, + // Verify |DomCodeToUsLayoutDomKey()|. + CheckDomCodeToMeaning("c_us_c", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_CONTROL_DOWN, it.control); - CheckDomCodeToMeaning("c_us_cs", ui::DomCodeToUsLayoutMeaning, it.dom_code, + CheckDomCodeToMeaning("c_us_cs", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, it.control_shift); } // The codes in this table are sensitive to the Shift state, so they are // handled differently by |DomCodeToControlCharacter()|, which returns false - // for unknown combinations, vs |DomCodeToUsLayoutMeaning()|, which returns + // for unknown combinations, vs |DomCodeToUsLayoutDomKey()|, which returns // true with DomKey::UNIDENTIFIED. static const struct { ui::DomCode dom_code; @@ -175,40 +169,40 @@ TEST(KeyboardCodeConversion, ControlCharacters) { Meaning us_control_shift; } kShiftControlCharacters[] = { {ui::DomCode::DIGIT2, - {false, ui::DomKey::NONE, 0, ui::VKEY_UNKNOWN}, - {true, ui::DomKey::CHARACTER, 0, ui::VKEY_2}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_2}, - {true, ui::DomKey::CHARACTER, 0, ui::VKEY_2}}, + {false, ui::DomKey::NONE, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::Constant<0>::Character, ui::VKEY_2}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_2}, + {true, ui::DomKey::Constant<0>::Character, ui::VKEY_2}}, {ui::DomCode::DIGIT6, - {false, ui::DomKey::NONE, 0, ui::VKEY_UNKNOWN}, - {true, ui::DomKey::CHARACTER, 0x1E, ui::VKEY_6}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_6}, - {true, ui::DomKey::CHARACTER, 0x1E, ui::VKEY_6}}, + {false, ui::DomKey::NONE, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::Constant<0x1E>::Character, ui::VKEY_6}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_6}, + {true, ui::DomKey::Constant<0x1E>::Character, ui::VKEY_6}}, {ui::DomCode::MINUS, - {false, ui::DomKey::NONE, 0, ui::VKEY_UNKNOWN}, - {true, ui::DomKey::CHARACTER, 0x1F, ui::VKEY_OEM_MINUS}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_OEM_MINUS}, - {true, ui::DomKey::CHARACTER, 0x1F, ui::VKEY_OEM_MINUS}}, + {false, ui::DomKey::NONE, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::Constant<0x1F>::Character, ui::VKEY_OEM_MINUS}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_OEM_MINUS}, + {true, ui::DomKey::Constant<0x1F>::Character, ui::VKEY_OEM_MINUS}}, {ui::DomCode::ENTER, - {true, ui::DomKey::CHARACTER, 0x0A, ui::VKEY_RETURN}, - {false, ui::DomKey::NONE, 0, ui::VKEY_UNKNOWN}, - {true, ui::DomKey::CHARACTER, 0x0A, ui::VKEY_RETURN}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_RETURN}}, + {true, ui::DomKey::Constant<0x0A>::Character, ui::VKEY_RETURN}, + {false, ui::DomKey::NONE, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::Constant<0x0A>::Character, ui::VKEY_RETURN}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_RETURN}}, {ui::DomCode::BRACKET_LEFT, - {true, ui::DomKey::ESCAPE, 0x1B, ui::VKEY_OEM_4}, - {false, ui::DomKey::NONE, 0, ui::VKEY_UNKNOWN}, - {true, ui::DomKey::ESCAPE, 0x1B, ui::VKEY_OEM_4}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_OEM_4}}, + {true, ui::DomKey::ESCAPE, ui::VKEY_OEM_4}, + {false, ui::DomKey::NONE, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::ESCAPE, ui::VKEY_OEM_4}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_OEM_4}}, {ui::DomCode::BACKSLASH, - {true, ui::DomKey::CHARACTER, 0x1C, ui::VKEY_OEM_5}, - {false, ui::DomKey::NONE, 0, ui::VKEY_UNKNOWN}, - {true, ui::DomKey::CHARACTER, 0x1C, ui::VKEY_OEM_5}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_OEM_5}}, + {true, ui::DomKey::Constant<0x1C>::Character, ui::VKEY_OEM_5}, + {false, ui::DomKey::NONE, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::Constant<0x1C>::Character, ui::VKEY_OEM_5}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_OEM_5}}, {ui::DomCode::BRACKET_RIGHT, - {true, ui::DomKey::CHARACTER, 0x1D, ui::VKEY_OEM_6}, - {false, ui::DomKey::NONE, 0, ui::VKEY_UNKNOWN}, - {true, ui::DomKey::CHARACTER, 0x1D, ui::VKEY_OEM_6}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_OEM_6}}, + {true, ui::DomKey::Constant<0x1D>::Character, ui::VKEY_OEM_6}, + {false, ui::DomKey::NONE, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::Constant<0x1D>::Character, ui::VKEY_OEM_6}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_OEM_6}}, }; for (const auto& it : kShiftControlCharacters) { // Verify |DomCodeToControlCharacter()|. @@ -219,10 +213,10 @@ TEST(KeyboardCodeConversion, ControlCharacters) { CheckDomCodeToMeaning("s_cc_cs", ui::DomCodeToControlCharacter, it.dom_code, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, it.cc_control_shift); - // Verify |DomCodeToUsLayoutMeaning()|. - CheckDomCodeToMeaning("s_us_c", ui::DomCodeToUsLayoutMeaning, it.dom_code, + // Verify |DomCodeToUsLayoutDomKey()|. + CheckDomCodeToMeaning("s_us_c", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_CONTROL_DOWN, it.us_control); - CheckDomCodeToMeaning("s_us_cs", ui::DomCodeToUsLayoutMeaning, it.dom_code, + CheckDomCodeToMeaning("s_us_cs", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, it.us_control_shift); } @@ -233,49 +227,49 @@ TEST(KeyboardCodeConversion, ControlCharacters) { Meaning normal; Meaning control; } kNonControlCharacters[] = { - // Modifiers are handled by |DomCodeToUsLayoutMeaning()| without regard + // Modifiers are handled by |DomCodeToUsLayoutDomKey()| without regard // to whether Control is down. {ui::DomCode::CONTROL_LEFT, - {true, ui::DomKey::CONTROL, 0, ui::VKEY_CONTROL}, - {true, ui::DomKey::CONTROL, 0, ui::VKEY_CONTROL}}, + {true, ui::DomKey::CONTROL, ui::VKEY_CONTROL}, + {true, ui::DomKey::CONTROL, ui::VKEY_CONTROL}}, {ui::DomCode::CONTROL_RIGHT, - {true, ui::DomKey::CONTROL, 0, ui::VKEY_CONTROL}, - {true, ui::DomKey::CONTROL, 0, ui::VKEY_CONTROL}}, + {true, ui::DomKey::CONTROL, ui::VKEY_CONTROL}, + {true, ui::DomKey::CONTROL, ui::VKEY_CONTROL}}, {ui::DomCode::SHIFT_LEFT, - {true, ui::DomKey::SHIFT, 0, ui::VKEY_SHIFT}, - {true, ui::DomKey::SHIFT, 0, ui::VKEY_SHIFT}}, + {true, ui::DomKey::SHIFT, ui::VKEY_SHIFT}, + {true, ui::DomKey::SHIFT, ui::VKEY_SHIFT}}, {ui::DomCode::SHIFT_RIGHT, - {true, ui::DomKey::SHIFT, 0, ui::VKEY_SHIFT}, - {true, ui::DomKey::SHIFT, 0, ui::VKEY_SHIFT}}, + {true, ui::DomKey::SHIFT, ui::VKEY_SHIFT}, + {true, ui::DomKey::SHIFT, ui::VKEY_SHIFT}}, {ui::DomCode::ALT_LEFT, - {true, ui::DomKey::ALT, 0, ui::VKEY_MENU}, - {true, ui::DomKey::ALT, 0, ui::VKEY_MENU}}, + {true, ui::DomKey::ALT, ui::VKEY_MENU}, + {true, ui::DomKey::ALT, ui::VKEY_MENU}}, {ui::DomCode::ALT_RIGHT, - {true, ui::DomKey::ALT, 0, ui::VKEY_MENU}, - {true, ui::DomKey::ALT, 0, ui::VKEY_MENU}}, + {true, ui::DomKey::ALT, ui::VKEY_MENU}, + {true, ui::DomKey::ALT, ui::VKEY_MENU}}, {ui::DomCode::OS_LEFT, - {true, ui::DomKey::OS, 0, ui::VKEY_LWIN}, - {true, ui::DomKey::OS, 0, ui::VKEY_LWIN}}, + {true, ui::DomKey::OS, ui::VKEY_LWIN}, + {true, ui::DomKey::OS, ui::VKEY_LWIN}}, {ui::DomCode::OS_RIGHT, - {true, ui::DomKey::OS, 0, ui::VKEY_LWIN}, - {true, ui::DomKey::OS, 0, ui::VKEY_LWIN}}, + {true, ui::DomKey::OS, ui::VKEY_LWIN}, + {true, ui::DomKey::OS, ui::VKEY_LWIN}}, // Non-modifiers (a representative sample here) succeed with // DomKey::UNIDENTIFIED when Control is down. {ui::DomCode::DIGIT1, - {true, ui::DomKey::CHARACTER, '1', ui::VKEY_1}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_1}}, + {true, ui::DomKey::Constant<'1'>::Character, ui::VKEY_1}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_1}}, {ui::DomCode::EQUAL, - {true, ui::DomKey::CHARACTER, '=', ui::VKEY_OEM_PLUS}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_OEM_PLUS}}, + {true, ui::DomKey::Constant<'='>::Character, ui::VKEY_OEM_PLUS}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_OEM_PLUS}}, {ui::DomCode::TAB, - {true, ui::DomKey::TAB, 9, ui::VKEY_TAB}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_TAB}}, + {true, ui::DomKey::TAB, ui::VKEY_TAB}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_TAB}}, {ui::DomCode::F1, - {true, ui::DomKey::F1, 0, ui::VKEY_F1}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_F1}}, + {true, ui::DomKey::F1, ui::VKEY_F1}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_F1}}, {ui::DomCode::VOLUME_UP, - {true, ui::DomKey::VOLUME_UP, 0, ui::VKEY_VOLUME_UP}, - {true, ui::DomKey::UNIDENTIFIED, 0, ui::VKEY_VOLUME_UP}}, + {true, ui::DomKey::VOLUME_UP, ui::VKEY_VOLUME_UP}, + {true, ui::DomKey::UNIDENTIFIED, ui::VKEY_VOLUME_UP}}, }; for (const auto& it : kNonControlCharacters) { // Verify |DomCodeToControlCharacter()|. @@ -285,12 +279,12 @@ TEST(KeyboardCodeConversion, ControlCharacters) { ui::EF_CONTROL_DOWN, kUndefined); CheckDomCodeToMeaning("n_cc_cs", ui::DomCodeToControlCharacter, it.dom_code, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, kUndefined); - // Verify |DomCodeToUsLayoutMeaning()|. - CheckDomCodeToMeaning("n_us_n", ui::DomCodeToUsLayoutMeaning, it.dom_code, + // Verify |DomCodeToUsLayoutDomKey()|. + CheckDomCodeToMeaning("n_us_n", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_NONE, it.normal); - CheckDomCodeToMeaning("n_us_c", ui::DomCodeToUsLayoutMeaning, it.dom_code, + CheckDomCodeToMeaning("n_us_c", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_CONTROL_DOWN, it.control); - CheckDomCodeToMeaning("n_us_cs", ui::DomCodeToUsLayoutMeaning, it.dom_code, + CheckDomCodeToMeaning("n_us_cs", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, it.control); } } @@ -302,225 +296,225 @@ TEST(KeyboardCodeConversion, UsLayout) { Meaning shift; } kPrintableUsLayout[] = { {ui::DomCode::KEY_A, - {true, ui::DomKey::CHARACTER, 'a', ui::VKEY_A}, - {true, ui::DomKey::CHARACTER, 'A', ui::VKEY_A}}, + {true, ui::DomKey::Constant<'a'>::Character, ui::VKEY_A}, + {true, ui::DomKey::Constant<'A'>::Character, ui::VKEY_A}}, {ui::DomCode::KEY_B, - {true, ui::DomKey::CHARACTER, 'b', ui::VKEY_B}, - {true, ui::DomKey::CHARACTER, 'B', ui::VKEY_B}}, + {true, ui::DomKey::Constant<'b'>::Character, ui::VKEY_B}, + {true, ui::DomKey::Constant<'B'>::Character, ui::VKEY_B}}, {ui::DomCode::KEY_C, - {true, ui::DomKey::CHARACTER, 'c', ui::VKEY_C}, - {true, ui::DomKey::CHARACTER, 'C', ui::VKEY_C}}, + {true, ui::DomKey::Constant<'c'>::Character, ui::VKEY_C}, + {true, ui::DomKey::Constant<'C'>::Character, ui::VKEY_C}}, {ui::DomCode::KEY_D, - {true, ui::DomKey::CHARACTER, 'd', ui::VKEY_D}, - {true, ui::DomKey::CHARACTER, 'D', ui::VKEY_D}}, + {true, ui::DomKey::Constant<'d'>::Character, ui::VKEY_D}, + {true, ui::DomKey::Constant<'D'>::Character, ui::VKEY_D}}, {ui::DomCode::KEY_E, - {true, ui::DomKey::CHARACTER, 'e', ui::VKEY_E}, - {true, ui::DomKey::CHARACTER, 'E', ui::VKEY_E}}, + {true, ui::DomKey::Constant<'e'>::Character, ui::VKEY_E}, + {true, ui::DomKey::Constant<'E'>::Character, ui::VKEY_E}}, {ui::DomCode::KEY_F, - {true, ui::DomKey::CHARACTER, 'f', ui::VKEY_F}, - {true, ui::DomKey::CHARACTER, 'F', ui::VKEY_F}}, + {true, ui::DomKey::Constant<'f'>::Character, ui::VKEY_F}, + {true, ui::DomKey::Constant<'F'>::Character, ui::VKEY_F}}, {ui::DomCode::KEY_G, - {true, ui::DomKey::CHARACTER, 'g', ui::VKEY_G}, - {true, ui::DomKey::CHARACTER, 'G', ui::VKEY_G}}, + {true, ui::DomKey::Constant<'g'>::Character, ui::VKEY_G}, + {true, ui::DomKey::Constant<'G'>::Character, ui::VKEY_G}}, {ui::DomCode::KEY_H, - {true, ui::DomKey::CHARACTER, 'h', ui::VKEY_H}, - {true, ui::DomKey::CHARACTER, 'H', ui::VKEY_H}}, + {true, ui::DomKey::Constant<'h'>::Character, ui::VKEY_H}, + {true, ui::DomKey::Constant<'H'>::Character, ui::VKEY_H}}, {ui::DomCode::KEY_I, - {true, ui::DomKey::CHARACTER, 'i', ui::VKEY_I}, - {true, ui::DomKey::CHARACTER, 'I', ui::VKEY_I}}, + {true, ui::DomKey::Constant<'i'>::Character, ui::VKEY_I}, + {true, ui::DomKey::Constant<'I'>::Character, ui::VKEY_I}}, {ui::DomCode::KEY_J, - {true, ui::DomKey::CHARACTER, 'j', ui::VKEY_J}, - {true, ui::DomKey::CHARACTER, 'J', ui::VKEY_J}}, + {true, ui::DomKey::Constant<'j'>::Character, ui::VKEY_J}, + {true, ui::DomKey::Constant<'J'>::Character, ui::VKEY_J}}, {ui::DomCode::KEY_K, - {true, ui::DomKey::CHARACTER, 'k', ui::VKEY_K}, - {true, ui::DomKey::CHARACTER, 'K', ui::VKEY_K}}, + {true, ui::DomKey::Constant<'k'>::Character, ui::VKEY_K}, + {true, ui::DomKey::Constant<'K'>::Character, ui::VKEY_K}}, {ui::DomCode::KEY_L, - {true, ui::DomKey::CHARACTER, 'l', ui::VKEY_L}, - {true, ui::DomKey::CHARACTER, 'L', ui::VKEY_L}}, + {true, ui::DomKey::Constant<'l'>::Character, ui::VKEY_L}, + {true, ui::DomKey::Constant<'L'>::Character, ui::VKEY_L}}, {ui::DomCode::KEY_M, - {true, ui::DomKey::CHARACTER, 'm', ui::VKEY_M}, - {true, ui::DomKey::CHARACTER, 'M', ui::VKEY_M}}, + {true, ui::DomKey::Constant<'m'>::Character, ui::VKEY_M}, + {true, ui::DomKey::Constant<'M'>::Character, ui::VKEY_M}}, {ui::DomCode::KEY_N, - {true, ui::DomKey::CHARACTER, 'n', ui::VKEY_N}, - {true, ui::DomKey::CHARACTER, 'N', ui::VKEY_N}}, + {true, ui::DomKey::Constant<'n'>::Character, ui::VKEY_N}, + {true, ui::DomKey::Constant<'N'>::Character, ui::VKEY_N}}, {ui::DomCode::KEY_O, - {true, ui::DomKey::CHARACTER, 'o', ui::VKEY_O}, - {true, ui::DomKey::CHARACTER, 'O', ui::VKEY_O}}, + {true, ui::DomKey::Constant<'o'>::Character, ui::VKEY_O}, + {true, ui::DomKey::Constant<'O'>::Character, ui::VKEY_O}}, {ui::DomCode::KEY_P, - {true, ui::DomKey::CHARACTER, 'p', ui::VKEY_P}, - {true, ui::DomKey::CHARACTER, 'P', ui::VKEY_P}}, + {true, ui::DomKey::Constant<'p'>::Character, ui::VKEY_P}, + {true, ui::DomKey::Constant<'P'>::Character, ui::VKEY_P}}, {ui::DomCode::KEY_Q, - {true, ui::DomKey::CHARACTER, 'q', ui::VKEY_Q}, - {true, ui::DomKey::CHARACTER, 'Q', ui::VKEY_Q}}, + {true, ui::DomKey::Constant<'q'>::Character, ui::VKEY_Q}, + {true, ui::DomKey::Constant<'Q'>::Character, ui::VKEY_Q}}, {ui::DomCode::KEY_R, - {true, ui::DomKey::CHARACTER, 'r', ui::VKEY_R}, - {true, ui::DomKey::CHARACTER, 'R', ui::VKEY_R}}, + {true, ui::DomKey::Constant<'r'>::Character, ui::VKEY_R}, + {true, ui::DomKey::Constant<'R'>::Character, ui::VKEY_R}}, {ui::DomCode::KEY_S, - {true, ui::DomKey::CHARACTER, 's', ui::VKEY_S}, - {true, ui::DomKey::CHARACTER, 'S', ui::VKEY_S}}, + {true, ui::DomKey::Constant<'s'>::Character, ui::VKEY_S}, + {true, ui::DomKey::Constant<'S'>::Character, ui::VKEY_S}}, {ui::DomCode::KEY_T, - {true, ui::DomKey::CHARACTER, 't', ui::VKEY_T}, - {true, ui::DomKey::CHARACTER, 'T', ui::VKEY_T}}, + {true, ui::DomKey::Constant<'t'>::Character, ui::VKEY_T}, + {true, ui::DomKey::Constant<'T'>::Character, ui::VKEY_T}}, {ui::DomCode::KEY_U, - {true, ui::DomKey::CHARACTER, 'u', ui::VKEY_U}, - {true, ui::DomKey::CHARACTER, 'U', ui::VKEY_U}}, + {true, ui::DomKey::Constant<'u'>::Character, ui::VKEY_U}, + {true, ui::DomKey::Constant<'U'>::Character, ui::VKEY_U}}, {ui::DomCode::KEY_V, - {true, ui::DomKey::CHARACTER, 'v', ui::VKEY_V}, - {true, ui::DomKey::CHARACTER, 'V', ui::VKEY_V}}, + {true, ui::DomKey::Constant<'v'>::Character, ui::VKEY_V}, + {true, ui::DomKey::Constant<'V'>::Character, ui::VKEY_V}}, {ui::DomCode::KEY_W, - {true, ui::DomKey::CHARACTER, 'w', ui::VKEY_W}, - {true, ui::DomKey::CHARACTER, 'W', ui::VKEY_W}}, + {true, ui::DomKey::Constant<'w'>::Character, ui::VKEY_W}, + {true, ui::DomKey::Constant<'W'>::Character, ui::VKEY_W}}, {ui::DomCode::KEY_X, - {true, ui::DomKey::CHARACTER, 'x', ui::VKEY_X}, - {true, ui::DomKey::CHARACTER, 'X', ui::VKEY_X}}, + {true, ui::DomKey::Constant<'x'>::Character, ui::VKEY_X}, + {true, ui::DomKey::Constant<'X'>::Character, ui::VKEY_X}}, {ui::DomCode::KEY_Y, - {true, ui::DomKey::CHARACTER, 'y', ui::VKEY_Y}, - {true, ui::DomKey::CHARACTER, 'Y', ui::VKEY_Y}}, + {true, ui::DomKey::Constant<'y'>::Character, ui::VKEY_Y}, + {true, ui::DomKey::Constant<'Y'>::Character, ui::VKEY_Y}}, {ui::DomCode::KEY_Z, - {true, ui::DomKey::CHARACTER, 'z', ui::VKEY_Z}, - {true, ui::DomKey::CHARACTER, 'Z', ui::VKEY_Z}}, + {true, ui::DomKey::Constant<'z'>::Character, ui::VKEY_Z}, + {true, ui::DomKey::Constant<'Z'>::Character, ui::VKEY_Z}}, {ui::DomCode::DIGIT1, - {true, ui::DomKey::CHARACTER, '1', ui::VKEY_1}, - {true, ui::DomKey::CHARACTER, '!', ui::VKEY_1}}, + {true, ui::DomKey::Constant<'1'>::Character, ui::VKEY_1}, + {true, ui::DomKey::Constant<'!'>::Character, ui::VKEY_1}}, {ui::DomCode::DIGIT2, - {true, ui::DomKey::CHARACTER, '2', ui::VKEY_2}, - {true, ui::DomKey::CHARACTER, '@', ui::VKEY_2}}, + {true, ui::DomKey::Constant<'2'>::Character, ui::VKEY_2}, + {true, ui::DomKey::Constant<'@'>::Character, ui::VKEY_2}}, {ui::DomCode::DIGIT3, - {true, ui::DomKey::CHARACTER, '3', ui::VKEY_3}, - {true, ui::DomKey::CHARACTER, '#', ui::VKEY_3}}, + {true, ui::DomKey::Constant<'3'>::Character, ui::VKEY_3}, + {true, ui::DomKey::Constant<'#'>::Character, ui::VKEY_3}}, {ui::DomCode::DIGIT4, - {true, ui::DomKey::CHARACTER, '4', ui::VKEY_4}, - {true, ui::DomKey::CHARACTER, '$', ui::VKEY_4}}, + {true, ui::DomKey::Constant<'4'>::Character, ui::VKEY_4}, + {true, ui::DomKey::Constant<'$'>::Character, ui::VKEY_4}}, {ui::DomCode::DIGIT5, - {true, ui::DomKey::CHARACTER, '5', ui::VKEY_5}, - {true, ui::DomKey::CHARACTER, '%', ui::VKEY_5}}, + {true, ui::DomKey::Constant<'5'>::Character, ui::VKEY_5}, + {true, ui::DomKey::Constant<'%'>::Character, ui::VKEY_5}}, {ui::DomCode::DIGIT6, - {true, ui::DomKey::CHARACTER, '6', ui::VKEY_6}, - {true, ui::DomKey::CHARACTER, '^', ui::VKEY_6}}, + {true, ui::DomKey::Constant<'6'>::Character, ui::VKEY_6}, + {true, ui::DomKey::Constant<'^'>::Character, ui::VKEY_6}}, {ui::DomCode::DIGIT7, - {true, ui::DomKey::CHARACTER, '7', ui::VKEY_7}, - {true, ui::DomKey::CHARACTER, '&', ui::VKEY_7}}, + {true, ui::DomKey::Constant<'7'>::Character, ui::VKEY_7}, + {true, ui::DomKey::Constant<'&'>::Character, ui::VKEY_7}}, {ui::DomCode::DIGIT8, - {true, ui::DomKey::CHARACTER, '8', ui::VKEY_8}, - {true, ui::DomKey::CHARACTER, '*', ui::VKEY_8}}, + {true, ui::DomKey::Constant<'8'>::Character, ui::VKEY_8}, + {true, ui::DomKey::Constant<'*'>::Character, ui::VKEY_8}}, {ui::DomCode::DIGIT9, - {true, ui::DomKey::CHARACTER, '9', ui::VKEY_9}, - {true, ui::DomKey::CHARACTER, '(', ui::VKEY_9}}, + {true, ui::DomKey::Constant<'9'>::Character, ui::VKEY_9}, + {true, ui::DomKey::Constant<'('>::Character, ui::VKEY_9}}, {ui::DomCode::DIGIT0, - {true, ui::DomKey::CHARACTER, '0', ui::VKEY_0}, - {true, ui::DomKey::CHARACTER, ')', ui::VKEY_0}}, + {true, ui::DomKey::Constant<'0'>::Character, ui::VKEY_0}, + {true, ui::DomKey::Constant<')'>::Character, ui::VKEY_0}}, {ui::DomCode::SPACE, - {true, ui::DomKey::CHARACTER, ' ', ui::VKEY_SPACE}, - {true, ui::DomKey::CHARACTER, ' ', ui::VKEY_SPACE}}, + {true, ui::DomKey::Constant<' '>::Character, ui::VKEY_SPACE}, + {true, ui::DomKey::Constant<' '>::Character, ui::VKEY_SPACE}}, {ui::DomCode::MINUS, - {true, ui::DomKey::CHARACTER, '-', ui::VKEY_OEM_MINUS}, - {true, ui::DomKey::CHARACTER, '_', ui::VKEY_OEM_MINUS}}, + {true, ui::DomKey::Constant<'-'>::Character, ui::VKEY_OEM_MINUS}, + {true, ui::DomKey::Constant<'_'>::Character, ui::VKEY_OEM_MINUS}}, {ui::DomCode::EQUAL, - {true, ui::DomKey::CHARACTER, '=', ui::VKEY_OEM_PLUS}, - {true, ui::DomKey::CHARACTER, '+', ui::VKEY_OEM_PLUS}}, + {true, ui::DomKey::Constant<'='>::Character, ui::VKEY_OEM_PLUS}, + {true, ui::DomKey::Constant<'+'>::Character, ui::VKEY_OEM_PLUS}}, {ui::DomCode::BRACKET_LEFT, - {true, ui::DomKey::CHARACTER, '[', ui::VKEY_OEM_4}, - {true, ui::DomKey::CHARACTER, '{', ui::VKEY_OEM_4}}, + {true, ui::DomKey::Constant<'['>::Character, ui::VKEY_OEM_4}, + {true, ui::DomKey::Constant<'{'>::Character, ui::VKEY_OEM_4}}, {ui::DomCode::BRACKET_RIGHT, - {true, ui::DomKey::CHARACTER, ']', ui::VKEY_OEM_6}, - {true, ui::DomKey::CHARACTER, '}', ui::VKEY_OEM_6}}, + {true, ui::DomKey::Constant<']'>::Character, ui::VKEY_OEM_6}, + {true, ui::DomKey::Constant<'}'>::Character, ui::VKEY_OEM_6}}, {ui::DomCode::BACKSLASH, - {true, ui::DomKey::CHARACTER, '\\', ui::VKEY_OEM_5}, - {true, ui::DomKey::CHARACTER, '|', ui::VKEY_OEM_5}}, + {true, ui::DomKey::Constant<'\\'>::Character, ui::VKEY_OEM_5}, + {true, ui::DomKey::Constant<'|'>::Character, ui::VKEY_OEM_5}}, {ui::DomCode::SEMICOLON, - {true, ui::DomKey::CHARACTER, ';', ui::VKEY_OEM_1}, - {true, ui::DomKey::CHARACTER, ':', ui::VKEY_OEM_1}}, + {true, ui::DomKey::Constant<';'>::Character, ui::VKEY_OEM_1}, + {true, ui::DomKey::Constant<':'>::Character, ui::VKEY_OEM_1}}, {ui::DomCode::QUOTE, - {true, ui::DomKey::CHARACTER, '\'', ui::VKEY_OEM_7}, - {true, ui::DomKey::CHARACTER, '"', ui::VKEY_OEM_7}}, + {true, ui::DomKey::Constant<'\''>::Character, ui::VKEY_OEM_7}, + {true, ui::DomKey::Constant<'"'>::Character, ui::VKEY_OEM_7}}, {ui::DomCode::BACKQUOTE, - {true, ui::DomKey::CHARACTER, '`', ui::VKEY_OEM_3}, - {true, ui::DomKey::CHARACTER, '~', ui::VKEY_OEM_3}}, + {true, ui::DomKey::Constant<'`'>::Character, ui::VKEY_OEM_3}, + {true, ui::DomKey::Constant<'~'>::Character, ui::VKEY_OEM_3}}, {ui::DomCode::COMMA, - {true, ui::DomKey::CHARACTER, ',', ui::VKEY_OEM_COMMA}, - {true, ui::DomKey::CHARACTER, '<', ui::VKEY_OEM_COMMA}}, + {true, ui::DomKey::Constant<','>::Character, ui::VKEY_OEM_COMMA}, + {true, ui::DomKey::Constant<'<'>::Character, ui::VKEY_OEM_COMMA}}, {ui::DomCode::PERIOD, - {true, ui::DomKey::CHARACTER, '.', ui::VKEY_OEM_PERIOD}, - {true, ui::DomKey::CHARACTER, '>', ui::VKEY_OEM_PERIOD}}, + {true, ui::DomKey::Constant<'.'>::Character, ui::VKEY_OEM_PERIOD}, + {true, ui::DomKey::Constant<'>'>::Character, ui::VKEY_OEM_PERIOD}}, {ui::DomCode::SLASH, - {true, ui::DomKey::CHARACTER, '/', ui::VKEY_OEM_2}, - {true, ui::DomKey::CHARACTER, '?', ui::VKEY_OEM_2}}, + {true, ui::DomKey::Constant<'/'>::Character, ui::VKEY_OEM_2}, + {true, ui::DomKey::Constant<'?'>::Character, ui::VKEY_OEM_2}}, {ui::DomCode::INTL_BACKSLASH, - {true, ui::DomKey::CHARACTER, '<', ui::VKEY_OEM_102}, - {true, ui::DomKey::CHARACTER, '>', ui::VKEY_OEM_102}}, + {true, ui::DomKey::Constant<'<'>::Character, ui::VKEY_OEM_102}, + {true, ui::DomKey::Constant<'>'>::Character, ui::VKEY_OEM_102}}, {ui::DomCode::INTL_YEN, - {true, ui::DomKey::CHARACTER, 0x00A5, ui::VKEY_OEM_5}, - {true, ui::DomKey::CHARACTER, '|', ui::VKEY_OEM_5}}, + {true, ui::DomKey::Constant<0x00A5>::Character, ui::VKEY_OEM_5}, + {true, ui::DomKey::Constant<'|'>::Character, ui::VKEY_OEM_5}}, {ui::DomCode::NUMPAD_DIVIDE, - {true, ui::DomKey::CHARACTER, '/', ui::VKEY_DIVIDE}, - {true, ui::DomKey::CHARACTER, '/', ui::VKEY_DIVIDE}}, + {true, ui::DomKey::Constant<'/'>::Character, ui::VKEY_DIVIDE}, + {true, ui::DomKey::Constant<'/'>::Character, ui::VKEY_DIVIDE}}, {ui::DomCode::NUMPAD_MULTIPLY, - {true, ui::DomKey::CHARACTER, '*', ui::VKEY_MULTIPLY}, - {true, ui::DomKey::CHARACTER, '*', ui::VKEY_MULTIPLY}}, + {true, ui::DomKey::Constant<'*'>::Character, ui::VKEY_MULTIPLY}, + {true, ui::DomKey::Constant<'*'>::Character, ui::VKEY_MULTIPLY}}, {ui::DomCode::NUMPAD_SUBTRACT, - {true, ui::DomKey::CHARACTER, '-', ui::VKEY_SUBTRACT}, - {true, ui::DomKey::CHARACTER, '-', ui::VKEY_SUBTRACT}}, + {true, ui::DomKey::Constant<'-'>::Character, ui::VKEY_SUBTRACT}, + {true, ui::DomKey::Constant<'-'>::Character, ui::VKEY_SUBTRACT}}, {ui::DomCode::NUMPAD_ADD, - {true, ui::DomKey::CHARACTER, '+', ui::VKEY_ADD}, - {true, ui::DomKey::CHARACTER, '+', ui::VKEY_ADD}}, + {true, ui::DomKey::Constant<'+'>::Character, ui::VKEY_ADD}, + {true, ui::DomKey::Constant<'+'>::Character, ui::VKEY_ADD}}, {ui::DomCode::NUMPAD1, - {true, ui::DomKey::CHARACTER, '1', ui::VKEY_1}, - {true, ui::DomKey::CHARACTER, '1', ui::VKEY_1}}, + {true, ui::DomKey::Constant<'1'>::Character, ui::VKEY_1}, + {true, ui::DomKey::Constant<'1'>::Character, ui::VKEY_1}}, {ui::DomCode::NUMPAD2, - {true, ui::DomKey::CHARACTER, '2', ui::VKEY_2}, - {true, ui::DomKey::CHARACTER, '2', ui::VKEY_2}}, + {true, ui::DomKey::Constant<'2'>::Character, ui::VKEY_2}, + {true, ui::DomKey::Constant<'2'>::Character, ui::VKEY_2}}, {ui::DomCode::NUMPAD3, - {true, ui::DomKey::CHARACTER, '3', ui::VKEY_3}, - {true, ui::DomKey::CHARACTER, '3', ui::VKEY_3}}, + {true, ui::DomKey::Constant<'3'>::Character, ui::VKEY_3}, + {true, ui::DomKey::Constant<'3'>::Character, ui::VKEY_3}}, {ui::DomCode::NUMPAD4, - {true, ui::DomKey::CHARACTER, '4', ui::VKEY_4}, - {true, ui::DomKey::CHARACTER, '4', ui::VKEY_4}}, + {true, ui::DomKey::Constant<'4'>::Character, ui::VKEY_4}, + {true, ui::DomKey::Constant<'4'>::Character, ui::VKEY_4}}, {ui::DomCode::NUMPAD5, - {true, ui::DomKey::CHARACTER, '5', ui::VKEY_5}, - {true, ui::DomKey::CHARACTER, '5', ui::VKEY_5}}, + {true, ui::DomKey::Constant<'5'>::Character, ui::VKEY_5}, + {true, ui::DomKey::Constant<'5'>::Character, ui::VKEY_5}}, {ui::DomCode::NUMPAD6, - {true, ui::DomKey::CHARACTER, '6', ui::VKEY_6}, - {true, ui::DomKey::CHARACTER, '6', ui::VKEY_6}}, + {true, ui::DomKey::Constant<'6'>::Character, ui::VKEY_6}, + {true, ui::DomKey::Constant<'6'>::Character, ui::VKEY_6}}, {ui::DomCode::NUMPAD7, - {true, ui::DomKey::CHARACTER, '7', ui::VKEY_7}, - {true, ui::DomKey::CHARACTER, '7', ui::VKEY_7}}, + {true, ui::DomKey::Constant<'7'>::Character, ui::VKEY_7}, + {true, ui::DomKey::Constant<'7'>::Character, ui::VKEY_7}}, {ui::DomCode::NUMPAD8, - {true, ui::DomKey::CHARACTER, '8', ui::VKEY_8}, - {true, ui::DomKey::CHARACTER, '8', ui::VKEY_8}}, + {true, ui::DomKey::Constant<'8'>::Character, ui::VKEY_8}, + {true, ui::DomKey::Constant<'8'>::Character, ui::VKEY_8}}, {ui::DomCode::NUMPAD9, - {true, ui::DomKey::CHARACTER, '9', ui::VKEY_9}, - {true, ui::DomKey::CHARACTER, '9', ui::VKEY_9}}, + {true, ui::DomKey::Constant<'9'>::Character, ui::VKEY_9}, + {true, ui::DomKey::Constant<'9'>::Character, ui::VKEY_9}}, {ui::DomCode::NUMPAD0, - {true, ui::DomKey::CHARACTER, '0', ui::VKEY_0}, - {true, ui::DomKey::CHARACTER, '0', ui::VKEY_0}}, + {true, ui::DomKey::Constant<'0'>::Character, ui::VKEY_0}, + {true, ui::DomKey::Constant<'0'>::Character, ui::VKEY_0}}, {ui::DomCode::NUMPAD_DECIMAL, - {true, ui::DomKey::CHARACTER, '.', ui::VKEY_DECIMAL}, - {true, ui::DomKey::CHARACTER, '.', ui::VKEY_DECIMAL}}, + {true, ui::DomKey::Constant<'.'>::Character, ui::VKEY_DECIMAL}, + {true, ui::DomKey::Constant<'.'>::Character, ui::VKEY_DECIMAL}}, {ui::DomCode::NUMPAD_EQUAL, - {true, ui::DomKey::CHARACTER, '=', ui::VKEY_UNKNOWN}, - {true, ui::DomKey::CHARACTER, '=', ui::VKEY_UNKNOWN}}, + {true, ui::DomKey::Constant<'='>::Character, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::Constant<'='>::Character, ui::VKEY_UNKNOWN}}, {ui::DomCode::NUMPAD_COMMA, - {true, ui::DomKey::CHARACTER, ',', ui::VKEY_OEM_COMMA}, - {true, ui::DomKey::CHARACTER, ',', ui::VKEY_OEM_COMMA}}, + {true, ui::DomKey::Constant<','>::Character, ui::VKEY_OEM_COMMA}, + {true, ui::DomKey::Constant<','>::Character, ui::VKEY_OEM_COMMA}}, {ui::DomCode::NUMPAD_PAREN_LEFT, - {true, ui::DomKey::CHARACTER, '(', ui::VKEY_UNKNOWN}, - {true, ui::DomKey::CHARACTER, '(', ui::VKEY_UNKNOWN}}, + {true, ui::DomKey::Constant<'('>::Character, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::Constant<'('>::Character, ui::VKEY_UNKNOWN}}, {ui::DomCode::NUMPAD_PAREN_RIGHT, - {true, ui::DomKey::CHARACTER, ')', ui::VKEY_UNKNOWN}, - {true, ui::DomKey::CHARACTER, ')', ui::VKEY_UNKNOWN}}, + {true, ui::DomKey::Constant<')'>::Character, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::Constant<')'>::Character, ui::VKEY_UNKNOWN}}, {ui::DomCode::NUMPAD_SIGN_CHANGE, - {true, ui::DomKey::CHARACTER, 0xB1, ui::VKEY_UNKNOWN}, - {true, ui::DomKey::CHARACTER, 0xB1, ui::VKEY_UNKNOWN}}, + {true, ui::DomKey::Constant<0xB1>::Character, ui::VKEY_UNKNOWN}, + {true, ui::DomKey::Constant<0xB1>::Character, ui::VKEY_UNKNOWN}}, }; for (const auto& it : kPrintableUsLayout) { - CheckDomCodeToMeaning("p_us_n", ui::DomCodeToUsLayoutMeaning, it.dom_code, + CheckDomCodeToMeaning("p_us_n", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_NONE, it.normal); - CheckDomCodeToMeaning("p_us_s", ui::DomCodeToUsLayoutMeaning, it.dom_code, + CheckDomCodeToMeaning("p_us_s", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_SHIFT_DOWN, it.shift); - CheckDomCodeToMeaning("p_us_a", ui::DomCodeToUsLayoutMeaning, it.dom_code, + CheckDomCodeToMeaning("p_us_a", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_ALTGR_DOWN, it.normal); - CheckDomCodeToMeaning("p_us_a", ui::DomCodeToUsLayoutMeaning, it.dom_code, + CheckDomCodeToMeaning("p_us_a", ui::DomCodeToUsLayoutDomKey, it.dom_code, ui::EF_ALTGR_DOWN|ui::EF_SHIFT_DOWN, it.shift); } } diff --git a/ui/events/keycodes/keyboard_code_conversion_x.cc b/ui/events/keycodes/keyboard_code_conversion_x.cc index 9b0dc90..2b11557 100644 --- a/ui/events/keycodes/keyboard_code_conversion_x.cc +++ b/ui/events/keycodes/keyboard_code_conversion_x.cc @@ -900,7 +900,7 @@ uint16 GetCharacterFromXEvent(const XEvent* xev) { return GetUnicodeCharacterFromXKeySym(keysym); } -void GetMeaningFromXEvent(const XEvent* xev, DomKey* key, base::char16* ch) { +DomKey GetDomKeyFromXEvent(const XEvent* xev) { XEvent xkeyevent = {0}; const XKeyEvent* xkey = NULL; if (xev->type == GenericEvent) { @@ -913,8 +913,8 @@ void GetMeaningFromXEvent(const XEvent* xev, DomKey* key, base::char16* ch) { } KeySym keysym = XK_VoidSymbol; XLookupString(const_cast<XKeyEvent*>(xkey), NULL, 0, &keysym, NULL); - *ch = GetUnicodeCharacterFromXKeySym(keysym); - *key = XKeySymToDomKey(keysym, *ch); + base::char16 ch = GetUnicodeCharacterFromXKeySym(keysym); + return XKeySymToDomKey(keysym, ch); } KeyboardCode DefaultKeyboardCodeFromHardwareKeycode( diff --git a/ui/events/keycodes/keyboard_code_conversion_x.h b/ui/events/keycodes/keyboard_code_conversion_x.h index 0eafb34d..7ead7c2 100644 --- a/ui/events/keycodes/keyboard_code_conversion_x.h +++ b/ui/events/keycodes/keyboard_code_conversion_x.h @@ -8,6 +8,7 @@ #include "base/basictypes.h" #include "base/strings/string16.h" #include "ui/events/events_base_export.h" +#include "ui/events/keycodes/dom/dom_key.h" #include "ui/events/keycodes/keyboard_codes_posix.h" typedef union _XEvent XEvent; @@ -16,7 +17,6 @@ typedef struct _XDisplay XDisplay; namespace ui { enum class DomCode; -enum class DomKey; EVENTS_BASE_EXPORT KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev); @@ -28,9 +28,7 @@ EVENTS_BASE_EXPORT DomCode CodeFromXEvent(const XEvent* xev); EVENTS_BASE_EXPORT uint16 GetCharacterFromXEvent(const XEvent* xev); // Returns DomKey and character from an XEvent. -EVENTS_BASE_EXPORT void GetMeaningFromXEvent(const XEvent* xev, - DomKey* key, - base::char16* character); +EVENTS_BASE_EXPORT DomKey GetDomKeyFromXEvent(const XEvent* xev); // Converts a KeyboardCode into an X KeySym. EVENTS_BASE_EXPORT int XKeysymForWindowsKeyCode(KeyboardCode keycode, diff --git a/ui/events/keycodes/keyboard_code_conversion_xkb.cc b/ui/events/keycodes/keyboard_code_conversion_xkb.cc index b84988a..284a59d 100644 --- a/ui/events/keycodes/keyboard_code_conversion_xkb.cc +++ b/ui/events/keycodes/keyboard_code_conversion_xkb.cc @@ -7,6 +7,10 @@ #include "ui/events/keycodes/dom/dom_key.h" #include "ui/events/keycodes/keyboard_code_conversion.h" +#ifndef XK_dead_greek +#define XK_dead_greek 0xfe8c +#endif + namespace ui { DomKey NonPrintableXKeySymToDomKey(xkb_keysym_t keysym) { @@ -353,36 +357,104 @@ DomKey NonPrintableXKeySymToDomKey(xkb_keysym_t keysym) { case XKB_KEY_ISO_Last_Group: return DomKey::GROUP_LAST; case XKB_KEY_dead_grave: + // combining grave accent + return DomKey::DeadKeyFromCombiningCharacter(0x0300); case XKB_KEY_dead_acute: + // combining acute accent + return DomKey::DeadKeyFromCombiningCharacter(0x0301); case XKB_KEY_dead_circumflex: + // combining circumflex accent + return DomKey::DeadKeyFromCombiningCharacter(0x0302); case XKB_KEY_dead_tilde: + // combining tilde + return DomKey::DeadKeyFromCombiningCharacter(0x0303); case XKB_KEY_dead_macron: + // combining macron + return DomKey::DeadKeyFromCombiningCharacter(0x0304); case XKB_KEY_dead_breve: + // combining breve + return DomKey::DeadKeyFromCombiningCharacter(0x0306); case XKB_KEY_dead_abovedot: + // combining dot above + return DomKey::DeadKeyFromCombiningCharacter(0x0307); case XKB_KEY_dead_diaeresis: + // combining diaeresis + return DomKey::DeadKeyFromCombiningCharacter(0x0308); case XKB_KEY_dead_abovering: + // combining ring above + return DomKey::DeadKeyFromCombiningCharacter(0x030A); case XKB_KEY_dead_doubleacute: + // combining double acute accent + return DomKey::DeadKeyFromCombiningCharacter(0x030B); case XKB_KEY_dead_caron: + // combining caron + return DomKey::DeadKeyFromCombiningCharacter(0x030C); case XKB_KEY_dead_cedilla: + // combining cedilla + return DomKey::DeadKeyFromCombiningCharacter(0x0327); case XKB_KEY_dead_ogonek: + // combining ogonek + return DomKey::DeadKeyFromCombiningCharacter(0x0328); case XKB_KEY_dead_iota: + // combining greek ypogegrammeni + return DomKey::DeadKeyFromCombiningCharacter(0x0345); + case XKB_KEY_dead_voiced_sound: + // combining voiced sound mark + return DomKey::DeadKeyFromCombiningCharacter(0x3099); + case XKB_KEY_dead_semivoiced_sound: + // combining semi-voiced sound mark + return DomKey::DeadKeyFromCombiningCharacter(0x309A); case XKB_KEY_dead_belowdot: + // combining dot below + return DomKey::DeadKeyFromCombiningCharacter(0x0323); case XKB_KEY_dead_hook: + // combining hook above + return DomKey::DeadKeyFromCombiningCharacter(0x0309); case XKB_KEY_dead_horn: + // combining horn + return DomKey::DeadKeyFromCombiningCharacter(0x031B); case XKB_KEY_dead_stroke: + // combining long solidus overlay + return DomKey::DeadKeyFromCombiningCharacter(0x0338); case XKB_KEY_dead_abovecomma: + // combining comma above + return DomKey::DeadKeyFromCombiningCharacter(0x0313); case XKB_KEY_dead_abovereversedcomma: + // combining reversed comma above + return DomKey::DeadKeyFromCombiningCharacter(0x0314); case XKB_KEY_dead_doublegrave: + // combining double grave accent + return DomKey::DeadKeyFromCombiningCharacter(0x030F); case XKB_KEY_dead_belowring: + // combining ring below + return DomKey::DeadKeyFromCombiningCharacter(0x0325); case XKB_KEY_dead_belowmacron: + // combining macron below + return DomKey::DeadKeyFromCombiningCharacter(0x0331); case XKB_KEY_dead_belowcircumflex: + // combining circumflex accent below + return DomKey::DeadKeyFromCombiningCharacter(0x032D); case XKB_KEY_dead_belowtilde: + // combining tilde below + return DomKey::DeadKeyFromCombiningCharacter(0x0330); case XKB_KEY_dead_belowbreve: + // combining breve below + return DomKey::DeadKeyFromCombiningCharacter(0x032E); case XKB_KEY_dead_belowdiaeresis: + // combining diaeresis below + return DomKey::DeadKeyFromCombiningCharacter(0x0324); case XKB_KEY_dead_invertedbreve: + // combining inverted breve + return DomKey::DeadKeyFromCombiningCharacter(0x0311); case XKB_KEY_dead_belowcomma: + // combining comma below + return DomKey::DeadKeyFromCombiningCharacter(0x0326); case XKB_KEY_dead_currency: - return DomKey::DEAD; + // currency sign + return DomKey::DeadKeyFromCombiningCharacter(0x00A4); + case XKB_KEY_dead_greek: + // greek question mark + return DomKey::DeadKeyFromCombiningCharacter(0x037E); default: return DomKey::NONE; } @@ -390,9 +462,9 @@ DomKey NonPrintableXKeySymToDomKey(xkb_keysym_t keysym) { DomKey XKeySymToDomKey(xkb_keysym_t keysym, base::char16 character) { DomKey dom_key = NonPrintableXKeySymToDomKey(keysym); - if (dom_key == DomKey::NONE) - dom_key = CharacterToDomKey(character); - return dom_key; + if (dom_key != DomKey::NONE) + return dom_key; + return DomKey::FromCharacter(character); } } // namespace ui diff --git a/ui/events/keycodes/keyboard_code_conversion_xkb.h b/ui/events/keycodes/keyboard_code_conversion_xkb.h index 3ded138..86e82f4 100644 --- a/ui/events/keycodes/keyboard_code_conversion_xkb.h +++ b/ui/events/keycodes/keyboard_code_conversion_xkb.h @@ -9,12 +9,11 @@ #include "base/strings/string16.h" #include "ui/events/events_base_export.h" +#include "ui/events/keycodes/dom/dom_key.h" #include "ui/events/keycodes/xkb_keysym.h" namespace ui { -enum class DomKey; - // Returns the DomKey associated with a non-character xkb_keysym_t. // Returns DomKey::NONE for unrecognized keysyms, which includes // all printable characters. diff --git a/ui/events/ozone/BUILD.gn b/ui/events/ozone/BUILD.gn index ce41de9..4bb3ad2 100644 --- a/ui/events/ozone/BUILD.gn +++ b/ui/events/ozone/BUILD.gn @@ -194,8 +194,6 @@ component("events_ozone_layout") { "layout/xkb/xkb_evdev_codes.cc", "layout/xkb/xkb_evdev_codes.h", "layout/xkb/xkb_key_code_converter.h", - "layout/xkb/xkb_keyboard_code_conversion.cc", - "layout/xkb/xkb_keyboard_code_conversion.h", "layout/xkb/xkb_keyboard_layout_engine.cc", "layout/xkb/xkb_keyboard_layout_engine.h", "layout/xkb/xkb_keysym.h", diff --git a/ui/events/ozone/evdev/keyboard_evdev.cc b/ui/events/ozone/evdev/keyboard_evdev.cc index 58be1c5..95a726d 100644 --- a/ui/events/ozone/evdev/keyboard_evdev.cc +++ b/ui/events/ozone/evdev/keyboard_evdev.cc @@ -212,9 +212,8 @@ void KeyboardEvdev::DispatchKey(unsigned int key, int flags = modifiers_->GetModifierFlags(); DomKey dom_key; KeyboardCode key_code; - uint16 character; uint32 platform_keycode = 0; - if (!keyboard_layout_engine_->Lookup(dom_code, flags, &dom_key, &character, + if (!keyboard_layout_engine_->Lookup(dom_code, flags, &dom_key, &key_code, &platform_keycode)) { return; } @@ -224,7 +223,7 @@ void KeyboardEvdev::DispatchKey(unsigned int key, } KeyEvent event(down ? ET_KEY_PRESSED : ET_KEY_RELEASED, key_code, dom_code, - modifiers_->GetModifierFlags(), dom_key, character, timestamp); + modifiers_->GetModifierFlags(), dom_key, timestamp); event.set_source_device_id(device_id); if (platform_keycode) event.set_platform_keycode(platform_keycode); diff --git a/ui/events/ozone/events_ozone.gyp b/ui/events/ozone/events_ozone.gyp index 37a3923..3562651 100644 --- a/ui/events/ozone/events_ozone.gyp +++ b/ui/events/ozone/events_ozone.gyp @@ -193,8 +193,6 @@ 'layout/xkb/xkb_evdev_codes.cc', 'layout/xkb/xkb_evdev_codes.h', 'layout/xkb/xkb_key_code_converter.h', - 'layout/xkb/xkb_keyboard_code_conversion.cc', - 'layout/xkb/xkb_keyboard_code_conversion.h', 'layout/xkb/xkb_keyboard_layout_engine.cc', 'layout/xkb/xkb_keyboard_layout_engine.h', 'layout/xkb/xkb_keysym.h', diff --git a/ui/events/ozone/layout/keyboard_layout_engine.h b/ui/events/ozone/layout/keyboard_layout_engine.h index c4a96d4..1e15dfa 100644 --- a/ui/events/ozone/layout/keyboard_layout_engine.h +++ b/ui/events/ozone/layout/keyboard_layout_engine.h @@ -8,13 +8,13 @@ #include <string> #include "base/strings/string16.h" +#include "ui/events/keycodes/dom/dom_key.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/events/ozone/layout/events_ozone_layout_export.h" namespace ui { enum class DomCode; -enum class DomKey; // A KeyboardLayoutEngine provides a platform-independent interface to // key mapping. Key mapping provides a meaning (DomKey and character, @@ -66,7 +66,6 @@ class EVENTS_OZONE_LAYOUT_EXPORT KeyboardLayoutEngine { virtual bool Lookup(DomCode dom_code, int event_flags, DomKey* dom_key, - base::char16* character, KeyboardCode* key_code, uint32* platform_keycode) const = 0; }; diff --git a/ui/events/ozone/layout/layout_util.h b/ui/events/ozone/layout/layout_util.h index 84d9d1d..5a2ba52 100644 --- a/ui/events/ozone/layout/layout_util.h +++ b/ui/events/ozone/layout/layout_util.h @@ -8,13 +8,12 @@ // TODO(kpschoedel): consider moving this out of Ozone. #include "base/strings/string16.h" +#include "ui/events/keycodes/dom/dom_key.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/events/ozone/layout/events_ozone_layout_export.h" namespace ui { -enum class DomKey; - // Returns the ui::EventFlags value associated with a modifier key, // or 0 (EF_NONE) if the key is not a modifier. EVENTS_OZONE_LAYOUT_EXPORT int ModifierDomKeyToEventFlag(DomKey key); diff --git a/ui/events/ozone/layout/no/no_keyboard_layout_engine.cc b/ui/events/ozone/layout/no/no_keyboard_layout_engine.cc index 74721a1..aad89ad 100644 --- a/ui/events/ozone/layout/no/no_keyboard_layout_engine.cc +++ b/ui/events/ozone/layout/no/no_keyboard_layout_engine.cc @@ -26,7 +26,6 @@ bool NoKeyboardLayoutEngine::UsesAltGr() const { bool NoKeyboardLayoutEngine::Lookup(DomCode dom_code, int flags, DomKey* dom_key, - base::char16* character, KeyboardCode* key_code, uint32* platform_keycode) const { return false; diff --git a/ui/events/ozone/layout/no/no_keyboard_layout_engine.h b/ui/events/ozone/layout/no/no_keyboard_layout_engine.h index 00cbda9..8b6a627 100644 --- a/ui/events/ozone/layout/no/no_keyboard_layout_engine.h +++ b/ui/events/ozone/layout/no/no_keyboard_layout_engine.h @@ -24,7 +24,6 @@ class EVENTS_OZONE_LAYOUT_EXPORT NoKeyboardLayoutEngine bool Lookup(DomCode dom_code, int flags, DomKey* dom_key, - base::char16* character, KeyboardCode* key_code, uint32* platform_keycode) const override; }; diff --git a/ui/events/ozone/layout/stub/stub_keyboard_layout_engine.cc b/ui/events/ozone/layout/stub/stub_keyboard_layout_engine.cc index 83310a7..a1e898b 100644 --- a/ui/events/ozone/layout/stub/stub_keyboard_layout_engine.cc +++ b/ui/events/ozone/layout/stub/stub_keyboard_layout_engine.cc @@ -41,11 +41,9 @@ bool StubKeyboardLayoutEngine::UsesAltGr() const { bool StubKeyboardLayoutEngine::Lookup(DomCode dom_code, int flags, DomKey* out_dom_key, - base::char16* out_character, KeyboardCode* out_key_code, uint32* platform_keycode) const { - return DomCodeToUsLayoutMeaning(dom_code, flags, out_dom_key, out_character, - out_key_code); + return DomCodeToUsLayoutDomKey(dom_code, flags, out_dom_key, out_key_code); } } // namespace ui diff --git a/ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h b/ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h index a2d4912..0aa532f 100644 --- a/ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h +++ b/ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h @@ -24,7 +24,6 @@ class EVENTS_OZONE_LAYOUT_EXPORT StubKeyboardLayoutEngine bool Lookup(DomCode dom_code, int flags, DomKey* dom_key, - base::char16* character, KeyboardCode* key_code, uint32* platform_keycode) const override; }; diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.cc deleted file mode 100644 index 69571c3..0000000 --- a/ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.cc +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.h" - -#include "ui/events/keycodes/dom/dom_key.h" - -namespace ui { - -base::char16 DeadXkbKeySymToCombiningCharacter(xkb_keysym_t keysym) { - switch (keysym) { - case XKB_KEY_dead_grave: - return 0x0300; // combining grave accent - case XKB_KEY_dead_acute: - return 0x0301; // combining acute accent - case XKB_KEY_dead_circumflex: - return 0x0302; // combining circumflex accent - case XKB_KEY_dead_tilde: - return 0x0303; // combining tilde - case XKB_KEY_dead_macron: - return 0x0304; // combining macron - case XKB_KEY_dead_breve: - return 0x0306; // combining breve - case XKB_KEY_dead_abovedot: - return 0x0307; // combining dot above - case XKB_KEY_dead_diaeresis: - return 0x0308; // combining diaeresis - case XKB_KEY_dead_abovering: - return 0x030A; // combining ring above - case XKB_KEY_dead_doubleacute: - return 0x030B; // combining double acute accent - case XKB_KEY_dead_caron: - return 0x030C; // combining caron - case XKB_KEY_dead_cedilla: - return 0x0327; // combining cedilla - case XKB_KEY_dead_ogonek: - return 0x0328; // combining ogonek - case XKB_KEY_dead_iota: - return 0x0345; // combining greek ypogegrammeni - case XKB_KEY_dead_voiced_sound: - return 0x3099; // combining katakana-hiragana voiced sound mark - case XKB_KEY_dead_semivoiced_sound: - return 0x309A; // combining katakana-hiragana semi-voiced sound mark - case XKB_KEY_dead_belowdot: - return 0x0323; // combining dot below - case XKB_KEY_dead_hook: - return 0x0309; // combining hook above - case XKB_KEY_dead_horn: - return 0x031B; // combining horn - case XKB_KEY_dead_stroke: - return 0x0338; // combining long solidus overlay - case XKB_KEY_dead_abovecomma: - return 0x0313; // combining comma above - case XKB_KEY_dead_abovereversedcomma: - return 0x0314; // combining reversed comma above - case XKB_KEY_dead_doublegrave: - return 0x030F; // combining double grave accent - case XKB_KEY_dead_belowring: - return 0x0325; // combining ring below - case XKB_KEY_dead_belowmacron: - return 0x0331; // combining macron below - case XKB_KEY_dead_belowcircumflex: - return 0x032D; // combining circumflex accent below - case XKB_KEY_dead_belowtilde: - return 0x0330; // combining tilde below - case XKB_KEY_dead_belowbreve: - return 0x032E; // combining breve below - case XKB_KEY_dead_belowdiaeresis: - return 0x0324; // combining diaeresis below - case XKB_KEY_dead_invertedbreve: - return 0x0311; // combining inverted breve - case XKB_KEY_dead_belowcomma: - return 0x0326; // combining comma below - case XKB_KEY_dead_currency: - return 0x00A4; // currency sign - case XKB_KEY_dead_greek: - return 0x037E; // greek question mark - default: - return 0; - } -} - -} // namespace ui diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.h b/ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.h deleted file mode 100644 index 0fd5252..0000000 --- a/ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_EVENTS_OZONE_LAYOUT_XKB_XKB_KEYBOARD_CODE_CONVERSION_H_ -#define UI_EVENTS_OZONE_LAYOUT_XKB_XKB_KEYBOARD_CODE_CONVERSION_H_ - -// TODO(kpschoedel): move this file out of Ozone so that it can be used to -// determine DomKey for desktop X11, OR switch desktop X11 to use the Ozone -// keyboard layout interface. - -#include <xkbcommon/xkbcommon.h> - -#include "base/strings/string16.h" -#include "ui/events/keycodes/keyboard_codes.h" - -namespace ui { - -enum class DomKey; - -// Returns the dead key combining character associated with an xkb_keysym_t, -// or 0 if the keysym is not recognized. -base::char16 DeadXkbKeySymToCombiningCharacter(xkb_keysym_t keysym); - -} // namespace ui - -#endif // UI_EVENTS_OZONE_LAYOUT_XKB_XKB_KEYBOARD_CODE_CONVERSION_H_ diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc index 3e393dc8..5307f73 100644 --- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc +++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc @@ -19,7 +19,6 @@ #include "ui/events/keycodes/dom/keycode_converter.h" #include "ui/events/keycodes/keyboard_code_conversion.h" #include "ui/events/keycodes/keyboard_code_conversion_xkb.h" -#include "ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.h" namespace ui { @@ -716,9 +715,8 @@ bool XkbKeyboardLayoutEngine::UsesAltGr() const { bool XkbKeyboardLayoutEngine::Lookup(DomCode dom_code, int flags, DomKey* dom_key, - base::char16* character, KeyboardCode* key_code, - uint32* platform_keycode) const { + uint32_t* platform_keycode) const { if (dom_code == DomCode::NONE) return false; // Convert DOM physical key to XKB representation. @@ -732,30 +730,26 @@ bool XkbKeyboardLayoutEngine::Lookup(DomCode dom_code, xkb_mod_mask_t xkb_flags = EventFlagsToXkbFlags(flags); // Obtain keysym and character. xkb_keysym_t xkb_keysym; - if (!XkbLookup(xkb_keycode, xkb_flags, &xkb_keysym, character)) + uint32_t character = 0; + if (!XkbLookup(xkb_keycode, xkb_flags, &xkb_keysym, &character)) return false; *platform_keycode = xkb_keysym; // Classify the keysym and convert to DOM and VKEY representations. *dom_key = NonPrintableXKeySymToDomKey(xkb_keysym); if (*dom_key == DomKey::NONE) { - *dom_key = CharacterToDomKey(*character); - *key_code = AlphanumericKeyboardCode(*character); + *dom_key = DomKey::FromCharacter(character); + *key_code = AlphanumericKeyboardCode(character); if (*key_code == VKEY_UNKNOWN) { *key_code = DifficultKeyboardCode(dom_code, flags, xkb_keycode, xkb_flags, - xkb_keysym, *dom_key, *character); - if (*key_code == VKEY_UNKNOWN) { + xkb_keysym, character); + if (*key_code == VKEY_UNKNOWN) *key_code = LocatedToNonLocatedKeyboardCode( DomCodeToUsLayoutKeyboardCode(dom_code)); - } } // If the Control key is down, only allow ASCII control characters to be // returned, regardless of the key layout. crbug.com/450849 - if ((flags & EF_CONTROL_DOWN) && (*character >= 0x20)) - *character = 0; - } else if (*dom_key == DomKey::DEAD) { - *character = DeadXkbKeySymToCombiningCharacter(xkb_keysym); - *key_code = LocatedToNonLocatedKeyboardCode( - DomCodeToUsLayoutKeyboardCode(dom_code)); + if ((flags & EF_CONTROL_DOWN) && (character >= 0x20)) + *dom_key = DomKey::UNIDENTIFIED; } else { *key_code = NonPrintableDomKeyToKeyboardCode(*dom_key); if (*key_code == VKEY_UNKNOWN) { @@ -815,7 +809,7 @@ xkb_mod_mask_t XkbKeyboardLayoutEngine::EventFlagsToXkbFlags( bool XkbKeyboardLayoutEngine::XkbLookup(xkb_keycode_t xkb_keycode, xkb_mod_mask_t xkb_flags, xkb_keysym_t* xkb_keysym, - base::char16* character) const { + uint32_t* character) const { if (!xkb_state_) { LOG(ERROR) << "No current XKB state"; return false; @@ -824,9 +818,9 @@ bool XkbKeyboardLayoutEngine::XkbLookup(xkb_keycode_t xkb_keycode, *xkb_keysym = xkb_state_key_get_one_sym(xkb_state_.get(), xkb_keycode); if (*xkb_keysym == XKB_KEY_NoSymbol) return false; - uint32_t c = xkb_state_key_get_utf32(xkb_state_.get(), xkb_keycode); - DLOG_IF(ERROR, c != (c & 0xFFFF)) << "Non-BMP character:" << c; - *character = static_cast<base::char16>(c); + *character = xkb_state_key_get_utf32(xkb_state_.get(), xkb_keycode); + DLOG_IF(ERROR, *character != (*character & 0xFFFF)) + << "Non-BMP character:" << *character; return true; } @@ -836,19 +830,18 @@ KeyboardCode XkbKeyboardLayoutEngine::DifficultKeyboardCode( xkb_keycode_t xkb_keycode, xkb_mod_mask_t xkb_flags, xkb_keysym_t xkb_keysym, - DomKey dom_key, base::char16 character) const { // Get the layout interpretation without modifiers, so that // e.g. Ctrl+D correctly generates VKEY_D. xkb_keysym_t plain_keysym; - base::char16 plain_character; + uint32_t plain_character; if (!XkbLookup(xkb_keycode, 0, &plain_keysym, &plain_character)) return VKEY_UNKNOWN; // If the plain key is non-printable, that determines the VKEY. DomKey plain_key = NonPrintableXKeySymToDomKey(plain_keysym); if (plain_key != ui::DomKey::NONE) - return NonPrintableDomKeyToKeyboardCode(dom_key); + return NonPrintableDomKeyToKeyboardCode(plain_key); // Plain ASCII letters and digits map directly to VKEY values. KeyboardCode key_code = AlphanumericKeyboardCode(plain_character); @@ -911,7 +904,7 @@ base::char16 XkbKeyboardLayoutEngine::XkbSubCharacter( if (flags == base_flags) return base_character; xkb_keysym_t keysym; - base::char16 character = 0; + uint32_t character = 0; if (!XkbLookup(xkb_keycode, flags, &keysym, &character)) character = kNone; return character; diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h index 89729a0..ccc8d65 100644 --- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h +++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h @@ -37,7 +37,6 @@ class EVENTS_OZONE_LAYOUT_EXPORT XkbKeyboardLayoutEngine bool Lookup(DomCode dom_code, int flags, DomKey* dom_key, - base::char16* character, KeyboardCode* key_code, uint32* platform_keycode) const override; @@ -59,13 +58,12 @@ class EVENTS_OZONE_LAYOUT_EXPORT XkbKeyboardLayoutEngine // Determines the Windows-based KeyboardCode (VKEY) for a character key, // accounting for non-US layouts. May return VKEY_UNKNOWN, in which case the // caller should, as a last resort, obtain a KeyboardCode using - // |DomCodeToUsLayoutMeaning()|. + // |DomCodeToUsLayoutDomKey()|. KeyboardCode DifficultKeyboardCode(DomCode dom_code, int ui_flags, xkb_keycode_t xkb_keycode, xkb_mod_mask_t xkb_flags, xkb_keysym_t xkb_keysym, - DomKey dom_key, base::char16 character) const; // Maps DomCode to xkb_keycode_t. @@ -89,7 +87,7 @@ class EVENTS_OZONE_LAYOUT_EXPORT XkbKeyboardLayoutEngine virtual bool XkbLookup(xkb_keycode_t xkb_keycode, xkb_mod_mask_t xkb_flags, xkb_keysym_t* xkb_keysym, - base::char16* character) const; + uint32_t* character) const; // Helper for difficult VKEY lookup. If |ui_flags| matches |base_flags|, // returns |base_character|; otherwise returns the XKB character for diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc index 6701beb..17ae1d8 100644 --- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc +++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc @@ -85,13 +85,12 @@ class VkTestXkbKeyboardLayoutEngine : public XkbKeyboardLayoutEngine { base::char16 character) const { KeyboardCode key_code = DifficultKeyboardCode( dom_code, flags, key_code_converter_.DomCodeToXkbKeyCode(dom_code), - flags, CharacterToKeySym(character), DomKey::CHARACTER, character); + flags, CharacterToKeySym(character), character); if (key_code == VKEY_UNKNOWN) { DomKey dummy_dom_key; - base::char16 dummy_character; // If this fails, key_code remains VKEY_UNKNOWN. - ignore_result(DomCodeToUsLayoutMeaning(dom_code, EF_NONE, &dummy_dom_key, - &dummy_character, &key_code)); + ignore_result(DomCodeToUsLayoutDomKey(dom_code, EF_NONE, &dummy_dom_key, + &key_code)); } return key_code; } @@ -100,7 +99,7 @@ class VkTestXkbKeyboardLayoutEngine : public XkbKeyboardLayoutEngine { bool XkbLookup(xkb_keycode_t xkb_keycode, xkb_mod_mask_t xkb_flags, xkb_keysym_t* xkb_keysym, - base::char16* character) const override { + uint32_t* character) const override { switch (entry_type_) { case EntryType::NONE: break; @@ -817,11 +816,10 @@ TEST_F(XkbLayoutEngineVkTest, KeyboardCodeForNonPrintable) { SCOPED_TRACE(static_cast<int>(e.test.dom_code)); layout_engine_->SetEntry(&e.test); DomKey dom_key = DomKey::NONE; - base::char16 character = 0; KeyboardCode key_code = VKEY_UNKNOWN; uint32_t keysym; EXPECT_TRUE(layout_engine_->Lookup(e.test.dom_code, EF_NONE, &dom_key, - &character, &key_code, &keysym)); + &key_code, &keysym)); EXPECT_EQ(e.test.keysym, keysym); EXPECT_EQ(e.key_code, key_code); } diff --git a/ui/keyboard/keyboard_util.cc b/ui/keyboard/keyboard_util.cc index 188453f..572aecb 100644 --- a/ui/keyboard/keyboard_util.cc +++ b/ui/keyboard/keyboard_util.cc @@ -38,7 +38,7 @@ const char kKeyUp[] = "keyup"; void SendProcessKeyEvent(ui::EventType type, aura::WindowTreeHost* host) { ui::KeyEvent event(type, ui::VKEY_PROCESSKEY, ui::DomCode::NONE, - ui::EF_IS_SYNTHESIZED, ui::DomKey::PROCESS, 0, + ui::EF_IS_SYNTHESIZED, ui::DomKey::PROCESS, ui::EventTimeForNow()); ui::EventDispatchDetails details = host->event_processor()->OnEventFromSource(&event); @@ -253,17 +253,16 @@ bool MoveCursor(int swipe_direction, if (domcodex != ui::DomCode::NONE) { ui::KeyboardCode codex = ui::VKEY_UNKNOWN; ui::DomKey domkeyx = ui::DomKey::NONE; - base::char16 cx; - ignore_result(DomCodeToUsLayoutMeaning(domcodex, ui::EF_NONE, &domkeyx, - &cx, &codex)); + ignore_result(DomCodeToUsLayoutDomKey(domcodex, ui::EF_NONE, &domkeyx, + &codex)); ui::KeyEvent press_event(ui::ET_KEY_PRESSED, codex, domcodex, - modifier_flags, domkeyx, cx, + modifier_flags, domkeyx, ui::EventTimeForNow()); ui::EventDispatchDetails details = host->event_processor()->OnEventFromSource(&press_event); CHECK(!details.dispatcher_destroyed); ui::KeyEvent release_event(ui::ET_KEY_RELEASED, codex, domcodex, - modifier_flags, domkeyx, cx, + modifier_flags, domkeyx, ui::EventTimeForNow()); details = host->event_processor()->OnEventFromSource(&release_event); CHECK(!details.dispatcher_destroyed); @@ -273,17 +272,16 @@ bool MoveCursor(int swipe_direction, if (domcodey != ui::DomCode::NONE) { ui::KeyboardCode codey = ui::VKEY_UNKNOWN; ui::DomKey domkeyy = ui::DomKey::NONE; - base::char16 cy; - ignore_result(DomCodeToUsLayoutMeaning(domcodey, ui::EF_NONE, &domkeyy, - &cy, &codey)); + ignore_result(DomCodeToUsLayoutDomKey(domcodey, ui::EF_NONE, &domkeyy, + &codey)); ui::KeyEvent press_event(ui::ET_KEY_PRESSED, codey, domcodey, - modifier_flags, domkeyy, cy, + modifier_flags, domkeyy, ui::EventTimeForNow()); ui::EventDispatchDetails details = host->event_processor()->OnEventFromSource(&press_event); CHECK(!details.dispatcher_destroyed); ui::KeyEvent release_event(ui::ET_KEY_RELEASED, codey, domcodey, - modifier_flags, domkeyy, cy, + modifier_flags, domkeyy, ui::EventTimeForNow()); details = host->event_processor()->OnEventFromSource(&release_event); CHECK(!details.dispatcher_destroyed); |