From a190495df3b6f1c8db323d87b36672aa7dcb2024 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 4 Aug 2016 10:58:59 -0700 Subject: [PATCH] Use bounds for converting window/content sizes --- atom/browser/native_window.cc | 40 +++++++++++++++++++---------- atom/browser/native_window.h | 8 +++--- atom/browser/native_window_mac.h | 5 ++-- atom/browser/native_window_mac.mm | 39 ++++++++++++---------------- atom/browser/native_window_views.cc | 40 +++++++++++++++-------------- atom/browser/native_window_views.h | 4 +-- 6 files changed, 72 insertions(+), 64 deletions(-) diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index d6f8dcf3cb4..e345c6ecb25 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -219,34 +219,46 @@ gfx::Point NativeWindow::GetPosition() { } void NativeWindow::SetContentSize(const gfx::Size& size, bool animate) { - SetSize(ContentSizeToWindowSize(size), animate); + SetSize(ContentBoundsToWindowBounds(gfx::Rect(size)).size(), animate); } gfx::Size NativeWindow::GetContentSize() { - return WindowSizeToContentSize(GetSize()); + return GetContentBounds().size(); +} + +gfx::Rect NativeWindow::GetContentBounds() { + return WindowBoundsToContentBounds(GetBounds()); } void NativeWindow::SetSizeConstraints( const extensions::SizeConstraints& window_constraints) { extensions::SizeConstraints content_constraints(GetContentSizeConstraints()); - if (window_constraints.HasMaximumSize()) - content_constraints.set_maximum_size( - WindowSizeToContentSize(window_constraints.GetMaximumSize())); - if (window_constraints.HasMinimumSize()) - content_constraints.set_minimum_size( - WindowSizeToContentSize(window_constraints.GetMinimumSize())); + if (window_constraints.HasMaximumSize()) { + gfx::Rect max_bounds = WindowBoundsToContentBounds( + gfx::Rect(window_constraints.GetMaximumSize())); + content_constraints.set_maximum_size(max_bounds.size()); + } + if (window_constraints.HasMinimumSize()) { + gfx::Rect min_bounds = WindowBoundsToContentBounds( + gfx::Rect(window_constraints.GetMinimumSize())); + content_constraints.set_minimum_size(min_bounds.size()); + } SetContentSizeConstraints(content_constraints); } extensions::SizeConstraints NativeWindow::GetSizeConstraints() { extensions::SizeConstraints content_constraints = GetContentSizeConstraints(); extensions::SizeConstraints window_constraints; - if (content_constraints.HasMaximumSize()) - window_constraints.set_maximum_size( - ContentSizeToWindowSize(content_constraints.GetMaximumSize())); - if (content_constraints.HasMinimumSize()) - window_constraints.set_minimum_size( - ContentSizeToWindowSize(content_constraints.GetMinimumSize())); + if (content_constraints.HasMaximumSize()) { + gfx::Rect max_bounds = ContentBoundsToWindowBounds( + gfx::Rect(content_constraints.GetMaximumSize())); + content_constraints.set_maximum_size(max_bounds.size()); + } + if (content_constraints.HasMinimumSize()) { + gfx::Rect min_bounds = ContentBoundsToWindowBounds( + gfx::Rect(content_constraints.GetMinimumSize())); + window_constraints.set_minimum_size(min_bounds.size()); + } return window_constraints; } diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 285a37a1bd9..84663ead627 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -91,7 +91,7 @@ class NativeWindow : public base::SupportsUserData, virtual gfx::Point GetPosition(); virtual void SetContentSize(const gfx::Size& size, bool animate = false); virtual gfx::Size GetContentSize(); - virtual gfx::Rect GetContentBounds() = 0; + virtual gfx::Rect GetContentBounds(); virtual void SetSizeConstraints( const extensions::SizeConstraints& size_constraints); virtual extensions::SizeConstraints GetSizeConstraints(); @@ -239,9 +239,9 @@ class NativeWindow : public base::SupportsUserData, std::unique_ptr DraggableRegionsToSkRegion( const std::vector& regions); - // Converts between content size to window size. - virtual gfx::Size ContentSizeToWindowSize(const gfx::Size& size) = 0; - virtual gfx::Size WindowSizeToContentSize(const gfx::Size& size) = 0; + // Converts between content bounds and window bounds. + virtual gfx::Rect ContentBoundsToWindowBounds(const gfx::Rect& bounds) = 0; + virtual gfx::Rect WindowBoundsToContentBounds(const gfx::Rect& bounds) = 0; // Called when the window needs to update its draggable region. virtual void UpdateDraggableRegions( diff --git a/atom/browser/native_window_mac.h b/atom/browser/native_window_mac.h index e6ffceef854..ab5645cc080 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -46,7 +46,6 @@ class NativeWindowMac : public NativeWindow { bool IsFullscreen() const override; void SetBounds(const gfx::Rect& bounds, bool animate = false) override; gfx::Rect GetBounds() override; - gfx::Rect GetContentBounds() override; void SetContentSizeConstraints( const extensions::SizeConstraints& size_constraints) override; void SetResizable(bool resizable) override; @@ -115,8 +114,8 @@ class NativeWindowMac : public NativeWindow { private: // NativeWindow: - gfx::Size ContentSizeToWindowSize(const gfx::Size& size) override; - gfx::Size WindowSizeToContentSize(const gfx::Size& size) override; + gfx::Rect ContentBoundsToWindowBounds(const gfx::Rect& bounds); + gfx::Rect WindowBoundsToContentBounds(const gfx::Rect& bounds); void UpdateDraggableRegions( const std::vector& regions) override; diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 47b02525256..d96d3aeeaba 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -753,14 +753,6 @@ gfx::Rect NativeWindowMac::GetBounds() { return bounds; } -gfx::Rect NativeWindowMac::GetContentBounds() { - NSRect frame = [window_ convertRectToScreen:[[window_ contentView] frame]]; - gfx::Rect bounds(frame.origin.x, 0, NSWidth(frame), NSHeight(frame)); - NSScreen* screen = [[NSScreen screens] objectAtIndex:0]; - bounds.set_y(NSHeight([screen frame]) - NSMaxY(frame)); - return bounds; -} - void NativeWindowMac::SetContentSizeConstraints( const extensions::SizeConstraints& size_constraints) { auto convertSize = [this](const gfx::Size& size) { @@ -1051,22 +1043,25 @@ std::vector NativeWindowMac::CalculateNonDraggableRegions( return result; } -gfx::Size NativeWindowMac::ContentSizeToWindowSize(const gfx::Size& size) { - if (!has_frame()) - return size; - - NSRect content = NSMakeRect(0, 0, size.width(), size.height()); - NSRect frame = [window_ frameRectForContentRect:content]; - return gfx::Size(frame.size); +gfx::Rect NativeWindowMac::ContentBoundsToWindowBounds( + const gfx::Rect& bounds) { + if (has_frame()) + return gfx::Rect([window_ frameRectForContentRect:bounds.ToCGRect()]); + else + return bounds; } -gfx::Size NativeWindowMac::WindowSizeToContentSize(const gfx::Size& size) { - if (!has_frame()) - return size; - - NSRect frame = NSMakeRect(0, 0, size.width(), size.height()); - NSRect content = [window_ contentRectForFrameRect:frame]; - return gfx::Size(content.size); +gfx::Rect NativeWindowMac::WindowBoundsToContentBounds( + const gfx::Rect& bounds) { + if (has_frame()) { + gfx::Rect content_bounds( + [window_ contentRectForFrameRect:bounds.ToCGRect()]); + int frame_height = bounds.height() - content_bounds.height(); + content_bounds.set_y(content_bounds.y() + frame_height); + return content_bounds; + } else { + return bounds; + } } void NativeWindowMac::UpdateDraggableRegions( diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 3fd88f59215..bb5455fddcd 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -316,7 +316,7 @@ NativeWindowViews::NativeWindowViews( if (has_frame() && options.Get(options::kUseContentSize, &use_content_size_) && use_content_size_) - size = ContentSizeToWindowSize(size); + size = ContentBoundsToWindowBounds(gfx::Rect(size)).size(); window_->CenterWindow(size); Layout(); @@ -1150,47 +1150,49 @@ void NativeWindowViews::OnWidgetMove() { NotifyWindowMove(); } -gfx::Size NativeWindowViews::ContentSizeToWindowSize(const gfx::Size& size) { +gfx::Rect NativeWindowViews::ContentBoundsToWindowBounds( + const gfx::Rect& bounds) { if (!has_frame()) - return size; + return bounds; - gfx::Size window_size(size); + gfx::Rect window_bounds(bounds); #if defined(OS_WIN) HWND hwnd = GetAcceleratedWidget(); - gfx::Rect dpi_bounds = gfx::Rect( - gfx::Point(), display::win::ScreenWin::DIPToScreenSize(hwnd, size)); - gfx::Rect window_bounds = display::win::ScreenWin::ScreenToDIPRect( + gfx::Rect dpi_bounds = display::win::ScreenWin::DIPToScreenRect(hwnd, bounds); + window_bounds = display::win::ScreenWin::ScreenToDIPRect( hwnd, window_->non_client_view()->GetWindowBoundsForClientBounds(dpi_bounds)); - window_size = window_bounds.size(); #endif if (menu_bar_ && menu_bar_visible_) - window_size.set_height(window_size.height() + kMenuBarHeight); - return window_size; + window_bounds.set_height(window_bounds.height() + kMenuBarHeight); + return window_bounds; } -gfx::Size NativeWindowViews::WindowSizeToContentSize(const gfx::Size& size) { +gfx::Rect NativeWindowViews::WindowBoundsToContentBounds( + const gfx::Rect& bounds) { if (!has_frame()) - return size; + return bounds; - gfx::Size content_size(size); + gfx::Rect content_bounds(bounds); #if defined(OS_WIN) HWND hwnd = GetAcceleratedWidget(); - content_size = display::win::ScreenWin::DIPToScreenSize(hwnd, content_size); + content_bounds.set_size( + display::win::ScreenWin::DIPToScreenSize(hwnd, content_bounds.size())); RECT rect; SetRectEmpty(&rect); DWORD style = ::GetWindowLong(hwnd, GWL_STYLE); DWORD ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE); AdjustWindowRectEx(&rect, style, FALSE, ex_style); - content_size.set_width(content_size.width() - (rect.right - rect.left)); - content_size.set_height(content_size.height() - (rect.bottom - rect.top)); - content_size = display::win::ScreenWin::ScreenToDIPSize(hwnd, content_size); + content_bounds.set_width(content_bounds.width() - (rect.right - rect.left)); + content_bounds.set_height(content_bounds.height() - (rect.bottom - rect.top)); + content_bounds.set_size( + display::win::ScreenWin::ScreenToDIPSize(hwnd, content_bounds.size())); #endif if (menu_bar_ && menu_bar_visible_) - content_size.set_height(content_size.height() - kMenuBarHeight); - return content_size; + content_bounds.set_height(content_bounds.height() - kMenuBarHeight); + return content_bounds; } void NativeWindowViews::HandleKeyboardEvent( diff --git a/atom/browser/native_window_views.h b/atom/browser/native_window_views.h index f7619053812..51b00e8831f 100644 --- a/atom/browser/native_window_views.h +++ b/atom/browser/native_window_views.h @@ -165,8 +165,8 @@ class NativeWindowViews : public NativeWindow, #endif // NativeWindow: - gfx::Size ContentSizeToWindowSize(const gfx::Size& size) override; - gfx::Size WindowSizeToContentSize(const gfx::Size& size) override; + gfx::Rect ContentBoundsToWindowBounds(const gfx::Rect& bounds) override; + gfx::Rect WindowBoundsToContentBounds(const gfx::Rect& bounds) override; void HandleKeyboardEvent( content::WebContents*, const content::NativeWebKeyboardEvent& event) override;