Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5405)

Unified Diff: chrome/browser/ui/views/frame/browser_desktop_root_window_host_win.cc

Issue 160573002: Move root_window_host* in aura to window_tree_host*. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
-}

Powered by Google App Engine
This is Rietveld 408576698