Chromium Code Reviews| Index: views/events/event_x.cc |
| diff --git a/views/events/event_x.cc b/views/events/event_x.cc |
| index 4526fd90c5fe3cb87a7d726ea5d98ec5a3459e89..ebbcfc17551bba018b2bb68f5cc63f0136d1d19e 100644 |
| --- a/views/events/event_x.cc |
| +++ b/views/events/event_x.cc |
| @@ -4,11 +4,14 @@ |
| #include "views/events/event.h" |
| +#include <gdk/gdk.h> |
| #include <gdk/gdkx.h> |
| #if defined(HAVE_XINPUT2) |
| #include <X11/extensions/XInput2.h> |
| #endif |
| +#include <X11/Xlib.h> |
| +#include "base/utf_string_conversions.h" |
| #include "ui/base/keycodes/keyboard_code_conversion_x.h" |
| #include "views/widget/root_view.h" |
| #include "views/widget/widget_gtk.h" |
| @@ -213,6 +216,16 @@ int GetLocatedEventFlags(XEvent* xev, bool touch) { |
| return 0; |
| } |
| +uint16 GetCharacterFromXKeyEvent(XKeyEvent* key) { |
|
oshima
2011/03/21 18:35:42
can key be const?
James Su
2011/03/21 18:59:22
No. XLookupString() accepts non-const pointer.
|
| + char buf[6]; |
| + int bytes_written = XLookupString(key, buf, 6, NULL, NULL); |
| + DCHECK_LE(bytes_written, 6); |
| + |
| + string16 result; |
| + return (bytes_written > 0 && UTF8ToUTF16(buf, bytes_written, &result) && |
| + result.length() == 1) ? result[0] : 0; |
| +} |
| + |
| } // namespace |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -248,6 +261,37 @@ KeyEvent::KeyEvent(NativeEvent2 native_event_2, FromNativeEvent2 from_native) |
| key_code_(ui::KeyboardCodeFromXKeyEvent(native_event_2)) { |
| } |
| +uint16 KeyEvent::GetCharacter() const { |
| + if (!native_event_2()) |
| + return GetCharacterFromKeyCode(key_code_, flags()); |
| + |
| + DCHECK(native_event_2()->type == KeyPress || |
| + native_event_2()->type == KeyRelease); |
| + |
| + uint16 ch = GetCharacterFromXKeyEvent(&native_event_2()->xkey); |
| + return ch ? ch : GetCharacterFromKeyCode(key_code_, flags()); |
| +} |
| + |
| +uint16 KeyEvent::GetUnmodifiedCharacter() const { |
| + if (!native_event_2()) |
| + return GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN); |
| + |
| + DCHECK(native_event_2()->type == KeyPress || |
| + native_event_2()->type == KeyRelease); |
| + |
| + XKeyEvent key = native_event_2()->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 = GetCharacterFromXKeyEvent(&key); |
| + return ch ? ch : |
| + GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN); |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // MouseEvent, public: |