Index: ui/events/event.cc |
diff --git a/ui/events/event.cc b/ui/events/event.cc |
index 5cad8b0001db6fabb13b8f931416f9f52920b1e1..204c923c4f48cc2c8dcb14763a22e9ee8d0c4c46 100644 |
--- a/ui/events/event.cc |
+++ b/ui/events/event.cc |
@@ -17,6 +17,7 @@ |
#include "base/strings/stringprintf.h" |
#include "ui/events/event_utils.h" |
#include "ui/events/keycodes/dom3/dom_code.h" |
+#include "ui/events/keycodes/dom3/dom_key.h" |
#include "ui/events/keycodes/dom4/keycode_converter.h" |
#include "ui/events/keycodes/keyboard_code_conversion.h" |
#include "ui/gfx/geometry/safe_integer_conversions.h" |
@@ -28,7 +29,8 @@ |
#if defined(USE_X11) |
#include "ui/events/keycodes/keyboard_code_conversion_x.h" |
#elif defined(USE_OZONE) |
-#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" |
#endif |
namespace { |
@@ -644,6 +646,7 @@ KeyEvent::KeyEvent(const base::NativeEvent& native_event) |
code_(CodeFromNative(native_event)), |
is_char_(IsCharFromNative(native_event)), |
platform_keycode_(PlatformKeycodeFromNative(native_event)), |
+ key_(DomKey::NONE), |
character_(0) { |
if (IsRepeated(*this)) |
set_flags(flags() | ui::EF_IS_REPEAT); |
@@ -666,6 +669,7 @@ KeyEvent::KeyEvent(EventType type, |
code_(DomCode::NONE), |
is_char_(false), |
platform_keycode_(0), |
+ key_(DomKey::NONE), |
character_() { |
} |
@@ -678,15 +682,32 @@ KeyEvent::KeyEvent(EventType type, |
code_(code), |
is_char_(false), |
platform_keycode_(0), |
+ key_(DomKey::NONE), |
character_(0) { |
} |
+KeyEvent::KeyEvent(EventType type, |
+ KeyboardCode key_code, |
+ DomCode code, |
+ int flags, |
+ DomKey key, |
+ base::char16 character) |
+ : Event(type, EventTimeForNow(), flags), |
+ key_code_(key_code), |
+ code_(code), |
+ is_char_(false), |
+ platform_keycode_(0), |
+ key_(key), |
+ character_(character) { |
+} |
+ |
KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags) |
: Event(ET_KEY_PRESSED, EventTimeForNow(), flags), |
key_code_(key_code), |
code_(DomCode::NONE), |
is_char_(true), |
platform_keycode_(0), |
+ key_(DomKey::CHARACTER), |
character_(character) { |
} |
@@ -696,6 +717,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_) { |
if (rhs.extended_key_event_data_) |
extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); |
@@ -706,6 +728,7 @@ KeyEvent& KeyEvent::operator=(const KeyEvent& rhs) { |
Event::operator=(rhs); |
key_code_ = rhs.key_code_; |
code_ = rhs.code_; |
+ key_ = rhs.key_; |
is_char_ = rhs.is_char_; |
platform_keycode_ = rhs.platform_keycode_; |
character_ = rhs.character_; |
@@ -722,48 +745,54 @@ void KeyEvent::SetExtendedKeyEventData(scoped_ptr<ExtendedKeyEventData> data) { |
extended_key_event_data_ = data.Pass(); |
} |
-base::char16 KeyEvent::GetCharacter() const { |
- if (is_char_ || character_) |
- return character_; |
- |
- // TODO(kpschoedel): streamline these cases after settling Ozone |
- // positional coding. |
+void KeyEvent::ApplyLayout() const { |
#if defined(OS_WIN) |
// Native Windows character events always have is_char_ == true, |
// so this is a synthetic or native keystroke event. |
- character_ = GetCharacterFromKeyCode(key_code_, flags()); |
- return character_; |
+ // Therefore, perform only the fallback action. |
+ GetMeaningFromKeyCode(key_code_, flags(), &key_, &character_); |
#elif defined(USE_X11) |
- if (!native_event()) { |
- character_ = GetCharacterFromKeyCode(key_code_, flags()); |
- return character_; |
- } |
- |
- DCHECK(native_event()->type == KeyPress || |
- native_event()->type == KeyRelease || |
- (native_event()->type == GenericEvent && |
- (native_event()->xgeneric.evtype == XI_KeyPress || |
- native_event()->xgeneric.evtype == XI_KeyRelease))); |
- |
// When a control key is held, prefer ASCII characters to non ASCII |
// characters in order to use it for shortcut keys. GetCharacterFromKeyCode |
// returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11. |
// GetCharacterFromXEvent returns 'à' in that case. |
- return IsControlDown() ? |
+ character_ = (IsControlDown() || !native_event()) ? |
GetCharacterFromKeyCode(key_code_, flags()) : |
GetCharacterFromXEvent(native_event()); |
+ // TODO(kpschoedel): set key_ field for X11. |
+#elif defined(USE_OZONE) |
+ KeyboardCode key_code; |
+ if (!KeyboardLayoutEngineManager::GetKeyboardLayoutEngine()->Lookup( |
+ code_, flags(), &key_, &character_, &key_code)) { |
+ GetMeaningFromKeyCode(key_code_, flags(), &key_, &character_); |
+ } |
#else |
if (native_event()) { |
DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED || |
EventTypeFromNative(native_event()) == ET_KEY_RELEASED); |
} |
- |
- return GetCharacterFromKeyCode(key_code_, flags()); |
+ // TODO(kpschoedel): revise to use DOM code_ instead of Windows key_code_ |
+ GetMeaningFromKeyCode(key_code_, flags(), &key_, &character_); |
#endif |
} |
+DomKey KeyEvent::GetDomKey() const { |
+ // Determination of character_ and 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. |
+ if (key_ == DomKey::NONE) |
+ ApplyLayout(); |
+ return character_; |
+} |
+ |
base::char16 KeyEvent::GetText() const { |
if ((flags() & EF_CONTROL_DOWN) != 0) { |
+ // TODO(kpschoedel): revise to use DOM code_ instead of Windows key_code_ |
return GetControlCharacterForKeycode(key_code_, |
(flags() & EF_SHIFT_DOWN) != 0); |
} |