| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/base/ime/mock_input_method.h" | 5 #include "ui/base/ime/mock_input_method.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/string16.h" | 8 #include "base/string16.h" |
| 9 #include "ui/base/events.h" | 9 #include "ui/base/events.h" |
| 10 #include "ui/base/glib/glib_integers.h" | 10 #include "ui/base/glib/glib_integers.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 (flags & Mod1Mask ? ui::EF_ALT_DOWN : 0U); | 29 (flags & Mod1Mask ? ui::EF_ALT_DOWN : 0U); |
| 30 } | 30 } |
| 31 #endif | 31 #endif |
| 32 | 32 |
| 33 } // namespace | 33 } // namespace |
| 34 | 34 |
| 35 namespace ui { | 35 namespace ui { |
| 36 | 36 |
| 37 MockInputMethod::MockInputMethod(internal::InputMethodDelegate* delegate) | 37 MockInputMethod::MockInputMethod(internal::InputMethodDelegate* delegate) |
| 38 : delegate_(NULL), | 38 : delegate_(NULL), |
| 39 text_input_client_(NULL), | 39 text_input_client_(NULL) { |
| 40 consume_next_key_(false) { | |
| 41 SetDelegate(delegate); | 40 SetDelegate(delegate); |
| 42 } | 41 } |
| 43 | 42 |
| 44 MockInputMethod::~MockInputMethod() { | 43 MockInputMethod::~MockInputMethod() { |
| 45 } | 44 } |
| 46 | 45 |
| 47 void MockInputMethod::SetDelegate(internal::InputMethodDelegate* delegate) { | 46 void MockInputMethod::SetDelegate(internal::InputMethodDelegate* delegate) { |
| 48 delegate_ = delegate; | 47 delegate_ = delegate; |
| 49 } | 48 } |
| 50 | 49 |
| 51 void MockInputMethod::SetFocusedTextInputClient(TextInputClient* client) { | 50 void MockInputMethod::SetFocusedTextInputClient(TextInputClient* client) { |
| 52 text_input_client_ = client; | 51 text_input_client_ = client; |
| 53 } | 52 } |
| 54 | 53 |
| 55 TextInputClient* MockInputMethod::GetTextInputClient() const { | 54 TextInputClient* MockInputMethod::GetTextInputClient() const { |
| 56 return text_input_client_; | 55 return text_input_client_; |
| 57 } | 56 } |
| 58 | 57 |
| 59 void MockInputMethod::DispatchKeyEvent(const base::NativeEvent& native_event) { | 58 void MockInputMethod::DispatchKeyEvent(const base::NativeEvent& native_event) { |
| 60 #if defined(USE_X11) | 59 #if defined(OS_WIN) |
| 60 if (native_event.message == WM_CHAR) { |
| 61 if (text_input_client_) { |
| 62 text_input_client_->InsertChar(ui::KeyboardCodeFromNative(native_event), |
| 63 ui::EventFlagsFromNative(native_event)); |
| 64 } |
| 65 } else { |
| 66 delegate_->DispatchKeyEventPostIME(native_event); |
| 67 } |
| 68 #elif defined(USE_X11) |
| 61 DCHECK(native_event); | 69 DCHECK(native_event); |
| 62 if (native_event->type == KeyRelease) { | 70 if (native_event->type == KeyRelease) { |
| 63 // On key release, just dispatch it. | 71 // On key release, just dispatch it. |
| 64 delegate_->DispatchKeyEventPostIME(native_event); | 72 delegate_->DispatchKeyEventPostIME(native_event); |
| 65 } else { | 73 } else { |
| 66 const uint32 state = EventFlagsFromXFlags(native_event->xkey.state); | 74 const uint32 state = EventFlagsFromXFlags(native_event->xkey.state); |
| 67 if (consume_next_key_) { | 75 // Send a RawKeyDown event first, |
| 68 // Send the VKEY_PROCESSKEY RawKeyDown event. | 76 delegate_->DispatchKeyEventPostIME(native_event); |
| 69 SendFakeProcessKeyEvent(true, state); | 77 if (text_input_client_) { |
| 70 } else { | 78 // then send a Char event via ui::TextInputClient. |
| 71 // Send a RawKeyDown event first, | 79 const KeyboardCode key_code = ui::KeyboardCodeFromNative(native_event); |
| 72 delegate_->DispatchKeyEventPostIME(native_event); | 80 uint16 ch = 0; |
| 73 if (text_input_client_) { | 81 if (!(state & ui::EF_CONTROL_DOWN)) |
| 74 // then send a Char event via ui::TextInputClient. | 82 ch = ui::GetCharacterFromXEvent(native_event); |
| 75 const KeyboardCode key_code = ui::KeyboardCodeFromNative(native_event); | 83 if (!ch) |
| 76 uint16 ch = 0; | 84 ch = ui::GetCharacterFromKeyCode(key_code, state); |
| 77 if (!(state & ui::EF_CONTROL_DOWN)) | 85 if (ch) |
| 78 ch = ui::GetCharacterFromXEvent(native_event); | 86 text_input_client_->InsertChar(ch, state); |
| 79 if (!ch) | |
| 80 ch = ui::GetCharacterFromKeyCode(key_code, state); | |
| 81 if (ch) | |
| 82 text_input_client_->InsertChar(ch, state); | |
| 83 } | |
| 84 } | 87 } |
| 85 } | 88 } |
| 86 consume_next_key_ = false; | |
| 87 #else | 89 #else |
| 88 // TODO(yusukes): Support Windows. | 90 // TODO(yusukes): Support other platforms. Call InsertChar() when necessary. |
| 89 delegate_->DispatchKeyEventPostIME(native_event); | 91 delegate_->DispatchKeyEventPostIME(native_event); |
| 90 #endif | 92 #endif |
| 91 } | 93 } |
| 92 | 94 |
| 93 void MockInputMethod::Init(bool focused) {} | 95 void MockInputMethod::Init(bool focused) {} |
| 94 void MockInputMethod::OnFocus() {} | 96 void MockInputMethod::OnFocus() {} |
| 95 void MockInputMethod::OnBlur() {} | 97 void MockInputMethod::OnBlur() {} |
| 96 void MockInputMethod::OnTextInputTypeChanged(const TextInputClient* client) {} | 98 void MockInputMethod::OnTextInputTypeChanged(const TextInputClient* client) {} |
| 97 void MockInputMethod::OnCaretBoundsChanged(const TextInputClient* client) {} | 99 void MockInputMethod::OnCaretBoundsChanged(const TextInputClient* client) {} |
| 98 void MockInputMethod::CancelComposition(const TextInputClient* client) {} | 100 void MockInputMethod::CancelComposition(const TextInputClient* client) {} |
| 99 | 101 |
| 100 std::string MockInputMethod::GetInputLocale() { | 102 std::string MockInputMethod::GetInputLocale() { |
| 101 return ""; | 103 return ""; |
| 102 } | 104 } |
| 103 | 105 |
| 104 base::i18n::TextDirection MockInputMethod::GetInputTextDirection() { | 106 base::i18n::TextDirection MockInputMethod::GetInputTextDirection() { |
| 105 return base::i18n::UNKNOWN_DIRECTION; | 107 return base::i18n::UNKNOWN_DIRECTION; |
| 106 } | 108 } |
| 107 | 109 |
| 108 bool MockInputMethod::IsActive() { | 110 bool MockInputMethod::IsActive() { |
| 109 return true; | 111 return true; |
| 110 } | 112 } |
| 111 | 113 |
| 112 ui::TextInputType MockInputMethod::GetTextInputType() const { | 114 ui::TextInputType MockInputMethod::GetTextInputType() const { |
| 113 return ui::TEXT_INPUT_TYPE_NONE; | 115 return ui::TEXT_INPUT_TYPE_NONE; |
| 114 } | 116 } |
| 115 | 117 |
| 116 void MockInputMethod::ConsumeNextKey() { | |
| 117 consume_next_key_ = true; | |
| 118 } | |
| 119 | |
| 120 void MockInputMethod::SendFakeProcessKeyEvent(bool pressed, int flags) const { | |
| 121 delegate_->DispatchFabricatedKeyEventPostIME( | |
| 122 pressed ? ET_KEY_PRESSED : ET_KEY_RELEASED, VKEY_PROCESSKEY, flags); | |
| 123 } | |
| 124 | |
| 125 } // namespace ui | 118 } // namespace ui |
| OLD | NEW |