| Index: ui/views/mus/native_widget_mus.cc
|
| diff --git a/ui/views/mus/native_widget_mus.cc b/ui/views/mus/native_widget_mus.cc
|
| index e1fbfbb6ba41986f4d466af1eae58703ceead76c..959b656065b347cef0eaa371f17eed9ab0c75cd7 100644
|
| --- a/ui/views/mus/native_widget_mus.cc
|
| +++ b/ui/views/mus/native_widget_mus.cc
|
| @@ -907,7 +907,22 @@ void NativeWidgetMus::InitModalType(ui::ModalType modal_type) {
|
| }
|
|
|
| gfx::Rect NativeWidgetMus::GetWindowBoundsInScreen() const {
|
| - return window_ ? window_->GetBoundsInRoot() : gfx::Rect();
|
| + if (!window_)
|
| + return gfx::Rect();
|
| +
|
| + // Correct for the origin of the display.
|
| + const int64_t window_display_id = window_->GetRoot()->display_id();
|
| + for (display::Display display :
|
| + display::Screen::GetScreen()->GetAllDisplays()) {
|
| + if (display.id() == window_display_id) {
|
| + gfx::Point display_origin = display.bounds().origin();
|
| + gfx::Rect bounds_in_screen = window_->GetBoundsInRoot();
|
| + bounds_in_screen.Offset(display_origin.x(), display_origin.y());
|
| + return bounds_in_screen;
|
| + }
|
| + }
|
| + // Unknown display, assume primary display at 0,0.
|
| + return window_->GetBoundsInRoot();
|
| }
|
|
|
| gfx::Rect NativeWidgetMus::GetClientAreaBoundsInScreen() const {
|
| @@ -934,17 +949,26 @@ std::string NativeWidgetMus::GetWorkspace() const {
|
| return std::string();
|
| }
|
|
|
| -void NativeWidgetMus::SetBounds(const gfx::Rect& bounds) {
|
| +void NativeWidgetMus::SetBounds(const gfx::Rect& bounds_in_screen) {
|
| if (!(window_ && window_tree_host_))
|
| return;
|
|
|
| - gfx::Size size(bounds.size());
|
| + // TODO(jamescook): Needs something like aura::ScreenPositionClient so higher
|
| + // level code can move windows between displays. crbug.com/645291
|
| + gfx::Point origin(bounds_in_screen.origin());
|
| + const gfx::Point display_origin = display::Screen::GetScreen()
|
| + ->GetDisplayMatching(bounds_in_screen)
|
| + .bounds()
|
| + .origin();
|
| + origin.Offset(-display_origin.x(), -display_origin.y());
|
| +
|
| + gfx::Size size(bounds_in_screen.size());
|
| const gfx::Size min_size = GetMinimumSize();
|
| const gfx::Size max_size = GetMaximumSize();
|
| if (!max_size.IsEmpty())
|
| size.SetToMin(max_size);
|
| size.SetToMax(min_size);
|
| - window_->SetBounds(gfx::Rect(bounds.origin(), size));
|
| + window_->SetBounds(gfx::Rect(origin, size));
|
| // Observer on |window_tree_host_| expected to synchronously update bounds.
|
| DCHECK(window_->bounds() == window_tree_host_->GetBounds());
|
| }
|
|
|