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..94f6b0539805868336177a0a61a90b27eb860c15 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) { |
| + char buf[7]; |
|
Yusuke Sato
2011/03/18 12:07:41
I guess it should be either [6]; or [7] = {};
James Su
2011/03/18 15:54:09
Done.
|
| + int bytes_written = XLookupString(key, buf, 6, NULL, NULL); |
| + DCHECK(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()) |
|
Yusuke Sato
2011/03/18 12:07:41
when native_event_2() can be NULL?
|
| + 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 { |
| + static const unsigned int kIgnoredModifiers = ControlMask | LockMask | |
| + Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask; |
| + |
| + if (!native_event_2()) |
|
Yusuke Sato
2011/03/18 12:07:41
ditto.
|
| + 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; |
| + |
| + // 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: |