Index: ui/keyboard/keyboard_controller.cc |
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc |
index c948ca04beee84730d823e4ac4c436f2de71a76a..e9e63da2def30cca0f75eb5024ee8597df8a35cf 100644 |
--- a/ui/keyboard/keyboard_controller.cc |
+++ b/ui/keyboard/keyboard_controller.cc |
@@ -141,6 +141,14 @@ aura::Window* KeyboardController::GetContainerWindow() { |
return container_; |
} |
+void KeyboardController::AddObserver(Observer* observer) { |
+ observer_list_.AddObserver(observer); |
+} |
+ |
+void KeyboardController::RemoveObserver(Observer* observer) { |
+ observer_list_.RemoveObserver(observer); |
+} |
+ |
void KeyboardController::OnWindowParentChanged(aura::Window* window, |
aura::Window* parent) { |
OnTextInputStateChanged(proxy_->GetInputMethod()->GetTextInputClient()); |
@@ -156,8 +164,10 @@ void KeyboardController::OnTextInputStateChanged( |
if (!container_) |
return; |
+ bool was_showing = container_->IsVisible(); |
+ bool should_show = was_showing; |
if (!client || client->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) { |
- container_->Hide(); |
+ should_show = false; |
} else { |
if (container_->children().empty()) { |
aura::Window* keyboard = proxy_->GetKeyboardWindow(); |
@@ -166,8 +176,22 @@ void KeyboardController::OnTextInputStateChanged( |
container_->layout_manager()->OnWindowResized(); |
} |
container_->parent()->StackChildAtTop(container_); |
- container_->Show(); |
+ should_show = true; |
} |
+ |
+ if (was_showing != should_show) { |
+ gfx::Rect new_bounds( |
+ should_show ? container_->children()[0]->bounds() : gfx::Rect()); |
+ |
+ FOR_EACH_OBSERVER( |
+ Observer, observer_list_, OnKeyboardBoundsChanging(new_bounds)); |
+ |
+ if (should_show) |
+ container_->Show(); |
+ else |
+ container_->Hide(); |
+ } |
+ |
// TODO(bryeung): whenever the TextInputClient changes we need to notify the |
// keyboard (with the TextInputType) so that it can reset it's state (e.g. |
// abandon compositions in progress) |