| Index: chrome/browser/chromeos/input_method/input_method_engine.cc
|
| diff --git a/chrome/browser/chromeos/input_method/input_method_engine.cc b/chrome/browser/chromeos/input_method/input_method_engine.cc
|
| index 4f7c33741b21e44f215b4182e377ed245a76e7c9..adac10d1df323926024f928b737d4e4405b2467e 100644
|
| --- a/chrome/browser/chromeos/input_method/input_method_engine.cc
|
| +++ b/chrome/browser/chromeos/input_method/input_method_engine.cc
|
| @@ -4,11 +4,6 @@
|
|
|
| #include "chrome/browser/chromeos/input_method/input_method_engine.h"
|
|
|
| -#define XK_MISCELLANY
|
| -#include <X11/keysymdef.h>
|
| -#include <X11/X.h>
|
| -#include <X11/Xlib.h>
|
| -#include <X11/Xutil.h>
|
| #undef FocusIn
|
| #undef FocusOut
|
| #undef RootWindow
|
| @@ -34,8 +29,6 @@
|
| #include "ui/base/ime/chromeos/ime_keymap.h"
|
| #include "ui/events/event.h"
|
| #include "ui/events/event_processor.h"
|
| -#include "ui/events/keycodes/dom4/keycode_converter.h"
|
| -#include "ui/events/keycodes/keyboard_code_conversion_x.h"
|
| #include "ui/keyboard/keyboard_controller.h"
|
| #include "ui/keyboard/keyboard_util.h"
|
|
|
| @@ -70,6 +63,35 @@ size_t GetUtf8StringLength(const char* s) {
|
| return ret;
|
| }
|
|
|
| +std::string GetKeyFromEvent(const ui::KeyEvent& event) {
|
| + const std::string& code = event.code();
|
| + if (StartsWithASCII(code, "Control", true))
|
| + return "Ctrl";
|
| + if (StartsWithASCII(code, "Shift", true))
|
| + return "Shift";
|
| + if (StartsWithASCII(code, "Alt", true))
|
| + return "Alt";
|
| + if (StartsWithASCII(code, "Arrow", true))
|
| + return code.substr(5);
|
| + if (code == "Escape")
|
| + return "Esc";
|
| + if (code == "Backspace" || code == "Tab" ||
|
| + code == "Enter" || code == "CapsLock")
|
| + return code;
|
| + uint16 ch = 0;
|
| + // Ctrl+? cases, gets key value for Ctrl is not down.
|
| + if (event.flags() & ui::EF_CONTROL_DOWN) {
|
| + ui::KeyEvent event_no_ctrl(event.type(),
|
| + event.key_code(),
|
| + event.flags() ^ ui::EF_CONTROL_DOWN,
|
| + false);
|
| + ch = event_no_ctrl.GetCharacter();
|
| + } else {
|
| + ch = event.GetCharacter();
|
| + }
|
| + return base::UTF16ToUTF8(base::string16(1, ch));
|
| +}
|
| +
|
| } // namespace
|
|
|
| InputMethodEngine::InputMethodEngine()
|
| @@ -266,24 +288,19 @@ bool InputMethodEngine::SendKeyEvents(
|
| const ui::EventType type =
|
| (event.type == "keyup") ? ui::ET_KEY_RELEASED : ui::ET_KEY_PRESSED;
|
|
|
| - // KeyboardCodeFromXKyeSym assumes US keyboard layout.
|
| - ui::KeycodeConverter* conv = ui::KeycodeConverter::GetInstance();
|
| - DCHECK(conv);
|
| -
|
| - // DOM code (KeyA) -> XKB -> XKeySym (XK_A) -> KeyboardCode (VKEY_A)
|
| - const uint16 native_keycode =
|
| - conv->CodeToNativeKeycode(event.code.c_str());
|
| - const uint xkeysym = ui::DefaultXKeysymFromHardwareKeycode(native_keycode);
|
| - const ui::KeyboardCode key_code = ui::KeyboardCodeFromXKeysym(xkeysym);
|
| -
|
| - const std::string code = event.code;
|
| int flags = ui::EF_NONE;
|
| flags |= event.alt_key ? ui::EF_ALT_DOWN : ui::EF_NONE;
|
| flags |= event.ctrl_key ? ui::EF_CONTROL_DOWN : ui::EF_NONE;
|
| flags |= event.shift_key ? ui::EF_SHIFT_DOWN : ui::EF_NONE;
|
| flags |= event.caps_lock ? ui::EF_CAPS_LOCK_DOWN : ui::EF_NONE;
|
|
|
| - ui::KeyEvent ui_event(type, key_code, code, flags, false /* is_char */);
|
| + ui::KeyEvent ui_event(type,
|
| + ui::DomKeycodeToKeyboardCode(event.code),
|
| + event.code,
|
| + flags,
|
| + false /* is_char */);
|
| + if (!event.key.empty())
|
| + ui_event.set_character(base::UTF8ToUTF16(event.key)[0]);
|
| base::AutoReset<const ui::KeyEvent*> reset_sent_key(&sent_key_event_,
|
| &ui_event);
|
| ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&ui_event);
|
| @@ -584,6 +601,7 @@ void InputMethodEngine::Reset() {
|
| }
|
|
|
| namespace {
|
| +
|
| void GetExtensionKeyboardEventFromKeyEvent(
|
| const ui::KeyEvent& event,
|
| InputMethodEngine::KeyboardEvent* ext_event) {
|
| @@ -597,28 +615,9 @@ void GetExtensionKeyboardEventFromKeyEvent(
|
| ext_event->ctrl_key = event.IsControlDown();
|
| ext_event->shift_key = event.IsShiftDown();
|
| ext_event->caps_lock = event.IsCapsLockDown();
|
| -
|
| - uint32 x11_keysym = 0;
|
| - if (event.HasNativeEvent()) {
|
| - const base::NativeEvent& native_event = event.native_event();
|
| - DCHECK(native_event);
|
| -
|
| - XKeyEvent* x_key = &(static_cast<XEvent*>(native_event)->xkey);
|
| - KeySym keysym = NoSymbol;
|
| - ::XLookupString(x_key, NULL, 0, &keysym, NULL);
|
| - x11_keysym = keysym;
|
| - } else {
|
| - // Convert ui::KeyEvent.key_code to DOM UIEvent key.
|
| - // XKeysymForWindowsKeyCode converts key_code to XKeySym, but it
|
| - // assumes US layout and does not care about CapLock state.
|
| - //
|
| - // TODO(komatsu): Support CapsLock states.
|
| - // TODO(komatsu): Support non-us keyboard layouts.
|
| - x11_keysym = ui::XKeysymForWindowsKeyCode(event.key_code(),
|
| - event.IsShiftDown());
|
| - }
|
| - ext_event->key = ui::FromXKeycodeToKeyValue(x11_keysym);
|
| + ext_event->key = GetKeyFromEvent(event);
|
| }
|
| +
|
| } // namespace
|
|
|
| void InputMethodEngine::ProcessKeyEvent(
|
|
|