From e3ccb18696c3ddfc9dadd5dc4593bd9f5f88023b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 12 Dec 2014 09:04:43 -0800 Subject: [PATCH] win: Fix calculating window bounds on high DPI display --- atom/browser/native_window_views.cc | 8 ++++++++ atom/browser/ui/views/win_frame_view.cc | 14 +++----------- atom/browser/ui/views/win_frame_view.h | 2 -- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 9ee492aaa64f..8825371dc390 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -49,6 +49,7 @@ #include "base/win/scoped_comptr.h" #include "base/win/windows_version.h" #include "ui/base/win/shell.h" +#include "ui/gfx/win/dpi.h" #include "ui/views/win/hwnd_util.h" #endif @@ -837,8 +838,15 @@ void NativeWindowViews::RegisterAccelerators(ui::MenuModel* menu_model) { gfx::Rect NativeWindowViews::ContentBoundsToWindowBounds( const gfx::Rect& bounds) { +#if defined(OS_WIN) + gfx::Rect dpi_bounds = gfx::win::DIPToScreenRect(bounds); + gfx::Rect window_bounds = gfx::win::ScreenToDIPRect( + window_->non_client_view()->GetWindowBoundsForClientBounds(dpi_bounds)); +#else gfx::Rect window_bounds = window_->non_client_view()->GetWindowBoundsForClientBounds(bounds); +#endif + if (menu_bar_ && menu_bar_visible_) window_bounds.set_height(window_bounds.height() + kMenuBarHeight); return window_bounds; diff --git a/atom/browser/ui/views/win_frame_view.cc b/atom/browser/ui/views/win_frame_view.cc index e1ef9a018ed5..db74661932b7 100644 --- a/atom/browser/ui/views/win_frame_view.cc +++ b/atom/browser/ui/views/win_frame_view.cc @@ -27,9 +27,9 @@ WinFrameView::~WinFrameView() { gfx::Rect WinFrameView::GetWindowBoundsForClientBounds( const gfx::Rect& client_bounds) const { - gfx::Size size(client_bounds.size()); - ClientAreaSizeToWindowSize(&size); - return gfx::Rect(client_bounds.origin(), size); + return views::GetWindowBoundsForClientBounds( + static_cast(const_cast(this)), + client_bounds); } int WinFrameView::NonClientHitTest(const gfx::Point& point) { @@ -53,12 +53,4 @@ const char* WinFrameView::GetClassName() const { return kViewClassName; } -void WinFrameView::ClientAreaSizeToWindowSize(gfx::Size* size) const { - // AdjustWindowRect seems to return a wrong window size. - gfx::Size window = frame_->GetWindowBoundsInScreen().size(); - gfx::Size client = frame_->GetClientAreaBoundsInScreen().size(); - size->set_width(size->width() + window.width() - client.width()); - size->set_height(size->height() + window.height() - client.height()); -} - } // namespace atom diff --git a/atom/browser/ui/views/win_frame_view.h b/atom/browser/ui/views/win_frame_view.h index 43bab2c8f430..825677bff310 100644 --- a/atom/browser/ui/views/win_frame_view.h +++ b/atom/browser/ui/views/win_frame_view.h @@ -25,8 +25,6 @@ class WinFrameView : public FramelessView { const char* GetClassName() const override; private: - void ClientAreaSizeToWindowSize(gfx::Size* size) const; - DISALLOW_COPY_AND_ASSIGN(WinFrameView); };