diff options
Diffstat (limited to 'ui')
-rw-r--r-- | ui/aura/event.cc | 71 | ||||
-rw-r--r-- | ui/aura/event.h | 20 |
2 files changed, 89 insertions, 2 deletions
diff --git a/ui/aura/event.cc b/ui/aura/event.cc index 309858d..91e15ba 100644 --- a/ui/aura/event.cc +++ b/ui/aura/event.cc @@ -4,10 +4,19 @@ #include "ui/aura/event.h" +#if defined(USE_X11) +#include <X11/Xlib.h> +#endif + #include "ui/aura/window.h" +#include "ui/base/keycodes/keyboard_code_conversion.h" #include "ui/gfx/point3.h" #include "ui/gfx/transform.h" +#if defined(USE_X11) +#include "ui/base/keycodes/keyboard_code_conversion_x.h" +#endif + namespace aura { Event::Event(ui::EventType type, int flags) @@ -130,7 +139,9 @@ KeyEvent::KeyEvent(const base::NativeEvent& native_event, bool is_char) ui::EventTypeFromNative(native_event), ui::EventFlagsFromNative(native_event)), key_code_(ui::KeyboardCodeFromNative(native_event)), - is_char_(is_char) { + is_char_(is_char), + character_(0), + unmodified_character_(0) { } KeyEvent::KeyEvent(ui::EventType type, @@ -138,7 +149,63 @@ KeyEvent::KeyEvent(ui::EventType type, int flags) : Event(type, flags), key_code_(key_code), - is_char_(false) { + is_char_(false), + character_(ui::GetCharacterFromKeyCode(key_code, flags)), + unmodified_character_(0) { +} + +uint16 KeyEvent::GetCharacter() const { + if (character_) + return character_; + +#if defined(OS_WIN) + return (native_event().message == WM_CHAR) ? key_code_ : + ui::GetCharacterFromKeyCode(key_code_, flags()); +#elif defined(USE_X11) + if (!native_event()) + return ui::GetCharacterFromKeyCode(key_code_, flags()); + + DCHECK(native_event()->type == KeyPress || + native_event()->type == KeyRelease); + + uint16 ch = ui::DefaultSymbolFromXEvent(native_event()); + return ch ? ch : ui::GetCharacterFromKeyCode(key_code_, flags()); +#else + NOTIMPLEMENTED(); + return 0; +#endif +} + +uint16 KeyEvent::GetUnmodifiedCharacter() const { + if (unmodified_character_) + return unmodified_character_; + +#if defined(OS_WIN) + // Looks like there is no way to get unmodified character on Windows. + return (native_event().message == WM_CHAR) ? key_code_ : + ui::GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN); +#elif defined(USE_X11) + if (!native_event()) + return ui::GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN); + + DCHECK(native_event()->type == KeyPress || + native_event()->type == KeyRelease); + + XKeyEvent *key = &native_event()->xkey; + + static const unsigned int kIgnoredModifiers = ControlMask | LockMask | + Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask; + + // We can't use things like (key.state & ShiftMask), as it may mask out bits + // used by X11 internally. + key->state &= ~kIgnoredModifiers; + uint16 ch = ui::DefaultSymbolFromXEvent(native_event()); + return ch ? ch : + ui::GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN); +#else + NOTIMPLEMENTED(); + return 0; +#endif } } // namespace aura diff --git a/ui/aura/event.h b/ui/aura/event.h index 33ade73..e01e6c2 100644 --- a/ui/aura/event.h +++ b/ui/aura/event.h @@ -150,6 +150,23 @@ class AURA_EXPORT KeyEvent : public Event { ui::KeyboardCode key_code, int flags); + // These setters allow an I18N virtual keyboard to fabricate a keyboard event + // which does not have a corresponding ui::KeyboardCode (example: U+00E1 Latin + // small letter A with acute, U+0410 Cyrillic capital letter A.) + // GetCharacter() and GetUnmodifiedCharacter() return the character. + void set_character(uint16 character) { character_ = character; } + void set_unmodified_character(uint16 unmodified_character) { + unmodified_character_ = unmodified_character; + } + + // Gets the character generated by this key event. It only supports Unicode + // BMP characters. + uint16 GetCharacter() const; + + // Gets the character generated by this key event ignoring concurrently-held + // modifiers (except shift). + uint16 GetUnmodifiedCharacter() const; + ui::KeyboardCode key_code() const { return key_code_; } bool is_char() const { return is_char_; } @@ -158,6 +175,9 @@ class AURA_EXPORT KeyEvent : public Event { // True if this is a translated character event (vs. a raw key down). Both // share the same type: ui::ET_KEY_PRESSED. bool is_char_; + + uint16 character_; + uint16 unmodified_character_; }; } // namespace aura |