From fbc3bb872b0631e8655397e739b546287104470e Mon Sep 17 00:00:00 2001 From: Robo Date: Fri, 15 Nov 2019 09:28:11 -0800 Subject: [PATCH] fix: incorrect size of windows on differently scaled monitors (#21100) * Revert "fix: handle WM_GETMINMAXINFO instead of letting chromium do it (#19928)" This reverts commit 27ce6a9cd3445ce7c405fb3abebb472e7bc2bd0f. * fix: don't reset the width and height when correcting window placement --- shell/browser/native_window_views_win.cc | 42 ++++++++---------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/shell/browser/native_window_views_win.cc b/shell/browser/native_window_views_win.cc index 5421a377e91c..8215a6d3d34a 100644 --- a/shell/browser/native_window_views_win.cc +++ b/shell/browser/native_window_views_win.cc @@ -345,39 +345,23 @@ bool NativeWindowViews::PreHandleMSG(UINT message, return false; } case WM_GETMINMAXINFO: { - // We need to handle GETMINMAXINFO ourselves because chromium tries to - // get the scale factor of the window during it's version of this handler - // based on the window position, which is invalid at this point. The - // previous method of calling SetWindowPlacement fixed the window - // position for the scale factor calculation but broke other things. - MINMAXINFO* info = reinterpret_cast(l_param); + WINDOWPLACEMENT wp; + wp.length = sizeof(WINDOWPLACEMENT); - display::Display display = - display::Screen::GetScreen()->GetDisplayNearestPoint( - last_normal_placement_bounds_.origin()); + // We do this to work around a Windows bug, where the minimized Window + // would report that the closest display to it is not the one that it was + // previously on (but the leftmost one instead). We restore the position + // of the window during the restore operation, this way chromium can + // use the proper display to calculate the scale factor to use. + if (!last_normal_placement_bounds_.IsEmpty() && + GetWindowPlacement(GetAcceleratedWidget(), &wp)) { + wp.rcNormalPosition = last_normal_placement_bounds_.ToRECT(); + SetWindowPlacement(GetAcceleratedWidget(), &wp); - const gfx::Size widget_min_size = widget()->GetMinimumSize(); - const gfx::Size widget_max_size = widget()->GetMaximumSize(); - gfx::Size min_size = gfx::ScaleToCeiledSize( - ContentBoundsToWindowBounds(gfx::Rect(widget_min_size)).size(), - display.device_scale_factor()); - gfx::Size max_size = gfx::ScaleToCeiledSize( - ContentBoundsToWindowBounds(gfx::Rect(widget_max_size)).size(), - display.device_scale_factor()); - - info->ptMinTrackSize.x = min_size.width(); - info->ptMinTrackSize.y = min_size.height(); - if (widget_max_size.width() || widget_max_size.height()) { - if (!max_size.width()) - max_size.set_width(GetSystemMetrics(SM_CXMAXTRACK)); - if (!max_size.height()) - max_size.set_height(GetSystemMetrics(SM_CYMAXTRACK)); - info->ptMaxTrackSize.x = max_size.width(); - info->ptMaxTrackSize.y = max_size.height(); + last_normal_placement_bounds_ = gfx::Rect(); } - *result = 1; - return true; + return false; } case WM_NCCALCSIZE: { if (!has_frame() && w_param == TRUE) {