diff options
4 files changed, 43 insertions, 21 deletions
diff --git a/chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.cc b/chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.cc index 916fe65..bbd7f6f 100644 --- a/chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.cc +++ b/chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.cc @@ -83,7 +83,8 @@ BrowserDesktopRootWindowHostWin::BrowserDesktopRootWindowHostWin( desktop_native_widget_aura, initial_bounds), browser_view_(browser_view), - browser_frame_(browser_frame) { + browser_frame_(browser_frame), + did_gdi_clear_(false) { scoped_ptr<ui::ThemeProvider> theme_provider( new DesktopThemeProvider(ThemeServiceFactory::GetForProfile( browser_view->browser()->profile()))); @@ -189,7 +190,7 @@ void BrowserDesktopRootWindowHostWin::PostHandleMSG(UINT message, case WM_CREATE: minimize_button_metrics_.Init(GetHWND()); break; - case WM_WINDOWPOSCHANGED: + case WM_WINDOWPOSCHANGED: { UpdateDWMFrame(); // Windows lies to us about the position of the minimize button before a @@ -210,8 +211,26 @@ void BrowserDesktopRootWindowHostWin::PostHandleMSG(UINT message, } break; } + case WM_ERASEBKGND: + if (!did_gdi_clear_ && DesktopRootWindowHostWin::ShouldUseNativeFrame()) { + // This is necessary to avoid white flashing in the titlebar area around + // the minimize/maximize/close buttons. + HDC dc = GetDC(GetHWND()); + MARGINS margins = GetDWMFrameMargins(); + RECT client_rect; + GetClientRect(GetHWND(), &client_rect); + HBRUSH brush = CreateSolidBrush(0); + RECT rect = { 0, 0, client_rect.right, margins.cyTopHeight }; + FillRect(dc, &rect, brush); + DeleteObject(brush); + ReleaseDC(GetHWND(), dc); + did_gdi_clear_ = true; + } + break; + } } + bool BrowserDesktopRootWindowHostWin::IsUsingCustomFrame() const { // We don't theme popup or app windows, so regardless of whether or not a // theme is active for normal browser windows, we don't want to use the custom @@ -237,6 +256,11 @@ bool BrowserDesktopRootWindowHostWin::ShouldUseNativeFrame() { GetWidget()->GetThemeProvider()); } +void BrowserDesktopRootWindowHostWin::FrameTypeChanged() { + views::DesktopRootWindowHostWin::FrameTypeChanged(); + did_gdi_clear_ = false; +} + //////////////////////////////////////////////////////////////////////////////// // BrowserDesktopRootWindowHostWin, private: @@ -253,6 +277,12 @@ void BrowserDesktopRootWindowHostWin::UpdateDWMFrame() { !DesktopRootWindowHostWin::ShouldUseNativeFrame()) return; + MARGINS margins = GetDWMFrameMargins(); + + DwmExtendFrameIntoClientArea(GetHWND(), &margins); +} + +MARGINS BrowserDesktopRootWindowHostWin::GetDWMFrameMargins() const { MARGINS margins = { 0 }; // If the opaque frame is visible, we use the default (zero) margins. @@ -276,8 +306,7 @@ void BrowserDesktopRootWindowHostWin::UpdateDWMFrame() { margins.cyTopHeight = tabstrip_bounds.bottom() + kDWMFrameTopOffset; } } - - DwmExtendFrameIntoClientArea(GetHWND(), &margins); + return margins; } //////////////////////////////////////////////////////////////////////////////// diff --git a/chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.h b/chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.h index e0b6e44..8510d43 100644 --- a/chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.h +++ b/chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.h @@ -5,6 +5,9 @@ #ifndef CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_DESKTOP_ROOT_WINDOW_HOST_WIN_H_ #define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_DESKTOP_ROOT_WINDOW_HOST_WIN_H_ +#include <windows.h> +#include <uxtheme.h> + #include "ui/views/widget/desktop_aura/desktop_root_window_host_win.h" #include "chrome/browser/ui/views/frame/browser_desktop_root_window_host.h" #include "chrome/browser/ui/views/frame/minimize_button_metrics_win.h" @@ -49,9 +52,12 @@ class BrowserDesktopRootWindowHostWin : public BrowserDesktopRootWindowHost, LPARAM l_param) OVERRIDE; virtual bool IsUsingCustomFrame() const OVERRIDE; virtual bool ShouldUseNativeFrame() OVERRIDE; + virtual void FrameTypeChanged() OVERRIDE; void UpdateDWMFrame(); + MARGINS GetDWMFrameMargins() const; + BrowserView* browser_view_; BrowserFrame* browser_frame_; @@ -60,6 +66,9 @@ class BrowserDesktopRootWindowHostWin : public BrowserDesktopRootWindowHost, // The wrapped system menu itself. scoped_ptr<views::NativeMenuWin> system_menu_; + // Necessary to avoid corruption on NC paint in Aero mode. + bool did_gdi_clear_; + DISALLOW_COPY_AND_ASSIGN(BrowserDesktopRootWindowHostWin); }; diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index db09f9d..ba8f446 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc @@ -393,8 +393,7 @@ HWNDMessageHandler::HWNDMessageHandler(HWNDMessageHandlerDelegate* delegate) can_update_layered_window_(true), is_first_nccalc_(true), autohide_factory_(this), - id_generator_(0), - did_gdi_clear_(false) { + id_generator_(0) { } HWNDMessageHandler::~HWNDMessageHandler() { @@ -1376,18 +1375,6 @@ void HWNDMessageHandler::OnEnterSizeMove() { } LRESULT HWNDMessageHandler::OnEraseBkgnd(HDC dc) { - if (!did_gdi_clear_) { - // This is necessary (at least on Win8) to avoid white flashing in the - // titlebar area around the minimize/maximize/close buttons. - HDC dc = GetDC(hwnd()); - RECT client_rect; - GetClientRect(hwnd(), &client_rect); - HBRUSH brush = CreateSolidBrush(0); - FillRect(dc, &client_rect, brush); - DeleteObject(brush); - ReleaseDC(hwnd(), dc); - did_gdi_clear_ = true; - } // Needed to prevent resize flicker. return 1; } diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h index 902eec3..5ff3ffd 100644 --- a/ui/views/win/hwnd_message_handler.h +++ b/ui/views/win/hwnd_message_handler.h @@ -476,9 +476,6 @@ class VIEWS_EXPORT HWNDMessageHandler : // Generates touch-ids for touch-events. ui::SequentialIDGenerator id_generator_; - // Necessary to avoid corruption on NC paint in Aero mode. - bool did_gdi_clear_; - DISALLOW_COPY_AND_ASSIGN(HWNDMessageHandler); }; |