diff --git a/ui/keyboard/container_floating_behavior.cc b/ui/keyboard/container_floating_behavior.cc index caea5c6a923e4..9528083b2a647 100644 --- a/ui/keyboard/container_floating_behavior.cc +++ b/ui/keyboard/container_floating_behavior.cc @@ -245,7 +245,7 @@ void ContainerFloatingBehavior::HandlePointerEvent( const gfx::Point new_keyboard_location = drag_descriptor_->original_keyboard_location() + cumulative_drag_offset; - gfx::Rect new_bounds = + gfx::Rect new_bounds_in_local = gfx::Rect(new_keyboard_location, keyboard_bounds.size()); DisplayUtil display_util; @@ -254,17 +254,25 @@ void ContainerFloatingBehavior::HandlePointerEvent( current_display, current_drag_location); if (current_display.id() == new_display.id()) { - controller_->MoveKeyboard(new_bounds); + controller_->MoveKeyboard(new_bounds_in_local); } else { - new_bounds = - ContainKeyboardToScreenBounds(new_bounds, new_display.bounds()); // Since the keyboard has jumped across screens, cancel the current // drag descriptor as though the user has lifted their finger. drag_descriptor_ = nullptr; + gfx::Rect new_bounds_in_screen = + new_bounds_in_local + + current_display.bounds().origin().OffsetFromOrigin(); + gfx::Rect contained_new_bounds_in_screen = + ContainKeyboardToScreenBounds(new_bounds_in_screen, + new_display.bounds()); + // Enqueue a transition to the adjacent display. - // TODO(blakeo): pass new_bounds to display transition. - controller_->MoveToDisplayWithTransition(new_display); + new_bounds_in_local = + contained_new_bounds_in_screen - + new_display.bounds().origin().OffsetFromOrigin(); + controller_->MoveToDisplayWithTransition(new_display, + new_bounds_in_local); } SavePosition(container->bounds(), new_display.size()); } diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc index 38f787f0f6896..47668fba543d6 100644 --- a/ui/keyboard/keyboard_controller.cc +++ b/ui/keyboard/keyboard_controller.cc @@ -337,8 +337,11 @@ void KeyboardController::RemoveObserver(KeyboardControllerObserver* observer) { observer_list_.RemoveObserver(observer); } -void KeyboardController::MoveToDisplayWithTransition(display::Display display) { - queued_display_change_ = std::make_unique(display); +void KeyboardController::MoveToDisplayWithTransition( + display::Display display, + gfx::Rect new_bounds_in_local) { + queued_display_change_ = + std::make_unique(display, new_bounds_in_local); HideKeyboard(HIDE_REASON_AUTOMATIC); } @@ -410,6 +413,7 @@ void KeyboardController::HideAnimationFinished() { if (queued_display_change_) { ShowKeyboardInDisplay(queued_display_change_->new_display().id()); + container_->SetBounds(queued_display_change_->new_bounds_in_local()); queued_display_change_ = nullptr; } } diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h index df4b4127312b6..741d0921062b2 100644 --- a/ui/keyboard/keyboard_controller.h +++ b/ui/keyboard/keyboard_controller.h @@ -185,7 +185,8 @@ class KEYBOARD_EXPORT KeyboardController : public ui::InputMethodObserver, // Sets floating keyboard drggable rect. bool SetDraggableArea(const gfx::Rect& rect); - void MoveToDisplayWithTransition(display::Display display); + void MoveToDisplayWithTransition(display::Display display, + gfx::Rect new_bounds_in_local); private: // For access to Observer methods for simulation. diff --git a/ui/keyboard/queued_display_change.cc b/ui/keyboard/queued_display_change.cc index ccc1d2f197376..9ec3be6786f31 100644 --- a/ui/keyboard/queued_display_change.cc +++ b/ui/keyboard/queued_display_change.cc @@ -9,8 +9,9 @@ namespace keyboard { -QueuedDisplayChange::QueuedDisplayChange(const display::Display& display) - : new_display_(display){}; +QueuedDisplayChange::QueuedDisplayChange(const display::Display& display, + const gfx::Rect& new_bounds_in_local) + : new_display_(display), new_bounds_in_local_(new_bounds_in_local){}; QueuedDisplayChange::~QueuedDisplayChange(){}; diff --git a/ui/keyboard/queued_display_change.h b/ui/keyboard/queued_display_change.h index 527a0df98aae1..730072116ffd5 100644 --- a/ui/keyboard/queued_display_change.h +++ b/ui/keyboard/queued_display_change.h @@ -17,13 +17,16 @@ namespace keyboard { // something like QueuedVisualChange or similar. class QueuedDisplayChange { public: - QueuedDisplayChange(const display::Display& display_info); + QueuedDisplayChange(const display::Display& display, + const gfx::Rect& new_bounds_in_local); ~QueuedDisplayChange(); display::Display new_display() { return new_display_; } + gfx::Rect new_bounds_in_local() { return new_bounds_in_local_; } private: display::Display new_display_; + gfx::Rect new_bounds_in_local_; }; } // namespace keyboard