Chromium Code Reviews| Index: ash/root_window_controller.cc |
| diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc |
| index 7f8d41c1ca3f0583471d57ab6b22b76e98e107e9..4fc96cb1881ba6576a232ef128a513327ce065d6 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,37 @@ 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); |
| + keyboard_container->SetBounds(parent->bounds()); |
|
oshima
2013/10/04 16:50:17
won't RootWindowLayoutManager handle this?
bshe
2013/10/04 17:38:32
Sorry, just to confirm, do you mean the SetBounds
oshima
2013/10/04 17:51:35
I see. Maybe it's doing this way to avoid some iss
bshe
2013/10/04 18:05:52
Thanks! Added a TODO.
On 2013/10/04 17:51:35, osh
|
| +} |
| + |
| +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 +839,6 @@ void RootWindowController::DisableTouchHudProjection() { |
| } |
| void RootWindowController::OnLoginStateChanged(user::LoginStatus status) { |
| - if (status != user::LOGGED_IN_NONE) |
| - InitKeyboard(); |
| shelf_->shelf_layout_manager()->UpdateVisibilityState(); |
| } |