diff options
author | kpschoedel <kpschoedel@chromium.org> | 2015-08-28 08:29:35 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-28 15:30:16 +0000 |
commit | 51d2e327f7a4ff8347867713e098ea81fd601df7 (patch) | |
tree | dfcedf30dd25be910012bc0e6e2c320fb9aeeb55 /ui/events/ozone | |
parent | 4ec68d9ad2d3e0c74967a17946c8bf7ed4450f73 (diff) | |
download | chromium_src-51d2e327f7a4ff8347867713e098ea81fd601df7.zip chromium_src-51d2e327f7a4ff8347867713e098ea81fd601df7.tar.gz chromium_src-51d2e327f7a4ff8347867713e098ea81fd601df7.tar.bz2 |
Revise ui::DomKey to unify character and non-character codes.
DomKey becomes a single integer value corresponding to the DOM
UI Events KeyboardEvent.key string; it can represent either a
Unicode code point or one of the defined non-printable values from
<https://w3c.github.io/DOM-Level-3-Events-key/>.
In the previous representation, ui::DomKey enumerated only the non-
printable values and had a sentinel to indicated that a character value
was held separately. Much of this CL therefore merely replaces
|key, character| pairs with a single |key| value. The most substantial
changes are to
ui/events/keycodes/dom/dom_key.h
ui/events/keycodes/dom/keycode_converter.h
ui/events/event.h
and associated implementations.
BUG=227231
Review URL: https://codereview.chromium.org/1284433002
Cr-Commit-Position: refs/heads/master@{#346152}
Diffstat (limited to 'ui/events/ozone')
14 files changed, 28 insertions, 162 deletions
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); } |