Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Unified Diff: ui/views/win/hwnd_message_handler.cc

Issue 2379063003: Restore maximized window position after detaching display. (Closed)
Patch Set: Restore maximized window position after detaching display. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698