| Index: ash/virtual_keyboard_controller.cc
|
| diff --git a/ash/virtual_keyboard_controller.cc b/ash/virtual_keyboard_controller.cc
|
| index e5904488f6d555b3e852321796c0d96056489742..32391eb100cad6929c99f25f746514d2765f50d1 100644
|
| --- a/ash/virtual_keyboard_controller.cc
|
| +++ b/ash/virtual_keyboard_controller.cc
|
| @@ -6,15 +6,21 @@
|
|
|
| #include <vector>
|
|
|
| +#include "ash/common/keyboard/keyboard_ui.h"
|
| #include "ash/common/system/tray/system_tray_notifier.h"
|
| #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
|
| #include "ash/common/wm_shell.h"
|
| +#include "ash/common/wm_window.h"
|
| +#include "ash/root_window_controller.h"
|
| #include "ash/shell.h"
|
| #include "base/command_line.h"
|
| #include "base/strings/string_util.h"
|
| +#include "ui/display/display.h"
|
| +#include "ui/display/screen.h"
|
| #include "ui/events/devices/input_device.h"
|
| #include "ui/events/devices/input_device_manager.h"
|
| #include "ui/events/devices/touchscreen_device.h"
|
| +#include "ui/keyboard/keyboard_controller.h"
|
| #include "ui/keyboard/keyboard_switches.h"
|
| #include "ui/keyboard/keyboard_util.h"
|
|
|
| @@ -30,6 +36,35 @@ bool IsSmartVirtualKeyboardEnabled() {
|
| return keyboard::IsSmartDeployEnabled();
|
| }
|
|
|
| +void MoveKeyboardToDisplayInternal(const int64_t display_id) {
|
| + // Remove the keyboard from curent root window controller
|
| + WmShell::Get()->keyboard_ui()->Hide();
|
| + RootWindowController::ForWindow(
|
| + keyboard::KeyboardController::GetInstance()->GetContainerWindow())
|
| + ->DeactivateKeyboard(keyboard::KeyboardController::GetInstance());
|
| +
|
| + for (RootWindowController* controller :
|
| + Shell::GetInstance()->GetAllRootWindowControllers()) {
|
| + if (display::Screen::GetScreen()
|
| + ->GetDisplayNearestWindow(controller->GetRootWindow())
|
| + .id() == display_id) {
|
| + controller->ActivateKeyboard(keyboard::KeyboardController::GetInstance());
|
| + break;
|
| + }
|
| + }
|
| +}
|
| +
|
| +void MoveKeyboardToFirstTouchableDisplay() {
|
| + // Move the keyboard to the first display with touch capability.
|
| + for (const auto& display : display::Screen::GetScreen()->GetAllDisplays()) {
|
| + if (display.touch_support() ==
|
| + display::Display::TouchSupport::TOUCH_SUPPORT_AVAILABLE) {
|
| + MoveKeyboardToDisplayInternal(display.id());
|
| + return;
|
| + }
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| VirtualKeyboardController::VirtualKeyboardController()
|
| @@ -76,6 +111,53 @@ void VirtualKeyboardController::ToggleIgnoreExternalKeyboard() {
|
| UpdateKeyboardEnabled();
|
| }
|
|
|
| +void VirtualKeyboardController::MoveKeyboardToDisplay(int64_t display_id) {
|
| + DCHECK(keyboard::KeyboardController::GetInstance() != nullptr);
|
| + DCHECK(display_id != display::kInvalidDisplayId);
|
| +
|
| + aura::Window* container =
|
| + keyboard::KeyboardController::GetInstance()->GetContainerWindow();
|
| + DCHECK(container != nullptr);
|
| + const display::Screen* screen = display::Screen::GetScreen();
|
| + const display::Display current_display =
|
| + screen->GetDisplayNearestWindow(container);
|
| +
|
| + if (display_id != current_display.id())
|
| + MoveKeyboardToDisplayInternal(display_id);
|
| +}
|
| +
|
| +void VirtualKeyboardController::MoveKeyboardToTouchableDisplay() {
|
| + DCHECK(keyboard::KeyboardController::GetInstance() != nullptr);
|
| +
|
| + aura::Window* container =
|
| + keyboard::KeyboardController::GetInstance()->GetContainerWindow();
|
| + DCHECK(container != nullptr);
|
| +
|
| + const display::Screen* screen = display::Screen::GetScreen();
|
| + const display::Display current_display =
|
| + screen->GetDisplayNearestWindow(container);
|
| +
|
| + if (WmShell::Get()->GetFocusedWindow() != nullptr) {
|
| + // Move the virtual keyboard to the focused display if that display has
|
| + // touch capability or keyboard is locked
|
| + const display::Display focused_display =
|
| + WmShell::Get()->GetFocusedWindow()->GetDisplayNearestWindow();
|
| + if (current_display.id() != focused_display.id() &&
|
| + focused_display.id() != display::kInvalidDisplayId &&
|
| + focused_display.touch_support() ==
|
| + display::Display::TouchSupport::TOUCH_SUPPORT_AVAILABLE) {
|
| + MoveKeyboardToDisplayInternal(focused_display.id());
|
| + return;
|
| + }
|
| + }
|
| +
|
| + if (current_display.touch_support() !=
|
| + display::Display::TouchSupport::TOUCH_SUPPORT_AVAILABLE) {
|
| + // The keyboard is currently on the display without touch capability.
|
| + MoveKeyboardToFirstTouchableDisplay();
|
| + }
|
| +}
|
| +
|
| void VirtualKeyboardController::UpdateDevices() {
|
| ui::InputDeviceManager* device_data_manager =
|
| ui::InputDeviceManager::GetInstance();
|
|
|