diff options
Diffstat (limited to 'ash/root_window_controller.cc')
-rw-r--r-- | ash/root_window_controller.cc | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc index 7f8d41c..066f06c 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(); } |