Index: ash/root_window_controller.cc |
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc |
index 7f8d41c1ca3f0583471d57ab6b22b76e98e107e9..066f06cd5d8c4057ba3ecca4eb8def828649c16a 100644 |
--- a/ash/root_window_controller.cc |
+++ b/ash/root_window_controller.cc |
@@ -331,7 +331,6 @@ void RootWindowController::Init(bool first_run_after_boot) { |
CreateSystemBackground(first_run_after_boot); |
InitLayoutManagers(); |
- InitKeyboard(); |
InitTouchHuds(); |
if (Shell::GetPrimaryRootWindowController()-> |
@@ -407,6 +406,10 @@ void RootWindowController::OnWallpaperAnimationFinished(views::Widget* widget) { |
void RootWindowController::CloseChildWindows() { |
mouse_event_target_.reset(); |
+ // Deactivate keyboard container before closing child windows and shutting |
+ // down associated layout managers. |
+ DeactivateKeyboard(Shell::GetInstance()->keyboard_controller()); |
+ |
if (!shelf_.get()) |
return; |
// panel_layout_manager_ needs to be shut down before windows are destroyed. |
@@ -528,28 +531,39 @@ const aura::Window* RootWindowController::GetTopmostFullscreenWindow() const { |
return NULL; |
} |
-void RootWindowController::InitKeyboard() { |
- if (keyboard::IsKeyboardEnabled()) { |
- aura::Window* parent = root_window(); |
- |
- keyboard::KeyboardControllerProxy* proxy = |
- Shell::GetInstance()->delegate()->CreateKeyboardControllerProxy(); |
- keyboard_controller_.reset( |
- new keyboard::KeyboardController(proxy)); |
- |
- keyboard_controller_->AddObserver(shelf()->shelf_layout_manager()); |
- keyboard_controller_->AddObserver(panel_layout_manager_); |
- keyboard_controller_->AddObserver(docked_layout_manager_); |
- |
- // Deletes the old container since |keyboard_controller_| creates a |
- // new container window in GetContainerWindow(). |
- delete GetContainer(kShellWindowId_VirtualKeyboardContainer); |
+void RootWindowController::ActivateKeyboard( |
+ keyboard::KeyboardController* keyboard_controller) { |
+ if (!keyboard::IsKeyboardEnabled() || |
+ GetContainer(kShellWindowId_VirtualKeyboardContainer)) { |
+ return; |
+ } |
+ DCHECK(keyboard_controller); |
+ keyboard_controller->AddObserver(shelf()->shelf_layout_manager()); |
+ keyboard_controller->AddObserver(panel_layout_manager_); |
+ keyboard_controller->AddObserver(docked_layout_manager_); |
+ aura::Window* parent = root_window(); |
+ aura::Window* keyboard_container = |
+ keyboard_controller->GetContainerWindow(); |
+ keyboard_container->set_id(kShellWindowId_VirtualKeyboardContainer); |
+ parent->AddChild(keyboard_container); |
+ // TODO(oshima): Bounds of keyboard container should be handled by |
+ // RootWindowLayoutManager. Remove this after fixed RootWindowLayoutManager. |
+ keyboard_container->SetBounds(parent->bounds()); |
+} |
+ |
+void RootWindowController::DeactivateKeyboard( |
+ keyboard::KeyboardController* keyboard_controller) { |
+ if (!keyboard::IsKeyboardEnabled()) |
+ return; |
- aura::Window* keyboard_container = |
- keyboard_controller_->GetContainerWindow(); |
- keyboard_container->set_id(kShellWindowId_VirtualKeyboardContainer); |
- parent->AddChild(keyboard_container); |
- keyboard_container->SetBounds(parent->bounds()); |
+ DCHECK(keyboard_controller); |
+ aura::Window* keyboard_container = |
+ keyboard_controller->GetContainerWindow(); |
+ if (keyboard_container->GetRootWindow() == root_window()) { |
+ root_window()->RemoveChild(keyboard_container); |
+ keyboard_controller->RemoveObserver(shelf()->shelf_layout_manager()); |
+ keyboard_controller->RemoveObserver(panel_layout_manager_); |
+ keyboard_controller->RemoveObserver(docked_layout_manager_); |
} |
} |
@@ -827,8 +841,6 @@ void RootWindowController::DisableTouchHudProjection() { |
} |
void RootWindowController::OnLoginStateChanged(user::LoginStatus status) { |
- if (status != user::LOGGED_IN_NONE) |
- InitKeyboard(); |
shelf_->shelf_layout_manager()->UpdateVisibilityState(); |
} |