OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/input_method_ibus.h" | 5 #include "ui/base/ime/input_method_ibus.h" |
6 | 6 |
7 #include <X11/X.h> | 7 #include <X11/X.h> |
8 #include <X11/Xlib.h> | 8 #include <X11/Xlib.h> |
9 #include <X11/Xutil.h> | 9 #include <X11/Xutil.h> |
10 #undef FocusIn | 10 #undef FocusIn |
(...skipping 10 matching lines...) Expand all Loading... | |
21 #include "base/logging.h" | 21 #include "base/logging.h" |
22 #include "base/string_util.h" | 22 #include "base/string_util.h" |
23 #include "base/third_party/icu/icu_utf.h" | 23 #include "base/third_party/icu/icu_utf.h" |
24 #include "base/utf_string_conversions.h" | 24 #include "base/utf_string_conversions.h" |
25 #include "chromeos/dbus/dbus_thread_manager.h" | 25 #include "chromeos/dbus/dbus_thread_manager.h" |
26 #include "chromeos/dbus/ibus/ibus_client.h" | 26 #include "chromeos/dbus/ibus/ibus_client.h" |
27 #include "chromeos/dbus/ibus/ibus_input_context_client.h" | 27 #include "chromeos/dbus/ibus/ibus_input_context_client.h" |
28 #include "chromeos/dbus/ibus/ibus_text.h" | 28 #include "chromeos/dbus/ibus/ibus_text.h" |
29 #include "ui/base/events/event_constants.h" | 29 #include "ui/base/events/event_constants.h" |
30 #include "ui/base/events/event_utils.h" | 30 #include "ui/base/events/event_utils.h" |
31 #include "ui/base/ime/ibus_client.h" | |
32 #include "ui/base/ime/text_input_client.h" | 31 #include "ui/base/ime/text_input_client.h" |
33 #include "ui/base/keycodes/keyboard_code_conversion.h" | 32 #include "ui/base/keycodes/keyboard_code_conversion.h" |
34 #include "ui/base/keycodes/keyboard_code_conversion_x.h" | 33 #include "ui/base/keycodes/keyboard_code_conversion_x.h" |
35 #include "ui/base/keycodes/keyboard_codes.h" | 34 #include "ui/base/keycodes/keyboard_codes.h" |
36 #include "ui/gfx/rect.h" | 35 #include "ui/gfx/rect.h" |
37 | 36 |
38 namespace { | 37 namespace { |
39 | 38 |
40 const int kIBusReleaseMask = 1 << 30; | 39 const int kIBusReleaseMask = 1 << 30; |
41 const char kClientName[] = "chrome"; | 40 const char kClientName[] = "chrome"; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
73 return chromeos::DBusThreadManager::Get()->GetIBusInputContextClient(); | 72 return chromeos::DBusThreadManager::Get()->GetIBusInputContextClient(); |
74 } | 73 } |
75 | 74 |
76 } // namespace | 75 } // namespace |
77 | 76 |
78 namespace ui { | 77 namespace ui { |
79 | 78 |
80 // InputMethodIBus implementation ----------------------------------------- | 79 // InputMethodIBus implementation ----------------------------------------- |
81 InputMethodIBus::InputMethodIBus( | 80 InputMethodIBus::InputMethodIBus( |
82 internal::InputMethodDelegate* delegate) | 81 internal::InputMethodDelegate* delegate) |
83 : ibus_client_(new internal::IBusClient), | 82 : input_context_state_(INPUT_CONTEXT_STOP), |
84 input_context_state_(INPUT_CONTEXT_STOP), | |
85 create_input_context_fail_count_(0), | 83 create_input_context_fail_count_(0), |
86 context_focused_(false), | 84 context_focused_(false), |
87 composing_text_(false), | 85 composing_text_(false), |
88 composition_changed_(false), | 86 composition_changed_(false), |
89 suppress_next_result_(false), | 87 suppress_next_result_(false), |
90 current_keyevent_id_(0), | 88 current_keyevent_id_(0), |
91 weak_ptr_factory_(this) { | 89 weak_ptr_factory_(this) { |
92 SetDelegate(delegate); | 90 SetDelegate(delegate); |
93 } | 91 } |
94 | 92 |
95 InputMethodIBus::~InputMethodIBus() { | 93 InputMethodIBus::~InputMethodIBus() { |
96 AbandonAllPendingKeyEvents(); | 94 AbandonAllPendingKeyEvents(); |
97 if (IsContextReady()) | 95 if (IsContextReady()) |
98 DestroyContext(); | 96 DestroyContext(); |
99 if (GetInputContextClient()) | 97 if (GetInputContextClient()) |
100 GetInputContextClient()->SetInputContextHandler(NULL); | 98 GetInputContextClient()->SetInputContextHandler(NULL); |
101 } | 99 } |
102 | 100 |
103 void InputMethodIBus::set_ibus_client( | |
104 scoped_ptr<internal::IBusClient> new_client) { | |
105 ibus_client_.swap(new_client); | |
106 } | |
107 | |
108 internal::IBusClient* InputMethodIBus::ibus_client() const { | |
109 return ibus_client_.get(); | |
110 } | |
111 | |
112 void InputMethodIBus::OnFocus() { | 101 void InputMethodIBus::OnFocus() { |
113 InputMethodBase::OnFocus(); | 102 InputMethodBase::OnFocus(); |
114 UpdateContextFocusState(); | 103 UpdateContextFocusState(); |
115 } | 104 } |
116 | 105 |
117 void InputMethodIBus::OnBlur() { | 106 void InputMethodIBus::OnBlur() { |
118 ConfirmCompositionText(); | 107 ConfirmCompositionText(); |
119 InputMethodBase::OnBlur(); | 108 InputMethodBase::OnBlur(); |
120 UpdateContextFocusState(); | 109 UpdateContextFocusState(); |
121 } | 110 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
160 IBusKeyEventFromNativeKeyEvent( | 149 IBusKeyEventFromNativeKeyEvent( |
161 native_event, &ibus_keyval, &ibus_keycode, &ibus_state); | 150 native_event, &ibus_keyval, &ibus_keycode, &ibus_state); |
162 | 151 |
163 // If |context_| is not usable, then we can only dispatch the key event as is. | 152 // If |context_| is not usable, then we can only dispatch the key event as is. |
164 // We also dispatch the key event directly if the current text input type is | 153 // We also dispatch the key event directly if the current text input type is |
165 // TEXT_INPUT_TYPE_PASSWORD, to bypass the input method. | 154 // TEXT_INPUT_TYPE_PASSWORD, to bypass the input method. |
166 // Note: We need to send the key event to ibus even if the |context_| is not | 155 // Note: We need to send the key event to ibus even if the |context_| is not |
167 // enabled, so that ibus can have a chance to enable the |context_|. | 156 // enabled, so that ibus can have a chance to enable the |context_|. |
168 if (!context_focused_ || | 157 if (!context_focused_ || |
169 GetTextInputType() == TEXT_INPUT_TYPE_PASSWORD || | 158 GetTextInputType() == TEXT_INPUT_TYPE_PASSWORD || |
170 ibus_client_->GetInputMethodType() == | 159 !GetInputContextClient() || |
171 internal::IBusClient::INPUT_METHOD_XKB_LAYOUT) { | 160 GetInputContextClient()->IsXKBLayout()) { |
172 if (native_event->type == KeyPress) | 161 if (native_event->type == KeyPress) |
173 ProcessUnfilteredKeyPressEvent(native_event, ibus_keyval); | 162 ProcessUnfilteredKeyPressEvent(native_event, ibus_keyval); |
174 else | 163 else |
175 DispatchKeyEventPostIME(native_event); | 164 DispatchKeyEventPostIME(native_event); |
176 return; | 165 return; |
177 } | 166 } |
178 | 167 |
179 pending_key_events_.insert(current_keyevent_id_); | 168 pending_key_events_.insert(current_keyevent_id_); |
180 | 169 |
181 // Since |native_event| might be treated as XEvent whose size is bigger than | 170 // Since |native_event| might be treated as XEvent whose size is bigger than |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
220 // The current text input type should not be NONE if |context_| is focused. | 209 // The current text input type should not be NONE if |context_| is focused. |
221 DCHECK(!IsTextInputTypeNone()); | 210 DCHECK(!IsTextInputTypeNone()); |
222 const gfx::Rect rect = GetTextInputClient()->GetCaretBounds(); | 211 const gfx::Rect rect = GetTextInputClient()->GetCaretBounds(); |
223 | 212 |
224 gfx::Rect composition_head; | 213 gfx::Rect composition_head; |
225 if (!GetTextInputClient()->GetCompositionCharacterBounds(0, | 214 if (!GetTextInputClient()->GetCompositionCharacterBounds(0, |
226 &composition_head)) { | 215 &composition_head)) { |
227 composition_head = rect; | 216 composition_head = rect; |
228 } | 217 } |
229 | 218 |
230 // This function runs asynchronously. | 219 chromeos::ibus::Rect rect_ibus(rect.x(), |
231 ibus_client_->SetCursorLocation(rect, composition_head); | 220 rect.y(), |
221 rect.width(), | |
222 rect.height()); | |
satorux1
2013/01/29 05:16:08
maybe:
chromeos::ibus::Rect rect_ibus = chromeos
Seigo Nonaka
2013/01/30 06:00:07
We can't introduce FromGfxRect function into chrom
| |
223 chromeos::ibus::Rect composition_head_ibus(composition_head.x(), | |
224 composition_head.y(), | |
225 composition_head.width(), | |
226 composition_head.height()); | |
227 GetInputContextClient()->SetCursorLocation(rect_ibus, composition_head_ibus); | |
232 | 228 |
233 ui::Range text_range; | 229 ui::Range text_range; |
234 ui::Range selection_range; | 230 ui::Range selection_range; |
235 string16 surrounding_text; | 231 string16 surrounding_text; |
236 if (!GetTextInputClient()->GetTextRange(&text_range) || | 232 if (!GetTextInputClient()->GetTextRange(&text_range) || |
237 !GetTextInputClient()->GetTextFromRange(text_range, &surrounding_text) || | 233 !GetTextInputClient()->GetTextFromRange(text_range, &surrounding_text) || |
238 !GetTextInputClient()->GetSelectionRange(&selection_range)) { | 234 !GetTextInputClient()->GetSelectionRange(&selection_range)) { |
239 previous_surrounding_text_.clear(); | 235 previous_surrounding_text_.clear(); |
240 previous_selection_range_ = ui::Range::InvalidRange(); | 236 previous_selection_range_ = ui::Range::InvalidRange(); |
241 return; | 237 return; |
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
914 } | 910 } |
915 | 911 |
916 // Use a black thin underline by default. | 912 // Use a black thin underline by default. |
917 if (out_composition->underlines.empty()) { | 913 if (out_composition->underlines.empty()) { |
918 out_composition->underlines.push_back(CompositionUnderline( | 914 out_composition->underlines.push_back(CompositionUnderline( |
919 0, length, SK_ColorBLACK, false /* thick */)); | 915 0, length, SK_ColorBLACK, false /* thick */)); |
920 } | 916 } |
921 } | 917 } |
922 | 918 |
923 } // namespace ui | 919 } // namespace ui |
OLD | NEW |