summaryrefslogtreecommitdiff
path: root/chromium/ash/display/virtual_keyboard_window_controller.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/display/virtual_keyboard_window_controller.cc')
-rw-r--r--chromium/ash/display/virtual_keyboard_window_controller.cc102
1 files changed, 102 insertions, 0 deletions
diff --git a/chromium/ash/display/virtual_keyboard_window_controller.cc b/chromium/ash/display/virtual_keyboard_window_controller.cc
new file mode 100644
index 00000000000..dd0c4d8eb71
--- /dev/null
+++ b/chromium/ash/display/virtual_keyboard_window_controller.cc
@@ -0,0 +1,102 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/display/virtual_keyboard_window_controller.h"
+
+#include "ash/display/display_controller.h"
+#include "ash/display/display_info.h"
+#include "ash/display/display_manager.h"
+#include "ash/display/root_window_transformers.h"
+#include "ash/host/root_window_host_factory.h"
+#include "ash/root_window_controller.h"
+#include "ash/root_window_settings.h"
+#include "ash/shell.h"
+#include "ash/shell_window_ids.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ui/aura/env.h"
+#include "ui/aura/root_window.h"
+#include "ui/aura/root_window_transformer.h"
+#include "ui/keyboard/keyboard_controller.h"
+
+namespace ash {
+namespace internal {
+
+VirtualKeyboardWindowController::VirtualKeyboardWindowController() {
+}
+
+VirtualKeyboardWindowController::~VirtualKeyboardWindowController() {
+ // Make sure the root window gets deleted before cursor_window_delegate.
+ Close();
+}
+
+void VirtualKeyboardWindowController::ActivateKeyboard(
+ keyboard::KeyboardController* keyboard_controller) {
+ root_window_controller_->ActivateKeyboard(keyboard_controller);
+}
+
+void VirtualKeyboardWindowController::UpdateWindow(
+ const DisplayInfo& display_info) {
+ static int virtual_keyboard_root_window_count = 0;
+ if (!root_window_controller_.get()) {
+ const gfx::Rect& bounds_in_native = display_info.bounds_in_native();
+ aura::RootWindow::CreateParams params(bounds_in_native);
+ params.host = Shell::GetInstance()->root_window_host_factory()->
+ CreateRootWindowHost(bounds_in_native);
+ aura::RootWindow* root_window = new aura::RootWindow(params);
+
+ root_window->window()->SetName(
+ base::StringPrintf("VirtualKeyboardRootWindow-%d",
+ virtual_keyboard_root_window_count++));
+
+ // No need to remove RootWindowObserver because
+ // the DisplayController object outlives RootWindow objects.
+ root_window->AddRootWindowObserver(
+ Shell::GetInstance()->display_controller());
+ InitRootWindowSettings(root_window->window())->display_id =
+ display_info.id();
+ root_window->Init();
+ RootWindowController::CreateForVirtualKeyboardDisplay(root_window);
+ root_window_controller_.reset(GetRootWindowController(
+ root_window->window()));
+ root_window_controller_->dispatcher()->host()->Show();
+ root_window_controller_->ActivateKeyboard(
+ Shell::GetInstance()->keyboard_controller());
+ FlipDisplay();
+ } else {
+ aura::RootWindow* root_window = root_window_controller_->dispatcher();
+ GetRootWindowSettings(root_window->window())->display_id =
+ display_info.id();
+ root_window->SetHostBounds(display_info.bounds_in_native());
+ }
+}
+
+void VirtualKeyboardWindowController::Close() {
+ if (root_window_controller_.get()) {
+ root_window_controller_->dispatcher()->RemoveRootWindowObserver(
+ Shell::GetInstance()->display_controller());
+ root_window_controller_->Shutdown();
+ root_window_controller_.reset();
+ }
+}
+
+void VirtualKeyboardWindowController::FlipDisplay() {
+ DisplayManager* display_manager = Shell::GetInstance()->display_manager();
+ if (!display_manager->virtual_keyboard_root_window_enabled()) {
+ NOTREACHED() << "Attempting to flip virtual keyboard root window when it "
+ << "is not enabled.";
+ return;
+ }
+ display_manager->SetDisplayRotation(
+ display_manager->non_desktop_display().id(), gfx::Display::ROTATE_180);
+
+ aura::RootWindow* root_window = root_window_controller_->dispatcher();
+ scoped_ptr<aura::RootWindowTransformer> transformer(
+ internal::CreateRootWindowTransformerForDisplay(root_window->window(),
+ display_manager->non_desktop_display()));
+ root_window->SetRootWindowTransformer(transformer.Pass());
+}
+
+} // namespace internal
+} // namespace ash