| Index: chrome/browser/ui/views/frame/browser_frame_win.cc
|
| ===================================================================
|
| --- chrome/browser/ui/views/frame/browser_frame_win.cc (revision 143635)
|
| +++ chrome/browser/ui/views/frame/browser_frame_win.cc (working copy)
|
| @@ -6,7 +6,6 @@
|
|
|
| #include <dwmapi.h>
|
| #include <shellapi.h>
|
| -
|
| #include <set>
|
|
|
| #include "base/command_line.h"
|
| @@ -31,6 +30,7 @@
|
| #include "googleurl/src/gurl.h"
|
| #include "grit/generated_resources.h"
|
| #include "grit/theme_resources.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
| #include "ui/base/models/simple_menu_model.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| #include "ui/base/theme_provider.h"
|
| @@ -86,6 +86,20 @@
|
| return switcher_button;
|
| }
|
|
|
| +static int GetMinimizeButtonOffsetForWindow(gfx::NativeView window) {
|
| + // The WM_GETTITLEBARINFOEX message can fail if we are not active/visible.
|
| + TITLEBARINFOEX titlebar_info = {0};
|
| + titlebar_info.cbSize = sizeof(TITLEBARINFOEX);
|
| + SendMessage(window, WM_GETTITLEBARINFOEX, 0,
|
| + reinterpret_cast<WPARAM>(&titlebar_info));
|
| +
|
| + CPoint minimize_button_corner(titlebar_info.rgrect[2].left,
|
| + titlebar_info.rgrect[2].top);
|
| + MapWindowPoints(HWND_DESKTOP, window, &minimize_button_corner, 1);
|
| + return minimize_button_corner.x;
|
| +}
|
| +
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // BrowserFrameWin, public:
|
|
|
| @@ -95,7 +109,8 @@
|
| browser_view_(browser_view),
|
| browser_frame_(browser_frame),
|
| system_menu_delegate_(new SystemMenuModelDelegate(browser_view,
|
| - browser_view->browser())) {
|
| + browser_view->browser())),
|
| + cached_minimize_button_x_delta_(0) {
|
| if (base::win::IsMetroProcess()) {
|
| browser_view->SetWindowSwitcherButton(
|
| MakeWindowSwitcherButton(this, browser_view->IsOffTheRecord()));
|
| @@ -250,6 +265,12 @@
|
| views::NativeWidgetWin::Close();
|
| }
|
|
|
| +void BrowserFrameWin::OnActivate(UINT action, BOOL minimized, HWND window) {
|
| + if (action != WA_INACTIVE)
|
| + CacheMinimizeButtonDelta();
|
| + views::NativeWidgetWin::OnActivate(action, minimized, window);
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // BrowserFrameWin, NativeBrowserFrame implementation:
|
|
|
| @@ -275,15 +296,25 @@
|
| }
|
|
|
| int BrowserFrameWin::GetMinimizeButtonOffset() const {
|
| - TITLEBARINFOEX titlebar_info;
|
| - titlebar_info.cbSize = sizeof(TITLEBARINFOEX);
|
| - SendMessage(GetNativeView(), WM_GETTITLEBARINFOEX, 0, (WPARAM)&titlebar_info);
|
| + int minimize_button_offset =
|
| + GetMinimizeButtonOffsetForWindow(GetNativeView());
|
|
|
| - CPoint minimize_button_corner(titlebar_info.rgrect[2].left,
|
| - titlebar_info.rgrect[2].top);
|
| - MapWindowPoints(HWND_DESKTOP, GetNativeView(), &minimize_button_corner, 1);
|
| + if (minimize_button_offset)
|
| + return minimize_button_offset;
|
|
|
| - return minimize_button_corner.x;
|
| + // If we fail to get the minimize button offset via the WM_GETTITLEBARINFOEX
|
| + // message then calculate and return this via the
|
| + // cached_minimize_button_x_delta_ member value. Please see
|
| + // CacheMinimizeButtonDelta() for more details.
|
| + DCHECK(cached_minimize_button_x_delta_);
|
| +
|
| + RECT client_rect = {0};
|
| + GetClientRect(&client_rect);
|
| +
|
| + if (base::i18n::IsRTL())
|
| + return cached_minimize_button_x_delta_;
|
| + else
|
| + return client_rect.right - cached_minimize_button_x_delta_;
|
| }
|
|
|
| void BrowserFrameWin::TabStripDisplayModeChanged() {
|
| @@ -505,7 +536,24 @@
|
| UTF8ToWide(current_tab->GetURL().spec()));
|
| }
|
|
|
| +void BrowserFrameWin::CacheMinimizeButtonDelta() {
|
| + int minimize_offset = GetMinimizeButtonOffsetForWindow(GetNativeView());
|
| + if (!minimize_offset)
|
| + return;
|
|
|
| + RECT rect = {0};
|
| + GetClientRect(&rect);
|
| + // Calculate and cache the value of the minimize button delta, i.e. the
|
| + // offset to be applied to the left or right edge of the client rect
|
| + // depending on whether the language is RTL or not.
|
| + // This cached value is only used if the WM_GETTITLEBARINFOEX message fails
|
| + // to get the offset of the minimize button.
|
| + if (base::i18n::IsRTL())
|
| + cached_minimize_button_x_delta_ = minimize_offset;
|
| + else
|
| + cached_minimize_button_x_delta_ = rect.right - minimize_offset;
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // BrowserFrame, public:
|
|
|
|
|