Chromium Code Reviews| Index: ui/views/focus/focus_manager.cc |
| diff --git a/ui/views/focus/focus_manager.cc b/ui/views/focus/focus_manager.cc |
| index aba46e079ca754d507900c818265490b2713e6bc..1b61070f8a93ec5a07301b59fe8c96cd9435e3a0 100644 |
| --- a/ui/views/focus/focus_manager.cc |
| +++ b/ui/views/focus/focus_manager.cc |
| @@ -11,6 +11,10 @@ |
| #include "base/logging.h" |
| #include "build/build_config.h" |
| #include "ui/base/accelerators/accelerator.h" |
| +#include "ui/base/ime/input_method.h" |
| +#include "ui/base/ime/text_input_client.h" |
| +#include "ui/base/ime/text_input_focus_manager.h" |
| +#include "ui/base/ui_base_switches_util.h" |
| #include "ui/events/event.h" |
| #include "ui/events/keycodes/keyboard_codes.h" |
| #include "ui/views/focus/focus_manager_delegate.h" |
| @@ -117,6 +121,13 @@ bool FocusManager::OnKeyEvent(const ui::KeyEvent& event) { |
| return true; |
| } |
| +void FocusManager::OnTextInputClientChanged(View* view) { |
| + if (view != focused_view_) |
|
msw
2014/03/11 00:58:50
nit: reverse the condition and call Focus* in this
Yuki
2014/03/11 15:27:37
Done.
|
| + return; |
| + |
| + FocusTextInputClient(view); |
| +} |
| + |
| void FocusManager::ValidateFocusedView() { |
| if (focused_view_ && !ContainsView(focused_view_)) |
| ClearFocus(); |
| @@ -321,14 +332,18 @@ void FocusManager::SetFocusedViewWithReason( |
| View* old_focused_view = focused_view_; |
| focused_view_ = view; |
| - if (old_focused_view) |
| + if (old_focused_view) { |
| old_focused_view->Blur(); |
| + BlurTextInputClient(old_focused_view); |
| + } |
| // Also make |focused_view_| the stored focus view. This way the stored focus |
| // view is remembered if focus changes are requested prior to a show or while |
| // hidden. |
| SetStoredFocusView(focused_view_); |
| - if (focused_view_) |
| + if (focused_view_) { |
| + FocusTextInputClient(focused_view_); |
| focused_view_->Focus(); |
| + } |
| FOR_EACH_OBSERVER(FocusChangeListener, focus_change_listeners_, |
| OnDidChangeFocus(old_focused_view, focused_view_)); |
| @@ -537,4 +552,39 @@ bool FocusManager::ProcessArrowKeyTraversal(const ui::KeyEvent& event) { |
| return false; |
| } |
| +void FocusManager::FocusTextInputClient(View* view) { |
| + if (!switches::IsNewTextInputFocusEnabled()) |
| + return; |
| + |
| + // If the widget is not active, do not steal the text input focus. |
| + if (!widget_->IsActive()) |
| + return; |
| + |
| + ui::TextInputClient* text_input_client = |
| + view ? view->GetTextInputClient() : NULL; |
| + ui::TextInputFocusManager::GetInstance()-> |
| + SetFocusedTextInputClient(text_input_client); |
| + ui::InputMethod* input_method = widget_->GetHostInputMethod(); |
| + if (input_method) { |
|
msw
2014/03/11 00:58:50
Should this and BlurTextInputClient (or TextInputF
Yuki
2014/03/11 15:27:37
Thre is nothing to do.
We call InputMethod::OnTex
msw
2014/03/11 23:24:37
Sounds good.
|
| + input_method->OnTextInputTypeChanged(text_input_client); |
| + input_method->OnCaretBoundsChanged(text_input_client); |
| + } |
| +} |
| + |
| +void FocusManager::BlurTextInputClient(View* view) { |
| + if (!switches::IsNewTextInputFocusEnabled()) |
| + return; |
| + |
| + ui::TextInputClient* text_input_client = |
| + view ? view->GetTextInputClient() : NULL; |
| + if (text_input_client && text_input_client->HasCompositionText()) { |
| + text_input_client->ConfirmCompositionText(); |
| + ui::InputMethod* input_method = widget_->GetHostInputMethod(); |
| + if (input_method && input_method->GetTextInputClient() == text_input_client) |
| + input_method->CancelComposition(text_input_client); |
| + } |
| + ui::TextInputFocusManager::GetInstance()-> |
| + UnsetFocusedTextInputClient(text_input_client); |
| +} |
| + |
| } // namespace views |