Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Unified Diff: ui/events/keycodes/platform_key_map_win.cc

Issue 2097643002: Reland: [DomKey] Expose Korean special keys on Korean keyboard layout only (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ui/events/keycodes/platform_key_map_win_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/events/keycodes/platform_key_map_win.cc
diff --git a/ui/events/keycodes/platform_key_map_win.cc b/ui/events/keycodes/platform_key_map_win.cc
index 756fabfca5dc72ec6627c38fa04467150b656c83..593e386936dd4167f21ca08105d0024186715185 100644
--- a/ui/events/keycodes/platform_key_map_win.cc
+++ b/ui/events/keycodes/platform_key_map_win.cc
@@ -183,9 +183,6 @@ const struct NonPrintableKeyEntry {
{VKEY_ALTGR, DomKey::ALT_GRAPH},
{VKEY_PROCESSKEY, DomKey::PROCESS},
// VKEY_PACKET - Used to pass Unicode char, considered as printable key.
-
- // TODO(chongz): Handle Japanese keyboard layout keys 0xF0..0xF5.
- // https://crbug.com/612694
{VKEY_ATTN, DomKey::ATTN},
{VKEY_CRSEL, DomKey::CR_SEL},
{VKEY_EXSEL, DomKey::EX_SEL},
@@ -197,7 +194,30 @@ const struct NonPrintableKeyEntry {
{VKEY_OEM_CLEAR, DomKey::CLEAR},
};
-DomKey NonPrintableKeyboardCodeToDomKey(KeyboardCode key_code) {
+// Disambiguates the meaning of certain non-printable keys which have different
+// meanings under different languages, but use the same VKEY code.
+DomKey LanguageSpecificOemKeyboardCodeToDomKey(KeyboardCode key_code,
+ HKL layout) {
+ WORD language = LOWORD(layout);
+ WORD primary_language = PRIMARYLANGID(language);
+ if (primary_language == LANG_KOREAN) {
+ switch (key_code) {
+ case VKEY_HANGUL:
+ return DomKey::HANGUL_MODE;
+ case VKEY_HANJA:
+ return DomKey::HANJA_MODE;
+ default:
+ return DomKey::NONE;
+ }
+ }
+ // TODO(chongz): Handle Japanese keyboard layout keys 0xF0..0xF5, VKEY_KANA,
+ // VKEY_KANJI.
+ // https://crbug.com/612694
+ return DomKey::NONE;
+}
+
+DomKey NonPrintableKeyboardCodeToDomKey(KeyboardCode key_code, HKL layout) {
+ // 1. Most |key_codes| have the same meaning regardless of |layout|.
const NonPrintableKeyEntry* result = std::lower_bound(
std::begin(kNonPrintableKeyMap), std::end(kNonPrintableKeyMap), key_code,
[](const NonPrintableKeyEntry& entry, KeyboardCode needle) {
@@ -205,7 +225,8 @@ DomKey NonPrintableKeyboardCodeToDomKey(KeyboardCode key_code) {
});
if (result != std::end(kNonPrintableKeyMap) && result->key_code == key_code)
return result->dom_key;
- return DomKey::NONE;
+ // 2. Look up a |layout|-specific meaning for |key_code|.
+ return LanguageSpecificOemKeyboardCodeToDomKey(key_code, layout);
}
void CleanupKeyMapTls(void* data) {
@@ -238,14 +259,10 @@ PlatformKeyMap::~PlatformKeyMap() {}
DomKey PlatformKeyMap::DomKeyFromKeyboardCodeImpl(KeyboardCode key_code,
int flags) const {
- DomKey key = NonPrintableKeyboardCodeToDomKey(key_code);
+ DomKey key = NonPrintableKeyboardCodeToDomKey(key_code, keyboard_layout_);
if (key != DomKey::NONE)
return key;
- // TODO(chongz): Handle VKEY_KANA/VKEY_HANGUL, VKEY_HANJA/VKEY_KANJI based on
- // layout.
- // https://crbug.com/612736
-
const int flags_to_try[] = {
// Trying to match Firefox's behavior and UIEvents DomKey guidelines.
// If the combination doesn't produce a printable character, the key value
« no previous file with comments | « no previous file | ui/events/keycodes/platform_key_map_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698