Index: chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.cc |
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 |
deleted file mode 100644 |
index 9dae5194c3f193705e53946f2d3adc5766807654..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.cc |
+++ /dev/null |
@@ -1,334 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.h" |
- |
-#include <dwmapi.h> |
- |
-#include "chrome/browser/lifetime/application_lifetime.h" |
-#include "chrome/browser/themes/theme_service.h" |
-#include "chrome/browser/themes/theme_service_factory.h" |
-#include "chrome/browser/ui/views/frame/browser_frame.h" |
-#include "chrome/browser/ui/views/frame/browser_frame_common_win.h" |
-#include "chrome/browser/ui/views/frame/browser_view.h" |
-#include "chrome/browser/ui/views/frame/browser_window_property_manager_win.h" |
-#include "chrome/browser/ui/views/frame/system_menu_insertion_delegate_win.h" |
-#include "chrome/browser/ui/views/tabs/tab_strip.h" |
-#include "chrome/browser/ui/views/theme_image_mapper.h" |
-#include "grit/theme_resources.h" |
-#include "ui/base/theme_provider.h" |
-#include "ui/gfx/win/dpi.h" |
-#include "ui/views/controls/menu/native_menu_win.h" |
- |
-#pragma comment(lib, "dwmapi.lib") |
- |
-namespace { |
- |
-const int kClientEdgeThickness = 3; |
-// We need to offset the DWMFrame into the toolbar so that the blackness |
-// doesn't show up on our rounded corners. |
-const int kDWMFrameTopOffset = 3; |
- |
-// DesktopThemeProvider maps resource ids using MapThemeImage(). This is |
-// necessary for BrowserDesktopWindowTreeHostWin so that it uses the windows |
-// theme images rather than the ash theme images. |
-class DesktopThemeProvider : public ui::ThemeProvider { |
- public: |
- explicit DesktopThemeProvider(ui::ThemeProvider* delegate) |
- : delegate_(delegate) { |
- } |
- |
- virtual gfx::ImageSkia* GetImageSkiaNamed(int id) const OVERRIDE { |
- return delegate_->GetImageSkiaNamed( |
- chrome::MapThemeImage(chrome::HOST_DESKTOP_TYPE_NATIVE, id)); |
- } |
- virtual SkColor GetColor(int id) const OVERRIDE { |
- return delegate_->GetColor(id); |
- } |
- virtual int GetDisplayProperty(int id) const OVERRIDE { |
- return delegate_->GetDisplayProperty(id); |
- } |
- virtual bool ShouldUseNativeFrame() const OVERRIDE { |
- return delegate_->ShouldUseNativeFrame(); |
- } |
- virtual bool HasCustomImage(int id) const OVERRIDE { |
- return delegate_->HasCustomImage( |
- chrome::MapThemeImage(chrome::HOST_DESKTOP_TYPE_NATIVE, id)); |
- |
- } |
- virtual base::RefCountedMemory* GetRawData( |
- int id, |
- ui::ScaleFactor scale_factor) const OVERRIDE { |
- return delegate_->GetRawData(id, scale_factor); |
- } |
- |
- private: |
- ui::ThemeProvider* delegate_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DesktopThemeProvider); |
-}; |
- |
-} // namespace |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BrowserDesktopWindowTreeHostWin, public: |
- |
-BrowserDesktopWindowTreeHostWin::BrowserDesktopWindowTreeHostWin( |
- views::internal::NativeWidgetDelegate* native_widget_delegate, |
- views::DesktopNativeWidgetAura* desktop_native_widget_aura, |
- BrowserView* browser_view, |
- BrowserFrame* browser_frame) |
- : DesktopWindowTreeHostWin(native_widget_delegate, |
- desktop_native_widget_aura), |
- browser_view_(browser_view), |
- browser_frame_(browser_frame), |
- did_gdi_clear_(false) { |
- scoped_ptr<ui::ThemeProvider> theme_provider( |
- new DesktopThemeProvider(ThemeServiceFactory::GetForProfile( |
- browser_view->browser()->profile()))); |
- browser_frame->SetThemeProvider(theme_provider.Pass()); |
-} |
- |
-BrowserDesktopWindowTreeHostWin::~BrowserDesktopWindowTreeHostWin() { |
-} |
- |
-views::NativeMenuWin* BrowserDesktopWindowTreeHostWin::GetSystemMenu() { |
- if (!system_menu_.get()) { |
- SystemMenuInsertionDelegateWin insertion_delegate; |
- system_menu_.reset( |
- new views::NativeMenuWin(browser_frame_->GetSystemMenuModel(), |
- GetHWND())); |
- system_menu_->Rebuild(&insertion_delegate); |
- } |
- return system_menu_.get(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BrowserDesktopWindowTreeHostWin, BrowserDesktopWindowTreeHost implementation: |
- |
-views::DesktopWindowTreeHost* |
- BrowserDesktopWindowTreeHostWin::AsDesktopWindowTreeHost() { |
- return this; |
-} |
- |
-int BrowserDesktopWindowTreeHostWin::GetMinimizeButtonOffset() const { |
- return minimize_button_metrics_.GetMinimizeButtonOffsetX(); |
-} |
- |
-bool BrowserDesktopWindowTreeHostWin::UsesNativeSystemMenu() const { |
- return true; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BrowserDesktopWindowTreeHostWin, views::DesktopWindowTreeHostWin overrides: |
- |
-int BrowserDesktopWindowTreeHostWin::GetInitialShowState() const { |
- STARTUPINFO si = {0}; |
- si.cb = sizeof(si); |
- si.dwFlags = STARTF_USESHOWWINDOW; |
- GetStartupInfo(&si); |
- return si.wShowWindow; |
-} |
- |
-bool BrowserDesktopWindowTreeHostWin::GetClientAreaInsets( |
- gfx::Insets* insets) const { |
- // Use the default client insets for an opaque frame or a glass popup/app |
- // frame. |
- if (!GetWidget()->ShouldUseNativeFrame() || |
- !browser_view_->IsBrowserTypeNormal()) { |
- return false; |
- } |
- |
- int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME); |
- // In fullscreen mode, we have no frame. In restored mode, we draw our own |
- // client edge over part of the default frame. |
- if (GetWidget()->IsFullscreen()) |
- border_thickness = 0; |
- else if (!IsMaximized()) |
- border_thickness -= kClientEdgeThickness; |
- insets->Set(0, border_thickness, border_thickness, border_thickness); |
- return true; |
-} |
- |
-void BrowserDesktopWindowTreeHostWin::HandleCreate() { |
- DesktopWindowTreeHostWin::HandleCreate(); |
- browser_window_property_manager_ = |
- BrowserWindowPropertyManager::CreateBrowserWindowPropertyManager( |
- browser_view_); |
- if (browser_window_property_manager_) |
- browser_window_property_manager_->UpdateWindowProperties(GetHWND()); |
-} |
- |
-void BrowserDesktopWindowTreeHostWin::HandleFrameChanged() { |
- // Reinitialize the status bubble, since it needs to be initialized |
- // differently depending on whether or not DWM composition is enabled |
- browser_view_->InitStatusBubble(); |
- |
- // We need to update the glass region on or off before the base class adjusts |
- // the window region. |
- UpdateDWMFrame(); |
- DesktopWindowTreeHostWin::HandleFrameChanged(); |
-} |
- |
-bool BrowserDesktopWindowTreeHostWin::PreHandleMSG(UINT message, |
- WPARAM w_param, |
- LPARAM l_param, |
- LRESULT* result) { |
- switch (message) { |
- case WM_ACTIVATE: |
- if (LOWORD(w_param) != WA_INACTIVE) |
- minimize_button_metrics_.OnHWNDActivated(); |
- return false; |
- case WM_ENDSESSION: |
- chrome::SessionEnding(); |
- return true; |
- case WM_INITMENUPOPUP: |
- GetSystemMenu()->UpdateStates(); |
- return true; |
- } |
- return DesktopWindowTreeHostWin::PreHandleMSG( |
- message, w_param, l_param, result); |
-} |
- |
-void BrowserDesktopWindowTreeHostWin::PostHandleMSG(UINT message, |
- WPARAM w_param, |
- LPARAM l_param) { |
- switch (message) { |
- case WM_CREATE: |
- minimize_button_metrics_.Init(GetHWND()); |
- break; |
- case WM_WINDOWPOSCHANGED: { |
- UpdateDWMFrame(); |
- |
- // Windows lies to us about the position of the minimize button before a |
- // window is visible. We use this position to place the OTR avatar in RTL |
- // mode, so when the window is shown, we need to re-layout and schedule a |
- // paint for the non-client frame view so that the icon top has the correct |
- // position when the window becomes visible. This fixes bugs where the icon |
- // appears to overlay the minimize button. |
- // Note that we will call Layout every time SetWindowPos is called with |
- // SWP_SHOWWINDOW, however callers typically are careful about not |
- // specifying this flag unless necessary to avoid flicker. |
- // This may be invoked during creation on XP and before the non_client_view |
- // has been created. |
- WINDOWPOS* window_pos = reinterpret_cast<WINDOWPOS*>(l_param); |
- if (window_pos->flags & SWP_SHOWWINDOW && GetWidget()->non_client_view()) { |
- GetWidget()->non_client_view()->Layout(); |
- GetWidget()->non_client_view()->SchedulePaint(); |
- } |
- break; |
- } |
- case WM_ERASEBKGND: |
- if (!did_gdi_clear_ && DesktopWindowTreeHostWin::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 BrowserDesktopWindowTreeHostWin::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 |
- // frame for popups/apps. |
- if (!browser_view_->IsBrowserTypeNormal() && |
- !DesktopWindowTreeHostWin::IsUsingCustomFrame()) { |
- return false; |
- } |
- |
- // Otherwise, we use the native frame when we're told we should by the theme |
- // provider (e.g. no custom theme is active). |
- return !GetWidget()->GetThemeProvider()->ShouldUseNativeFrame(); |
-} |
- |
-bool BrowserDesktopWindowTreeHostWin::ShouldUseNativeFrame() const { |
- if (!views::DesktopWindowTreeHostWin::ShouldUseNativeFrame()) |
- return false; |
- // This function can get called when the Browser window is closed i.e. in the |
- // context of the BrowserView destructor. |
- if (!browser_view_->browser()) |
- return false; |
- return chrome::ShouldUseNativeFrame(browser_view_, |
- GetWidget()->GetThemeProvider()); |
-} |
- |
-void BrowserDesktopWindowTreeHostWin::FrameTypeChanged() { |
- views::DesktopWindowTreeHostWin::FrameTypeChanged(); |
- did_gdi_clear_ = false; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BrowserDesktopWindowTreeHostWin, private: |
- |
-void BrowserDesktopWindowTreeHostWin::UpdateDWMFrame() { |
- // For "normal" windows on Aero, we always need to reset the glass area |
- // correctly, even if we're not currently showing the native frame (e.g. |
- // because a theme is showing), so we explicitly check for that case rather |
- // than checking browser_frame_->ShouldUseNativeFrame() here. Using that here |
- // would mean we wouldn't reset the glass area to zero when moving from the |
- // native frame to an opaque frame, leading to graphical glitches behind the |
- // opaque frame. Instead, we use that function below to tell us whether the |
- // frame is currently native or opaque. |
- if (!GetWidget()->client_view() || !browser_view_->IsBrowserTypeNormal() || |
- !DesktopWindowTreeHostWin::ShouldUseNativeFrame()) |
- return; |
- |
- MARGINS margins = GetDWMFrameMargins(); |
- |
- DwmExtendFrameIntoClientArea(GetHWND(), &margins); |
-} |
- |
-MARGINS BrowserDesktopWindowTreeHostWin::GetDWMFrameMargins() const { |
- MARGINS margins = { 0 }; |
- |
- // If the opaque frame is visible, we use the default (zero) margins. |
- // Otherwise, we need to figure out how to extend the glass in. |
- if (GetWidget()->ShouldUseNativeFrame()) { |
- // In fullscreen mode, we don't extend glass into the client area at all, |
- // because the GDI-drawn text in the web content composited over it will |
- // become semi-transparent over any glass area. |
- if (!IsMaximized() && !GetWidget()->IsFullscreen()) { |
- margins.cxLeftWidth = kClientEdgeThickness + 1; |
- margins.cxRightWidth = kClientEdgeThickness + 1; |
- margins.cyBottomHeight = kClientEdgeThickness + 1; |
- margins.cyTopHeight = kClientEdgeThickness + 1; |
- } |
- // In maximized mode, we only have a titlebar strip of glass, no side/bottom |
- // borders. |
- if (!browser_view_->IsFullscreen()) { |
- gfx::Rect tabstrip_bounds( |
- browser_frame_->GetBoundsForTabStrip(browser_view_->tabstrip())); |
- tabstrip_bounds = gfx::win::DIPToScreenRect(tabstrip_bounds); |
- margins.cyTopHeight = tabstrip_bounds.bottom() + kDWMFrameTopOffset; |
- } |
- } |
- return margins; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BrowserDesktopWindowTreeHost, public: |
- |
-// static |
-BrowserDesktopWindowTreeHost* |
- BrowserDesktopWindowTreeHost::CreateBrowserDesktopWindowTreeHost( |
- views::internal::NativeWidgetDelegate* native_widget_delegate, |
- views::DesktopNativeWidgetAura* desktop_native_widget_aura, |
- BrowserView* browser_view, |
- BrowserFrame* browser_frame) { |
- return new BrowserDesktopWindowTreeHostWin(native_widget_delegate, |
- desktop_native_widget_aura, |
- browser_view, |
- browser_frame); |
-} |