Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Side by Side Diff: ui/base/ime/input_method_ibus.cc

Issue 48393003: Add InputMethodObserver support into InputMethodBase (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix -Werror=sign-compare Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/base/ime/input_method_ibus.h ('k') | ui/base/ime/input_method_imm32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 if (IsTextInputClientFocused(client)) { 227 if (IsTextInputClientFocused(client)) {
228 ResetContext(); 228 ResetContext();
229 UpdateContextFocusState(); 229 UpdateContextFocusState();
230 if (previous_textinput_type_ != client->GetTextInputType()) 230 if (previous_textinput_type_ != client->GetTextInputType())
231 OnInputMethodChanged(); 231 OnInputMethodChanged();
232 } 232 }
233 InputMethodBase::OnTextInputTypeChanged(client); 233 InputMethodBase::OnTextInputTypeChanged(client);
234 } 234 }
235 235
236 void InputMethodIBus::OnCaretBoundsChanged(const TextInputClient* client) { 236 void InputMethodIBus::OnCaretBoundsChanged(const TextInputClient* client) {
237 if (!context_focused_ || !IsTextInputClientFocused(client)) 237 OnCaretBoundsChangedInternal(client);
238 return; 238 InputMethodBase::OnCaretBoundsChanged(client);
239
240 // The current text input type should not be NONE if |context_| is focused.
241 DCHECK(!IsTextInputTypeNone());
242 const gfx::Rect rect = GetTextInputClient()->GetCaretBounds();
243
244 gfx::Rect composition_head;
245 if (!GetTextInputClient()->GetCompositionCharacterBounds(0,
246 &composition_head)) {
247 composition_head = rect;
248 }
249
250 chromeos::IBusPanelCandidateWindowHandlerInterface* candidate_window =
251 chromeos::IBusBridge::Get()->GetCandidateWindowHandler();
252 if (!candidate_window)
253 return;
254 candidate_window->SetCursorLocation(
255 GfxRectToIBusRect(rect),
256 GfxRectToIBusRect(composition_head));
257
258 gfx::Range text_range;
259 gfx::Range selection_range;
260 string16 surrounding_text;
261 if (!GetTextInputClient()->GetTextRange(&text_range) ||
262 !GetTextInputClient()->GetTextFromRange(text_range, &surrounding_text) ||
263 !GetTextInputClient()->GetSelectionRange(&selection_range)) {
264 previous_surrounding_text_.clear();
265 previous_selection_range_ = gfx::Range::InvalidRange();
266 return;
267 }
268
269 if (previous_selection_range_ == selection_range &&
270 previous_surrounding_text_ == surrounding_text)
271 return;
272
273 previous_selection_range_ = selection_range;
274 previous_surrounding_text_ = surrounding_text;
275
276 if (!selection_range.IsValid()) {
277 // TODO(nona): Ideally selection_range should not be invalid.
278 // TODO(nona): If javascript changes the focus on page loading, even (0,0)
279 // can not be obtained. Need investigation.
280 return;
281 }
282
283 // Here SetSurroundingText accepts relative position of |surrounding_text|, so
284 // we have to convert |selection_range| from node coordinates to
285 // |surrounding_text| coordinates.
286 if (!GetEngine())
287 return;
288 GetEngine()->SetSurroundingText(
289 UTF16ToUTF8(surrounding_text),
290 selection_range.start() - text_range.start(),
291 selection_range.end() - text_range.start());
292 } 239 }
293 240
294 void InputMethodIBus::CancelComposition(const TextInputClient* client) { 241 void InputMethodIBus::CancelComposition(const TextInputClient* client) {
295 if (context_focused_ && IsTextInputClientFocused(client)) 242 if (context_focused_ && IsTextInputClientFocused(client))
296 ResetContext(); 243 ResetContext();
297 } 244 }
298 245
299 void InputMethodIBus::OnInputLocaleChanged() {
300 // Not supported.
301 }
302
303 std::string InputMethodIBus::GetInputLocale() { 246 std::string InputMethodIBus::GetInputLocale() {
304 // Not supported. 247 // Not supported.
305 return ""; 248 return "";
306 } 249 }
307 250
308 base::i18n::TextDirection InputMethodIBus::GetInputTextDirection() { 251 base::i18n::TextDirection InputMethodIBus::GetInputTextDirection() {
309 // Not supported. 252 // Not supported.
310 return base::i18n::UNKNOWN_DIRECTION; 253 return base::i18n::UNKNOWN_DIRECTION;
311 } 254 }
312 255
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 } 742 }
800 } 743 }
801 744
802 // Use a black thin underline by default. 745 // Use a black thin underline by default.
803 if (out_composition->underlines.empty()) { 746 if (out_composition->underlines.empty()) {
804 out_composition->underlines.push_back(CompositionUnderline( 747 out_composition->underlines.push_back(CompositionUnderline(
805 0, length, SK_ColorBLACK, false /* thick */)); 748 0, length, SK_ColorBLACK, false /* thick */));
806 } 749 }
807 } 750 }
808 751
752 void InputMethodIBus::OnCaretBoundsChangedInternal(
753 const TextInputClient* client) {
754 if (!context_focused_ || !IsTextInputClientFocused(client))
755 return;
756
757 // The current text input type should not be NONE if |context_| is focused.
758 DCHECK(!IsTextInputTypeNone());
759 const gfx::Rect rect = GetTextInputClient()->GetCaretBounds();
760
761 gfx::Rect composition_head;
762 if (!GetTextInputClient()->GetCompositionCharacterBounds(0,
763 &composition_head)) {
764 composition_head = rect;
765 }
766
767 chromeos::IBusPanelCandidateWindowHandlerInterface* candidate_window =
768 chromeos::IBusBridge::Get()->GetCandidateWindowHandler();
769 if (!candidate_window)
770 return;
771 candidate_window->SetCursorLocation(
772 GfxRectToIBusRect(rect),
773 GfxRectToIBusRect(composition_head));
774
775 gfx::Range text_range;
776 gfx::Range selection_range;
777 string16 surrounding_text;
778 if (!GetTextInputClient()->GetTextRange(&text_range) ||
779 !GetTextInputClient()->GetTextFromRange(text_range, &surrounding_text) ||
780 !GetTextInputClient()->GetSelectionRange(&selection_range)) {
781 previous_surrounding_text_.clear();
782 previous_selection_range_ = gfx::Range::InvalidRange();
783 return;
784 }
785
786 if (previous_selection_range_ == selection_range &&
787 previous_surrounding_text_ == surrounding_text)
788 return;
789
790 previous_selection_range_ = selection_range;
791 previous_surrounding_text_ = surrounding_text;
792
793 if (!selection_range.IsValid()) {
794 // TODO(nona): Ideally selection_range should not be invalid.
795 // TODO(nona): If javascript changes the focus on page loading, even (0,0)
796 // can not be obtained. Need investigation.
797 return;
798 }
799
800 // Here SetSurroundingText accepts relative position of |surrounding_text|, so
801 // we have to convert |selection_range| from node coordinates to
802 // |surrounding_text| coordinates.
803 if (!GetEngine())
804 return;
805 GetEngine()->SetSurroundingText(
806 UTF16ToUTF8(surrounding_text),
807 selection_range.start() - text_range.start(),
808 selection_range.end() - text_range.start());
809 }
810
809 } // namespace ui 811 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/ime/input_method_ibus.h ('k') | ui/base/ime/input_method_imm32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698