summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.cc37
-rw-r--r--chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.h9
-rw-r--r--ui/views/win/hwnd_message_handler.cc15
-rw-r--r--ui/views/win/hwnd_message_handler.h3
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);
};