diff options
author | kinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-14 01:26:49 +0000 |
---|---|---|
committer | kinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-14 01:26:49 +0000 |
commit | 90b1e4fe376dc7cdf647548c99c80368c072a98a (patch) | |
tree | 42426105da95a44dad03832e368566727fff11cf /ui | |
parent | cf0f7d9ed9f6dd06c3cdb5c3880d79d727d6356f (diff) | |
download | chromium_src-90b1e4fe376dc7cdf647548c99c80368c072a98a.zip chromium_src-90b1e4fe376dc7cdf647548c99c80368c072a98a.tar.gz chromium_src-90b1e4fe376dc7cdf647548c99c80368c072a98a.tar.bz2 |
Implement off-the-spot mode for Aura-IBus IME.
When a PPAPI plugin does not support drawing composition text by themselves, the browser is expected to do it instead. This patch is for implementing it for Aura IME.
BUG=97189
TEST=Manually tested on ppapi_example_ime.
Review URL: http://codereview.chromium.org/9199004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@117751 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/base/ime/ibus_client.h | 8 | ||||
-rw-r--r-- | ui/base/ime/ibus_client_impl.cc | 9 | ||||
-rw-r--r-- | ui/base/ime/ibus_client_impl.h | 4 | ||||
-rw-r--r-- | ui/base/ime/input_method.h | 3 | ||||
-rw-r--r-- | ui/base/ime/input_method_base.cc | 5 | ||||
-rw-r--r-- | ui/base/ime/input_method_base.h | 3 | ||||
-rw-r--r-- | ui/base/ime/input_method_ibus.cc | 9 | ||||
-rw-r--r-- | ui/base/ime/input_method_ibus_unittest.cc | 13 | ||||
-rw-r--r-- | ui/base/ime/mock_ibus_client.cc | 3 | ||||
-rw-r--r-- | ui/base/ime/mock_ibus_client.h | 4 | ||||
-rw-r--r-- | ui/base/ime/mock_input_method.cc | 6 | ||||
-rw-r--r-- | ui/base/ime/mock_input_method.h | 3 | ||||
-rw-r--r-- | ui/base/ime/text_input_client.h | 5 | ||||
-rw-r--r-- | ui/views/controls/textfield/native_textfield_views.cc | 4 | ||||
-rw-r--r-- | ui/views/controls/textfield/native_textfield_views.h | 3 | ||||
-rw-r--r-- | ui/views/ime/input_method_bridge.cc | 7 | ||||
-rw-r--r-- | ui/views/ime/input_method_bridge.h | 3 | ||||
-rw-r--r-- | ui/views/test/views_test_base.cc | 5 |
18 files changed, 81 insertions, 16 deletions
diff --git a/ui/base/ime/ibus_client.h b/ui/base/ime/ibus_client.h index a430023..9292312 100644 --- a/ui/base/ime/ibus_client.h +++ b/ui/base/ime/ibus_client.h @@ -48,6 +48,11 @@ class UI_EXPORT IBusClient { virtual void StoreOrAbandonInputContext(IBusInputContext* ic) = 0; }; + enum InlineCompositionCapability { + OFF_THE_SPOT_COMPOSITION = 0, + INLINE_COMPOSITION = 1, + }; + virtual ~IBusClient() {} // Gets a D-Bus connection to ibus-daemon. An implementation should establish @@ -69,7 +74,8 @@ class UI_EXPORT IBusClient { virtual void DestroyProxy(IBusInputContext* context) = 0; // Updates the set of capabilities of the |context|. - virtual void SetCapabilities(IBusInputContext* context) = 0; + virtual void SetCapabilities(IBusInputContext* context, + InlineCompositionCapability inline_type) = 0; // Focuses the |context| asynchronously. virtual void FocusIn(IBusInputContext* context) = 0; diff --git a/ui/base/ime/ibus_client_impl.cc b/ui/base/ime/ibus_client_impl.cc index 4438b63..719db75 100644 --- a/ui/base/ime/ibus_client_impl.cc +++ b/ui/base/ime/ibus_client_impl.cc @@ -98,10 +98,13 @@ void IBusClientImpl::DestroyProxy(IBusInputContext* context) { ibus_proxy_destroy(IBUS_PROXY(context)); } -void IBusClientImpl::SetCapabilities(IBusInputContext* context) { +void IBusClientImpl::SetCapabilities(IBusInputContext* context, + InlineCompositionCapability inline_type) { // TODO(penghuang): support surrounding text. - static const guint32 kCapabilities = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS; - ibus_input_context_set_capabilities(context, kCapabilities); + guint32 capabilities = + inline_type == INLINE_COMPOSITION ? IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS + : IBUS_CAP_FOCUS; + ibus_input_context_set_capabilities(context, capabilities); } void IBusClientImpl::FocusIn(IBusInputContext* context) { diff --git a/ui/base/ime/ibus_client_impl.h b/ui/base/ime/ibus_client_impl.h index 4d076a7..91cb53a 100644 --- a/ui/base/ime/ibus_client_impl.h +++ b/ui/base/ime/ibus_client_impl.h @@ -28,7 +28,9 @@ public: virtual void CreateContext(IBusBus* bus, PendingCreateICRequest* request) OVERRIDE; virtual void DestroyProxy(IBusInputContext* context) OVERRIDE; - virtual void SetCapabilities(IBusInputContext* context) OVERRIDE; + virtual void SetCapabilities( + IBusInputContext* context, + InlineCompositionCapability inline_type) OVERRIDE; virtual void FocusIn(IBusInputContext* context) OVERRIDE; virtual void FocusOut(IBusInputContext* context) OVERRIDE; virtual void Reset(IBusInputContext* context) OVERRIDE; diff --git a/ui/base/ime/input_method.h b/ui/base/ime/input_method.h index 4fe184c..1796ceb 100644 --- a/ui/base/ime/input_method.h +++ b/ui/base/ime/input_method.h @@ -117,6 +117,9 @@ class UI_EXPORT InputMethod { // Gets the text input type of the focused text input client. Returns // ui::TEXT_INPUT_TYPE_NONE if there is no focused client. virtual TextInputType GetTextInputType() const = 0; + + // Checks if the focused text input client supports inline composition. + virtual bool CanComposeInline() const = 0; }; } // namespace ui diff --git a/ui/base/ime/input_method_base.cc b/ui/base/ime/input_method_base.cc index 601887b..ae2d41a4 100644 --- a/ui/base/ime/input_method_base.cc +++ b/ui/base/ime/input_method_base.cc @@ -61,6 +61,11 @@ TextInputType InputMethodBase::GetTextInputType() const { return client ? client->GetTextInputType() : TEXT_INPUT_TYPE_NONE; } +bool InputMethodBase::CanComposeInline() const { + TextInputClient* client = GetTextInputClient(); + return client ? client->CanComposeInline() : true; +} + bool InputMethodBase::IsTextInputClientFocused(const TextInputClient* client) { return client && (client == GetTextInputClient()); } diff --git a/ui/base/ime/input_method_base.h b/ui/base/ime/input_method_base.h index 1e511b5..42b7eb2 100644 --- a/ui/base/ime/input_method_base.h +++ b/ui/base/ime/input_method_base.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -43,6 +43,7 @@ class UI_EXPORT InputMethodBase : public InputMethod { virtual void OnTextInputTypeChanged(const TextInputClient* client) OVERRIDE; virtual TextInputType GetTextInputType() const OVERRIDE; + virtual bool CanComposeInline() const OVERRIDE; protected: virtual void OnWillChangeFocusedClient(TextInputClient* focused_before, diff --git a/ui/base/ime/input_method_ibus.cc b/ui/base/ime/input_method_ibus.cc index 2cc7820..89727da 100644 --- a/ui/base/ime/input_method_ibus.cc +++ b/ui/base/ime/input_method_ibus.cc @@ -405,7 +405,7 @@ void InputMethodIBus::SetContext(IBusInputContext* ic) { g_signal_connect(ic, "destroy", G_CALLBACK(OnDestroyThunk), this); - ibus_client_->SetCapabilities(ic); + ibus_client_->SetCapabilities(ic, internal::IBusClient::INLINE_COMPOSITION); UpdateContextFocusState(); // Since ibus-daemon is launched in an on-demand basis on Chrome OS, RWHVA (or @@ -497,6 +497,13 @@ void InputMethodIBus::UpdateContextFocusState() { ibus_client_->FocusOut(context_); else if (!old_context_focused && context_focused_) ibus_client_->FocusIn(context_); + + if (context_focused_) { + internal::IBusClient::InlineCompositionCapability capability = + CanComposeInline() ? internal::IBusClient::INLINE_COMPOSITION + : internal::IBusClient::OFF_THE_SPOT_COMPOSITION; + ibus_client_->SetCapabilities(context_, capability); + } } void InputMethodIBus::ProcessKeyEventPostIME( diff --git a/ui/base/ime/input_method_ibus_unittest.cc b/ui/base/ime/input_method_ibus_unittest.cc index 025846b..a2afc40 100644 --- a/ui/base/ime/input_method_ibus_unittest.cc +++ b/ui/base/ime/input_method_ibus_unittest.cc @@ -88,6 +88,9 @@ class InputMethodIBusTest : public internal::InputMethodDelegate, virtual TextInputType GetTextInputType() const OVERRIDE { return input_type_; } + virtual bool CanComposeInline() const OVERRIDE { + return can_compose_inline_; + } virtual gfx::Rect GetCaretBounds() OVERRIDE { return caret_bounds_; } @@ -139,6 +142,7 @@ class InputMethodIBusTest : public internal::InputMethodDelegate, on_input_method_changed_call_count_ = 0; input_type_ = TEXT_INPUT_TYPE_NONE; + can_compose_inline_ = true; caret_bounds_ = gfx::Rect(); } @@ -162,6 +166,7 @@ class InputMethodIBusTest : public internal::InputMethodDelegate, // Variables that will be returned from the ui::TextInputClient functions. TextInputType input_type_; + bool can_compose_inline_; gfx::Rect caret_bounds_; }; @@ -196,6 +201,14 @@ TEST_F(InputMethodIBusTest, GetInputTextType) { EXPECT_EQ(TEXT_INPUT_TYPE_TEXT, ime_->GetTextInputType()); } +TEST_F(InputMethodIBusTest, CanComposeInline) { + ime_->Init(true); + EXPECT_EQ(true, ime_->CanComposeInline()); + can_compose_inline_ = false; + ime_->OnTextInputTypeChanged(this); + EXPECT_EQ(false, ime_->CanComposeInline()); +} + TEST_F(InputMethodIBusTest, GetTextInputClient) { ime_->Init(true); EXPECT_EQ(this, ime_->GetTextInputClient()); diff --git a/ui/base/ime/mock_ibus_client.cc b/ui/base/ime/mock_ibus_client.cc index f4ada55..b06237f 100644 --- a/ui/base/ime/mock_ibus_client.cc +++ b/ui/base/ime/mock_ibus_client.cc @@ -177,7 +177,8 @@ void MockIBusClient::DestroyProxy(IBusInputContext* context) { g_signal_emit_by_name(context, "destroy"); } -void MockIBusClient::SetCapabilities(IBusInputContext* context) { +void MockIBusClient::SetCapabilities(IBusInputContext* context, + InlineCompositionCapability inline_type) { ++set_capabilities_call_count_; } diff --git a/ui/base/ime/mock_ibus_client.h b/ui/base/ime/mock_ibus_client.h index 56c2e22..01ce75f 100644 --- a/ui/base/ime/mock_ibus_client.h +++ b/ui/base/ime/mock_ibus_client.h @@ -27,7 +27,9 @@ public: virtual void CreateContext(IBusBus* bus, PendingCreateICRequest* request) OVERRIDE; virtual void DestroyProxy(IBusInputContext* context) OVERRIDE; - virtual void SetCapabilities(IBusInputContext* context) OVERRIDE; + virtual void SetCapabilities( + IBusInputContext* context, + InlineCompositionCapability inline_type) OVERRIDE; virtual void FocusIn(IBusInputContext* context) OVERRIDE; virtual void FocusOut(IBusInputContext* context) OVERRIDE; virtual void Reset(IBusInputContext* context) OVERRIDE; diff --git a/ui/base/ime/mock_input_method.cc b/ui/base/ime/mock_input_method.cc index 9aba8d5..461f19c 100644 --- a/ui/base/ime/mock_input_method.cc +++ b/ui/base/ime/mock_input_method.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -115,4 +115,8 @@ ui::TextInputType MockInputMethod::GetTextInputType() const { return ui::TEXT_INPUT_TYPE_NONE; } +bool MockInputMethod::CanComposeInline() const { + return true; +} + } // namespace ui diff --git a/ui/base/ime/mock_input_method.h b/ui/base/ime/mock_input_method.h index fc1eeb5..73042f3 100644 --- a/ui/base/ime/mock_input_method.h +++ b/ui/base/ime/mock_input_method.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -36,6 +36,7 @@ class UI_EXPORT MockInputMethod : public InputMethod { virtual base::i18n::TextDirection GetInputTextDirection() OVERRIDE; virtual bool IsActive() OVERRIDE; virtual ui::TextInputType GetTextInputType() const OVERRIDE; + virtual bool CanComposeInline() const OVERRIDE; private: internal::InputMethodDelegate* delegate_; diff --git a/ui/base/ime/text_input_client.h b/ui/base/ime/text_input_client.h index 4d10309..b319ec9 100644 --- a/ui/base/ime/text_input_client.h +++ b/ui/base/ime/text_input_client.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -60,6 +60,9 @@ class UI_EXPORT TextInputClient { // TEXT_INPUT_TYPE_NONE at runtime. virtual ui::TextInputType GetTextInputType() const = 0; + // Returns if the client supports inline composition currently. + virtual bool CanComposeInline() const = 0; + // Returns current caret (insertion point) bounds relative to the screen // coordinates. If there is selection, then the selection bounds will be // returned. diff --git a/ui/views/controls/textfield/native_textfield_views.cc b/ui/views/controls/textfield/native_textfield_views.cc index 950a7fb..2210052 100644 --- a/ui/views/controls/textfield/native_textfield_views.cc +++ b/ui/views/controls/textfield/native_textfield_views.cc @@ -699,6 +699,10 @@ ui::TextInputType NativeTextfieldViews::GetTextInputType() const { return textfield_->GetTextInputType(); } +bool NativeTextfieldViews::CanComposeInline() const { + return true; +} + gfx::Rect NativeTextfieldViews::GetCaretBounds() { return GetRenderText()->GetUpdatedCursorBounds(); } diff --git a/ui/views/controls/textfield/native_textfield_views.h b/ui/views/controls/textfield/native_textfield_views.h index d074dbf..312ffb1 100644 --- a/ui/views/controls/textfield/native_textfield_views.h +++ b/ui/views/controls/textfield/native_textfield_views.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -151,6 +151,7 @@ class VIEWS_EXPORT NativeTextfieldViews : public TouchSelectionClientView, virtual void InsertText(const string16& text) OVERRIDE; virtual void InsertChar(char16 ch, int flags) OVERRIDE; virtual ui::TextInputType GetTextInputType() const OVERRIDE; + virtual bool CanComposeInline() const OVERRIDE; virtual gfx::Rect GetCaretBounds() OVERRIDE; virtual bool HasCompositionText() OVERRIDE; virtual bool GetTextRange(ui::Range* range) OVERRIDE; diff --git a/ui/views/ime/input_method_bridge.cc b/ui/views/ime/input_method_bridge.cc index 1ca1631..26b5242 100644 --- a/ui/views/ime/input_method_bridge.cc +++ b/ui/views/ime/input_method_bridge.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -126,6 +126,11 @@ ui::TextInputType InputMethodBridge::GetTextInputType() const { return client ? client->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE; } +bool InputMethodBridge::CanComposeInline() const { + TextInputClient* client = GetTextInputClient(); + return client ? client->CanComposeInline() : true; +} + gfx::Rect InputMethodBridge::GetCaretBounds() { TextInputClient* client = GetTextInputClient(); if (!client || !GetFocusedView()) diff --git a/ui/views/ime/input_method_bridge.h b/ui/views/ime/input_method_bridge.h index 6f4b384..437856e 100644 --- a/ui/views/ime/input_method_bridge.h +++ b/ui/views/ime/input_method_bridge.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -51,6 +51,7 @@ class InputMethodBridge : public InputMethodBase, virtual void InsertText(const string16& text) OVERRIDE; virtual void InsertChar(char16 ch, int flags) OVERRIDE; virtual ui::TextInputType GetTextInputType() const OVERRIDE; + virtual bool CanComposeInline() const OVERRIDE; virtual gfx::Rect GetCaretBounds() OVERRIDE; virtual bool HasCompositionText() OVERRIDE; virtual bool GetTextRange(ui::Range* range) OVERRIDE; diff --git a/ui/views/test/views_test_base.cc b/ui/views/test/views_test_base.cc index d172c17..ee1ab9f 100644 --- a/ui/views/test/views_test_base.cc +++ b/ui/views/test/views_test_base.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -48,6 +48,9 @@ class DummyInputMethod : public ui::InputMethod { virtual ui::TextInputType GetTextInputType() const OVERRIDE { return ui::TEXT_INPUT_TYPE_NONE; } + virtual bool CanComposeInline() const OVERRIDE { + return true; + } }; } // namespace |