Browse Source

fix: window bounds not scaled from screen coordinates (#29162)

Samuel Maddock 3 years ago
parent
commit
d518b6abc8

+ 16 - 12
shell/browser/native_window_views.cc

@@ -82,19 +82,7 @@
 
 namespace electron {
 
-namespace {
-
 #if defined(OS_WIN)
-const LPCWSTR kUniqueTaskBarClassName = L"Shell_TrayWnd";
-
-void FlipWindowStyle(HWND handle, bool on, DWORD flag) {
-  DWORD style = ::GetWindowLong(handle, GWL_STYLE);
-  if (on)
-    style |= flag;
-  else
-    style &= ~flag;
-  ::SetWindowLong(handle, GWL_STYLE, style);
-}
 
 // Similar to the ones in display::win::ScreenWin, but with rounded values
 // These help to avoid problems that arise from unresizable windows where the
@@ -108,6 +96,22 @@ gfx::Rect ScreenToDIPRect(HWND hwnd, const gfx::Rect& pixel_bounds) {
   return dip_rect;
 }
 
+#endif
+
+namespace {
+
+#if defined(OS_WIN)
+const LPCWSTR kUniqueTaskBarClassName = L"Shell_TrayWnd";
+
+void FlipWindowStyle(HWND handle, bool on, DWORD flag) {
+  DWORD style = ::GetWindowLong(handle, GWL_STYLE);
+  if (on)
+    style |= flag;
+  else
+    style &= ~flag;
+  ::SetWindowLong(handle, GWL_STYLE, style);
+}
+
 gfx::Rect DIPToScreenRect(HWND hwnd, const gfx::Rect& pixel_bounds) {
   float scale_factor = display::win::ScreenWin::GetScaleFactorForHWND(hwnd);
   gfx::Rect screen_rect = ScaleToRoundedRect(pixel_bounds, scale_factor);

+ 4 - 0
shell/browser/native_window_views.h

@@ -35,6 +35,10 @@ class WindowStateWatcher;
 class EventDisabler;
 #endif
 
+#if defined(OS_WIN)
+gfx::Rect ScreenToDIPRect(HWND hwnd, const gfx::Rect& pixel_bounds);
+#endif
+
 class NativeWindowViews : public NativeWindow,
                           public views::WidgetObserver,
                           public ui::EventHandler {

+ 10 - 8
shell/browser/native_window_views_win.cc

@@ -260,11 +260,12 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
     case WM_SIZING: {
       is_resizing_ = true;
       bool prevent_default = false;
-      NotifyWindowWillResize(gfx::Rect(*reinterpret_cast<RECT*>(l_param)),
-                             &prevent_default);
+      gfx::Rect bounds = gfx::Rect(*reinterpret_cast<RECT*>(l_param));
+      HWND hwnd = GetAcceleratedWidget();
+      gfx::Rect dpi_bounds = ScreenToDIPRect(hwnd, bounds);
+      NotifyWindowWillResize(dpi_bounds, &prevent_default);
       if (prevent_default) {
-        ::GetWindowRect(GetAcceleratedWidget(),
-                        reinterpret_cast<RECT*>(l_param));
+        ::GetWindowRect(hwnd, reinterpret_cast<RECT*>(l_param));
         return true;  // Tells Windows that the Sizing is handled.
       }
       return false;
@@ -288,11 +289,12 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
     case WM_MOVING: {
       is_moving_ = true;
       bool prevent_default = false;
-      NotifyWindowWillMove(gfx::Rect(*reinterpret_cast<RECT*>(l_param)),
-                           &prevent_default);
+      gfx::Rect bounds = gfx::Rect(*reinterpret_cast<RECT*>(l_param));
+      HWND hwnd = GetAcceleratedWidget();
+      gfx::Rect dpi_bounds = ScreenToDIPRect(hwnd, bounds);
+      NotifyWindowWillMove(dpi_bounds, &prevent_default);
       if (!movable_ || prevent_default) {
-        ::GetWindowRect(GetAcceleratedWidget(),
-                        reinterpret_cast<RECT*>(l_param));
+        ::GetWindowRect(hwnd, reinterpret_cast<RECT*>(l_param));
         return true;  // Tells Windows that the Move is handled. If not true,
                       // frameless windows can be moved using
                       // -webkit-app-region: drag elements.