| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/keyboard/keyboard_controller.h" | 5 #include "ui/keyboard/keyboard_controller.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 const ui::InputMethod* input_method) { | 434 const ui::InputMethod* input_method) { |
| 435 DCHECK_EQ(input_method_, input_method); | 435 DCHECK_EQ(input_method_, input_method); |
| 436 input_method_ = NULL; | 436 input_method_ = NULL; |
| 437 } | 437 } |
| 438 | 438 |
| 439 void KeyboardController::OnShowImeIfNeeded() { | 439 void KeyboardController::OnShowImeIfNeeded() { |
| 440 ShowKeyboardInternal(); | 440 ShowKeyboardInternal(); |
| 441 } | 441 } |
| 442 | 442 |
| 443 bool KeyboardController::ShouldEnableInsets(aura::Window* window) { | 443 bool KeyboardController::ShouldEnableInsets(aura::Window* window) { |
| 444 aura::Window *keyboard_window = proxy_->GetKeyboardWindow(); | 444 aura::Window* keyboard_window = proxy_->GetKeyboardWindow(); |
| 445 return (keyboard_window->GetRootWindow() == window->GetRootWindow() && | 445 return (keyboard_window->GetRootWindow() == window->GetRootWindow() && |
| 446 keyboard::IsKeyboardOverscrollEnabled() && | 446 keyboard::IsKeyboardOverscrollEnabled() && |
| 447 proxy_->GetKeyboardWindow()->IsVisible() && | 447 keyboard_window->IsVisible() && keyboard_visible_); |
| 448 keyboard_visible_); | |
| 449 } | 448 } |
| 450 | 449 |
| 451 void KeyboardController::UpdateWindowInsets(aura::Window* window) { | 450 void KeyboardController::UpdateWindowInsets(aura::Window* window) { |
| 452 aura::Window *keyboard_window = proxy_->GetKeyboardWindow(); | 451 aura::Window* keyboard_window = proxy_->GetKeyboardWindow(); |
| 453 if (window == keyboard_window) | 452 if (window == keyboard_window) |
| 454 return; | 453 return; |
| 455 | 454 |
| 456 scoped_ptr<content::RenderWidgetHostIterator> widgets( | 455 scoped_ptr<content::RenderWidgetHostIterator> widgets( |
| 457 content::RenderWidgetHost::GetRenderWidgetHosts()); | 456 content::RenderWidgetHost::GetRenderWidgetHosts()); |
| 458 while (content::RenderWidgetHost* widget = widgets->GetNextHost()) { | 457 while (content::RenderWidgetHost* widget = widgets->GetNextHost()) { |
| 459 content::RenderWidgetHostView* view = widget->GetView(); | 458 content::RenderWidgetHostView* view = widget->GetView(); |
| 460 if (view && window->Contains(view->GetNativeView())) { | 459 if (view && window->Contains(view->GetNativeView())) { |
| 461 gfx::Rect window_bounds = view->GetNativeView()->GetBoundsInScreen(); | 460 gfx::Rect window_bounds = view->GetNativeView()->GetBoundsInScreen(); |
| 462 gfx::Rect intersect = gfx::IntersectRects(window_bounds, | 461 gfx::Rect intersect = |
| 463 proxy_->GetKeyboardWindow()->bounds()); | 462 gfx::IntersectRects(window_bounds, keyboard_window->bounds()); |
| 464 int overlap = ShouldEnableInsets(window) ? intersect.height() : 0; | 463 int overlap = ShouldEnableInsets(window) ? intersect.height() : 0; |
| 465 if (overlap > 0 && overlap < window_bounds.height()) | 464 if (overlap > 0 && overlap < window_bounds.height()) |
| 466 view->SetInsets(gfx::Insets(0, 0, overlap, 0)); | 465 view->SetInsets(gfx::Insets(0, 0, overlap, 0)); |
| 467 else | 466 else |
| 468 view->SetInsets(gfx::Insets()); | 467 view->SetInsets(gfx::Insets()); |
| 469 return; | 468 return; |
| 470 } | 469 } |
| 471 } | 470 } |
| 472 } | 471 } |
| 473 | 472 |
| 473 void KeyboardController::OnRootWindowResized(const gfx::Rect& bounds) { |
| 474 // Keep the same height when window resize. It gets called when screen rotate. |
| 475 if (!keyboard_container_initialized() || !proxy_->GetKeyboardWindow()) |
| 476 return; |
| 477 |
| 478 int container_height = container_->bounds().height(); |
| 479 if (keyboard_mode_ == FULL_WIDTH) { |
| 480 container_->SetBounds(gfx::Rect(bounds.x(), |
| 481 bounds.bottom() - container_height, |
| 482 bounds.width(), container_height)); |
| 483 } else if (keyboard_mode_ == FLOATING) { |
| 484 // When screen rotate, horizontally center floating virtual keyboard window |
| 485 // and vertically align it to the bottom. |
| 486 int container_width = container_->bounds().width(); |
| 487 container_->SetBounds(gfx::Rect( |
| 488 bounds.x() + (bounds.width() - container_width) / 2, |
| 489 bounds.bottom() - container_height, container_width, container_height)); |
| 490 } |
| 491 } |
| 492 |
| 474 void KeyboardController::ShowKeyboardInternal() { | 493 void KeyboardController::ShowKeyboardInternal() { |
| 475 if (!container_.get()) | 494 if (!container_.get()) |
| 476 return; | 495 return; |
| 477 | 496 |
| 478 if (container_->children().empty()) { | 497 if (container_->children().empty()) { |
| 479 keyboard::MarkKeyboardLoadStarted(); | 498 keyboard::MarkKeyboardLoadStarted(); |
| 480 aura::Window* keyboard = proxy_->GetKeyboardWindow(); | 499 aura::Window* keyboard = proxy_->GetKeyboardWindow(); |
| 481 keyboard->Show(); | 500 keyboard->Show(); |
| 482 container_->AddChild(keyboard); | 501 container_->AddChild(keyboard); |
| 483 keyboard->set_owned_by_parent(false); | 502 keyboard->set_owned_by_parent(false); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 window_bounds_observer_->RemoveAllObservedWindows(); | 576 window_bounds_observer_->RemoveAllObservedWindows(); |
| 558 } | 577 } |
| 559 | 578 |
| 560 bool KeyboardController::WillHideKeyboard() const { | 579 bool KeyboardController::WillHideKeyboard() const { |
| 561 return weak_factory_.HasWeakPtrs(); | 580 return weak_factory_.HasWeakPtrs(); |
| 562 } | 581 } |
| 563 | 582 |
| 564 void KeyboardController::ShowAnimationFinished() { | 583 void KeyboardController::ShowAnimationFinished() { |
| 565 // Notify observers after animation finished to prevent reveal desktop | 584 // Notify observers after animation finished to prevent reveal desktop |
| 566 // background during animation. | 585 // background during animation. |
| 567 NotifyKeyboardBoundsChanging(proxy_->GetKeyboardWindow()->bounds()); | 586 NotifyKeyboardBoundsChanging(container_->bounds()); |
| 568 proxy_->EnsureCaretInWorkArea(); | 587 proxy_->EnsureCaretInWorkArea(); |
| 569 } | 588 } |
| 570 | 589 |
| 571 void KeyboardController::HideAnimationFinished() { | 590 void KeyboardController::HideAnimationFinished() { |
| 572 proxy_->HideKeyboardContainer(container_.get()); | 591 proxy_->HideKeyboardContainer(container_.get()); |
| 573 } | 592 } |
| 574 | 593 |
| 575 void KeyboardController::AddBoundsChangedObserver(aura::Window* window) { | 594 void KeyboardController::AddBoundsChangedObserver(aura::Window* window) { |
| 576 aura::Window* target_window = window ? window->GetToplevelWindow() : nullptr; | 595 aura::Window* target_window = window ? window->GetToplevelWindow() : nullptr; |
| 577 if (target_window) | 596 if (target_window) |
| 578 window_bounds_observer_->AddObservedWindow(target_window); | 597 window_bounds_observer_->AddObservedWindow(target_window); |
| 579 } | 598 } |
| 580 | 599 |
| 581 } // namespace keyboard | 600 } // namespace keyboard |
| OLD | NEW |