| Index: ui/base/ime/input_method_win.cc
|
| diff --git a/ui/base/ime/input_method_win.cc b/ui/base/ime/input_method_win.cc
|
| index 80a680565e10eee4d551a4aff1f79f5ad9d7fe75..f170c414ef1086adab6db7c58093b20d03d5b579 100644
|
| --- a/ui/base/ime/input_method_win.cc
|
| +++ b/ui/base/ime/input_method_win.cc
|
| @@ -100,68 +100,66 @@ bool InputMethodWin::OnUntranslatedIMEMessage(
|
| }
|
|
|
| void InputMethodWin::DispatchKeyEvent(ui::KeyEvent* event) {
|
| - if (!event->HasNativeEvent()) {
|
| - DispatchFabricatedKeyEvent(event);
|
| - return;
|
| - }
|
| -
|
| - const base::NativeEvent& native_key_event = event->native_event();
|
| - BOOL handled = FALSE;
|
| - if (native_key_event.message == WM_CHAR) {
|
| - OnChar(native_key_event.hwnd, native_key_event.message,
|
| - native_key_event.wParam, native_key_event.lParam, native_key_event,
|
| - &handled);
|
| - if (handled)
|
| - event->StopPropagation();
|
| - return;
|
| - }
|
| -
|
| std::vector<MSG> char_msgs;
|
| - if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kDisableMergeKeyCharEvents)) {
|
| - // Combines the WM_KEY* and WM_CHAR messages in the event processing flow
|
| - // which is necessary to let Chrome IME extension to process the key event
|
| - // and perform corresponding IME actions.
|
| - // Chrome IME extension may wants to consume certain key events based on
|
| - // the character information of WM_CHAR messages. Holding WM_KEY* messages
|
| - // until WM_CHAR is processed by the IME extension is not feasible because
|
| - // there is no way to know wether there will or not be a WM_CHAR following
|
| - // the WM_KEY*.
|
| - // Chrome never handles dead chars so it is safe to remove/ignore
|
| - // WM_*DEADCHAR messages.
|
| - MSG msg;
|
| - while (::PeekMessage(&msg, native_key_event.hwnd, WM_CHAR, WM_DEADCHAR,
|
| - PM_REMOVE)) {
|
| - if (msg.message == WM_CHAR)
|
| - char_msgs.push_back(msg);
|
| + if (event->HasNativeEvent()) {
|
| + const base::NativeEvent& native_key_event = event->native_event();
|
| + BOOL handled = FALSE;
|
| + if (native_key_event.message == WM_CHAR) {
|
| + OnChar(native_key_event.hwnd, native_key_event.message,
|
| + native_key_event.wParam, native_key_event.lParam, native_key_event,
|
| + &handled);
|
| + if (handled)
|
| + event->StopPropagation();
|
| + return;
|
| }
|
| - while (::PeekMessage(&msg, native_key_event.hwnd, WM_SYSCHAR,
|
| - WM_SYSDEADCHAR, PM_REMOVE)) {
|
| - if (msg.message == WM_SYSCHAR)
|
| - char_msgs.push_back(msg);
|
| +
|
| + if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kDisableMergeKeyCharEvents)) {
|
| + // Combines the WM_KEY* and WM_CHAR messages in the event processing flow
|
| + // which is necessary to let Chrome IME extension to process the key event
|
| + // and perform corresponding IME actions.
|
| + // Chrome IME extension may wants to consume certain key events based on
|
| + // the character information of WM_CHAR messages. Holding WM_KEY* messages
|
| + // until WM_CHAR is processed by the IME extension is not feasible because
|
| + // there is no way to know wether there will or not be a WM_CHAR following
|
| + // the WM_KEY*.
|
| + // Chrome never handles dead chars so it is safe to remove/ignore
|
| + // WM_*DEADCHAR messages.
|
| + MSG msg;
|
| + while (::PeekMessage(&msg, native_key_event.hwnd, WM_CHAR, WM_DEADCHAR,
|
| + PM_REMOVE)) {
|
| + if (msg.message == WM_CHAR)
|
| + char_msgs.push_back(msg);
|
| + }
|
| + while (::PeekMessage(&msg, native_key_event.hwnd, WM_SYSCHAR,
|
| + WM_SYSDEADCHAR, PM_REMOVE)) {
|
| + if (msg.message == WM_SYSCHAR)
|
| + char_msgs.push_back(msg);
|
| + }
|
| }
|
| - }
|
|
|
| - // Handles ctrl-shift key to change text direction and layout alignment.
|
| - if (ui::IMM32Manager::IsRTLKeyboardLayoutInstalled() &&
|
| - !IsTextInputTypeNone()) {
|
| - // TODO: shouldn't need to generate a KeyEvent here.
|
| - const ui::KeyEvent key(native_key_event);
|
| - ui::KeyboardCode code = key.key_code();
|
| - if (key.type() == ui::ET_KEY_PRESSED) {
|
| - if (code == ui::VKEY_SHIFT) {
|
| - base::i18n::TextDirection dir;
|
| - if (ui::IMM32Manager::IsCtrlShiftPressed(&dir))
|
| - pending_requested_direction_ = dir;
|
| - } else if (code != ui::VKEY_CONTROL) {
|
| + // Handles ctrl-shift key to change text direction and layout alignment.
|
| + if (ui::IMM32Manager::IsRTLKeyboardLayoutInstalled() &&
|
| + !IsTextInputTypeNone()) {
|
| + // TODO: shouldn't need to generate a KeyEvent here.
|
| + const ui::KeyEvent key(native_key_event);
|
| + ui::KeyboardCode code = key.key_code();
|
| + if (key.type() == ui::ET_KEY_PRESSED) {
|
| + if (code == ui::VKEY_SHIFT) {
|
| + base::i18n::TextDirection dir;
|
| + if (ui::IMM32Manager::IsCtrlShiftPressed(&dir))
|
| + pending_requested_direction_ = dir;
|
| + } else if (code != ui::VKEY_CONTROL) {
|
| + pending_requested_direction_ = base::i18n::UNKNOWN_DIRECTION;
|
| + }
|
| + } else if (key.type() == ui::ET_KEY_RELEASED &&
|
| + (code == ui::VKEY_SHIFT || code == ui::VKEY_CONTROL) &&
|
| + pending_requested_direction_ !=
|
| + base::i18n::UNKNOWN_DIRECTION) {
|
| + GetTextInputClient()->ChangeTextDirectionAndLayoutAlignment(
|
| + pending_requested_direction_);
|
| pending_requested_direction_ = base::i18n::UNKNOWN_DIRECTION;
|
| }
|
| - } else if (key.type() == ui::ET_KEY_RELEASED &&
|
| - (code == ui::VKEY_SHIFT || code == ui::VKEY_CONTROL) &&
|
| - pending_requested_direction_ != base::i18n::UNKNOWN_DIRECTION) {
|
| - GetTextInputClient()->ChangeTextDirectionAndLayoutAlignment(
|
| - pending_requested_direction_);
|
| - pending_requested_direction_ = base::i18n::UNKNOWN_DIRECTION;
|
| }
|
| }
|
|
|
| @@ -201,6 +199,14 @@ void InputMethodWin::ProcessKeyEventDone(ui::KeyEvent* event,
|
| return;
|
| }
|
|
|
| + if (!event->HasNativeEvent() &&
|
| + (event->is_char() || event->GetDomKey().IsCharacter()) &&
|
| + event->type() == ui::ET_KEY_PRESSED && GetTextInputClient()) {
|
| + // The key event if from calling input.ime.sendKeyEvent or test.
|
| + GetTextInputClient()->InsertChar(*event);
|
| + return;
|
| + }
|
| +
|
| BOOL handled;
|
| for (const auto& msg : (*char_msgs))
|
| OnChar(msg.hwnd, msg.message, msg.wParam, msg.lParam, msg, &handled);
|
| @@ -618,18 +624,6 @@ bool InputMethodWin::IsWindowFocused(const TextInputClient* client) const {
|
| GetActiveWindow() == toplevel_window_handle_;
|
| }
|
|
|
| -void InputMethodWin::DispatchFabricatedKeyEvent(ui::KeyEvent* event) {
|
| - if (event->is_char()) {
|
| - if (GetTextInputClient()) {
|
| - ui::KeyEvent ch_event(*event);
|
| - ch_event.set_character(static_cast<base::char16>(event->key_code()));
|
| - GetTextInputClient()->InsertChar(ch_event);
|
| - return;
|
| - }
|
| - }
|
| - ignore_result(DispatchKeyEventPostIME(event));
|
| -}
|
| -
|
| void InputMethodWin::ConfirmCompositionText() {
|
| if (composing_window_handle_)
|
| imm32_manager_.CleanupComposition(composing_window_handle_);
|
|
|