summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authornona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-03 09:29:57 +0000
committernona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-03 09:29:57 +0000
commita13ac7ddea08262f685d52d20575b1602164e0ac (patch)
treebeaf4d85f5290ecd9b68f7edaf9124b5d51d1b97 /ui
parentaa73d27453daf11d9b7eaa6401b349a279e53579 (diff)
downloadchromium_src-a13ac7ddea08262f685d52d20575b1602164e0ac.zip
chromium_src-a13ac7ddea08262f685d52d20575b1602164e0ac.tar.gz
chromium_src-a13ac7ddea08262f685d52d20575b1602164e0ac.tar.bz2
Support reverse conversion for ChromeOS
This cl does not support fully surrounding text retrieval, but it is enough to send selection text for reverse conversion. I will revisit fully SetSurroundingText implementation when it is required. BUG=127032 TEST=ran content_unittests, ui_unittests, chromeos_unittests Review URL: https://chromiumcodereview.appspot.com/10823141 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149824 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r--ui/base/ime/input_method_ibus.cc33
-rw-r--r--ui/base/ime/input_method_ibus.h2
2 files changed, 33 insertions, 2 deletions
diff --git a/ui/base/ime/input_method_ibus.cc b/ui/base/ime/input_method_ibus.cc
index 333dfaf..7fd48b2 100644
--- a/ui/base/ime/input_method_ibus.cc
+++ b/ui/base/ime/input_method_ibus.cc
@@ -43,6 +43,7 @@ const char kClientName[] = "chrome";
// http://ibus.googlecode.com/svn/docs/ibus-1.4/ibus-ibustypes.html#IBusCapabilite
const uint32 kIBusCapabilityPreeditText = 1U;
const uint32 kIBusCapabilityFocus = 8U;
+const uint32 kIBusCapabilitySurroundingText = 32U;
XKeyEvent* GetKeyEvent(XEvent* event) {
DCHECK(event && (event->type == KeyPress || event->type == KeyRelease));
@@ -354,6 +355,33 @@ void InputMethodIBus::OnCaretBoundsChanged(const TextInputClient* client) {
// This function runs asynchronously.
ibus_client_->SetCursorLocation(rect, composition_head);
+
+ ui::Range selection_range;
+ if (!GetTextInputClient()->GetSelectionRange(&selection_range)) {
+ previous_selected_text_.clear();
+ return;
+ }
+
+ string16 selection_text;
+ if (!GetTextInputClient()->GetTextFromRange(selection_range,
+ &selection_text)) {
+ previous_selected_text_.clear();
+ return;
+ }
+
+ if (previous_selected_text_ == selection_text)
+ return;
+
+ previous_selected_text_ = selection_text;
+
+ // In the original meaning of SetSurroundingText is not just selection text,
+ // but currently there are no way to retrieve surrounding text in
+ // TextInputClient.
+ // TODO(nona): Implement fully surrounding text retrieval.
+ GetInputContextClient()->SetSurroundingText(
+ UTF16ToUTF8(selection_text),
+ 0UL, /* cursor position. */
+ selection_range.length()); /* selection anchor position. */
}
void InputMethodIBus::CancelComposition(const TextInputClient* client) {
@@ -438,7 +466,8 @@ void InputMethodIBus::SetUpSignalHandlers() {
weak_ptr_factory_.GetWeakPtr()));
GetInputContextClient()->SetCapabilities(
- kIBusCapabilityPreeditText | kIBusCapabilityFocus);
+ kIBusCapabilityPreeditText | kIBusCapabilityFocus |
+ kIBusCapabilitySurroundingText);
UpdateContextFocusState();
// Since ibus-daemon is launched in an on-demand basis on Chrome OS, RWHVA (or
@@ -535,7 +564,7 @@ void InputMethodIBus::UpdateContextFocusState() {
GetInputContextClient()->FocusIn();
if (context_focused_) {
- uint32 capability = kIBusCapabilityFocus;
+ uint32 capability = kIBusCapabilityFocus | kIBusCapabilitySurroundingText;
if (CanComposeInline())
capability |= kIBusCapabilityPreeditText;
GetInputContextClient()->SetCapabilities(capability);
diff --git a/ui/base/ime/input_method_ibus.h b/ui/base/ime/input_method_ibus.h
index d6adc38..69e280f 100644
--- a/ui/base/ime/input_method_ibus.h
+++ b/ui/base/ime/input_method_ibus.h
@@ -188,6 +188,8 @@ class UI_EXPORT InputMethodIBus : public InputMethodBase {
// processing result of the pending key event.
string16 result_text_;
+ string16 previous_selected_text_;
+
// Indicates if input context is focused or not.
bool context_focused_;