summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/base/ime/input_method_auralinux.cc4
-rw-r--r--ui/base/ime/input_method_base.cc17
-rw-r--r--ui/base/ime/input_method_base.h5
-rw-r--r--ui/base/ime/input_method_chromeos.cc31
-rw-r--r--ui/base/ime/input_method_win.cc4
5 files changed, 41 insertions, 20 deletions
diff --git a/ui/base/ime/input_method_auralinux.cc b/ui/base/ime/input_method_auralinux.cc
index ccfb7be..4248975 100644
--- a/ui/base/ime/input_method_auralinux.cc
+++ b/ui/base/ime/input_method_auralinux.cc
@@ -248,6 +248,10 @@ void InputMethodAuraLinux::OnCaretBoundsChanged(const TextInputClient* client) {
return;
NotifyTextInputCaretBoundsChanged(client);
context_->SetCursorLocation(GetTextInputClient()->GetCaretBounds());
+
+ if (!IsTextInputTypeNone() && text_input_type_ != TEXT_INPUT_TYPE_PASSWORD &&
+ GetEngine())
+ GetEngine()->SetCompositionBounds(GetCompositionBounds(client));
}
void InputMethodAuraLinux::CancelComposition(const TextInputClient* client) {
diff --git a/ui/base/ime/input_method_base.cc b/ui/base/ime/input_method_base.cc
index df0cb11..d935889 100644
--- a/ui/base/ime/input_method_base.cc
+++ b/ui/base/ime/input_method_base.cc
@@ -131,4 +131,21 @@ void InputMethodBase::SetFocusedTextInputClientInternal(
NotifyTextInputStateChanged(text_input_client_);
}
+std::vector<gfx::Rect> InputMethodBase::GetCompositionBounds(
+ const TextInputClient* client) {
+ std::vector<gfx::Rect> bounds;
+ if (client->HasCompositionText()) {
+ uint32_t i = 0;
+ gfx::Rect rect;
+ while (client->GetCompositionCharacterBounds(i++, &rect))
+ bounds.push_back(rect);
+ } else {
+ // For case of no composition at present, use caret bounds which is required
+ // by the IME extension for certain features (e.g. physical keyboard
+ // auto-correct).
+ bounds.push_back(client->GetCaretBounds());
+ }
+ return bounds;
+}
+
} // namespace ui
diff --git a/ui/base/ime/input_method_base.h b/ui/base/ime/input_method_base.h
index e334611..432a80f 100644
--- a/ui/base/ime/input_method_base.h
+++ b/ui/base/ime/input_method_base.h
@@ -5,6 +5,8 @@
#ifndef UI_BASE_IME_INPUT_METHOD_BASE_H_
#define UI_BASE_IME_INPUT_METHOD_BASE_H_
+#include <vector>
+
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
@@ -84,6 +86,9 @@ class UI_BASE_IME_EXPORT InputMethodBase
// |client| which is the text input client with focus.
void NotifyTextInputCaretBoundsChanged(const TextInputClient* client);
+ // Gets the bounds of the composition text or cursor in |client|.
+ std::vector<gfx::Rect> GetCompositionBounds(const TextInputClient* client);
+
private:
void SetFocusedTextInputClientInternal(TextInputClient* client);
diff --git a/ui/base/ime/input_method_chromeos.cc b/ui/base/ime/input_method_chromeos.cc
index 5eaf021..72a3048 100644
--- a/ui/base/ime/input_method_chromeos.cc
+++ b/ui/base/ime/input_method_chromeos.cc
@@ -169,33 +169,24 @@ void InputMethodChromeOS::OnCaretBoundsChanged(const TextInputClient* client) {
// The current text input type should not be NONE if |context_| is focused.
DCHECK(client == GetTextInputClient());
DCHECK(!IsTextInputTypeNone());
- const gfx::Rect caret_rect = client->GetCaretBounds();
-
- gfx::Rect composition_head;
- std::vector<gfx::Rect> rects;
- if (client->HasCompositionText()) {
- uint32_t i = 0;
- gfx::Rect rect;
- while (client->GetCompositionCharacterBounds(i++, &rect))
- rects.push_back(rect);
- }
-
- // Pepper don't support composition bounds, so fallback to caret bounds to
- // avoid bad user experience (the IME window moved to upper left corner).
- // For case of no composition at present, also use caret bounds which is
- // required by the IME extension for certain features (e.g. physical keyboard
- // autocorrect).
- if (rects.empty())
- rects.push_back(caret_rect);
- composition_head = rects[0];
if (GetEngine())
- GetEngine()->SetCompositionBounds(rects);
+ GetEngine()->SetCompositionBounds(GetCompositionBounds(client));
chromeos::IMECandidateWindowHandlerInterface* candidate_window =
ui::IMEBridge::Get()->GetCandidateWindowHandler();
if (!candidate_window)
return;
+
+ const gfx::Rect caret_rect = client->GetCaretBounds();
+
+ // Pepper doesn't support composition bounds, so fall back to caret bounds to
+ // avoid a bad user experience (the IME window moved to upper left corner).
+ gfx::Rect composition_head;
+ if (client->HasCompositionText())
+ client->GetCompositionCharacterBounds(0, &composition_head);
+ else
+ composition_head = caret_rect;
candidate_window->SetCursorBounds(caret_rect, composition_head);
gfx::Range text_range;
diff --git a/ui/base/ime/input_method_win.cc b/ui/base/ime/input_method_win.cc
index 0520986..6ac7e6f 100644
--- a/ui/base/ime/input_method_win.cc
+++ b/ui/base/ime/input_method_win.cc
@@ -235,6 +235,10 @@ void InputMethodWin::OnCaretBoundsChanged(const TextInputClient* client) {
gfx::Rect caret_rect(gfx::Point(window_point.x, window_point.y),
screen_bounds.size());
imm32_manager_.UpdateCaretRect(attached_window, caret_rect);
+
+ if (client == GetTextInputClient() &&
+ GetTextInputType() != ui::TEXT_INPUT_TYPE_PASSWORD && GetEngine())
+ GetEngine()->SetCompositionBounds(GetCompositionBounds(client));
}
void InputMethodWin::CancelComposition(const TextInputClient* client) {