Chromium Code Reviews| Index: ui/views/win/hwnd_message_handler.cc | 
| diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc | 
| index ec631af3b840741db1404d454ad652586b11bc25..1159db0656c03bbec4b7e576b8b2ddbef90dde0d 100644 | 
| --- a/ui/views/win/hwnd_message_handler.cc | 
| +++ b/ui/views/win/hwnd_message_handler.cc | 
| @@ -2230,6 +2230,27 @@ void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) { | 
| GetMonitorAndRects(window_rect, &monitor, &monitor_rect, &work_area)) { | 
| bool work_area_changed = (monitor_rect == last_monitor_rect_) && | 
| (work_area != last_work_area_); | 
| + const bool same_monitor = monitor && (monitor == last_monitor_); | 
| 
 
ananta
2016/10/06 19:59:57
If a monitor is attached or detached, do we get a
 
atimoxin
2016/10/07 15:27:22
Yes, we get this message, but we get it before the
 
 | 
| + | 
| + gfx::Rect expected_maximized_bounds = work_area; | 
| + if (IsMaximized()) { | 
| + // Windows automatically adds a standard width border to all sides when | 
| + // window is maximized. We should take this into account. | 
| + gfx::Insets client_area_insets; | 
| + if (GetClientAreaInsets(&client_area_insets)) | 
| + expected_maximized_bounds.Inset(client_area_insets.Scale(-1)); | 
| + } | 
| + // Sometimes Windows incorrectly changes bounds of maximized windows after | 
| + // attaching or detaching additional displays. In this case user can see | 
| + // non-client area of the window (that should be hidden in normal case). | 
| + // We should restore window position if problem occurs. | 
| + const bool incorrect_maximized_bounds = | 
| + IsMaximized() && | 
| + (expected_maximized_bounds.x() != window_pos->x || | 
| + expected_maximized_bounds.y() != window_pos->y || | 
| + expected_maximized_bounds.width() != window_pos->cx || | 
| + expected_maximized_bounds.height() != window_pos->cy); | 
| + | 
| // If the size of a background fullscreen window changes again, then we | 
| // should reset the |background_fullscreen_hack_| flag. | 
| if (background_fullscreen_hack_ && | 
| @@ -2237,9 +2258,11 @@ void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) { | 
| (monitor_rect.height() - window_pos->cy != 1))) { | 
| background_fullscreen_hack_ = false; | 
| } | 
| - if (monitor && (monitor == last_monitor_) && | 
| - ((IsFullscreen() && !background_fullscreen_hack_) || | 
| - work_area_changed)) { | 
| + const bool fullscreen_without_hack = | 
| + IsFullscreen() && !background_fullscreen_hack_; | 
| + | 
| + if (incorrect_maximized_bounds || | 
| + (same_monitor && (fullscreen_without_hack || work_area_changed))) { | 
| // A rect for the monitor we're on changed. Normally Windows notifies | 
| // us about this (and thus we're reaching here due to the SetWindowPos() | 
| // call in OnSettingChange() above), but with some software (e.g. | 
| @@ -2252,9 +2275,7 @@ void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) { | 
| if (IsFullscreen()) { | 
| new_window_rect = monitor_rect; | 
| } else if (IsMaximized()) { | 
| - new_window_rect = work_area; | 
| - int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME); | 
| - new_window_rect.Inset(-border_thickness, -border_thickness); | 
| + new_window_rect = expected_maximized_bounds; | 
| } else { | 
| new_window_rect = gfx::Rect(window_rect); | 
| new_window_rect.AdjustToFit(work_area); |