| Index: chrome/browser/ui/views/frame/browser_frame.cc
|
| ===================================================================
|
| --- chrome/browser/ui/views/frame/browser_frame.cc (revision 85284)
|
| +++ chrome/browser/ui/views/frame/browser_frame.cc (working copy)
|
| @@ -4,23 +4,53 @@
|
|
|
| #include "chrome/browser/ui/views/frame/browser_frame.h"
|
|
|
| +#include "base/command_line.h"
|
| +#include "chrome/browser/themes/theme_service.h"
|
| +#include "chrome/browser/themes/theme_service_factory.h"
|
| +#include "chrome/browser/ui/browser_list.h"
|
| #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
|
| #include "chrome/browser/ui/views/frame/browser_root_view.h"
|
| #include "chrome/browser/ui/views/frame/browser_view.h"
|
| #include "chrome/browser/ui/views/frame/native_browser_frame.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#include "ui/base/theme_provider.h"
|
| #include "views/widget/native_widget.h"
|
| #include "views/widget/widget.h"
|
| #include "views/window/native_window.h"
|
| #include "views/window/window.h"
|
|
|
| +#if defined(OS_WIN)
|
| +#include "chrome/browser/ui/views/frame/glass_browser_frame_view.h"
|
| +#endif
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // BrowserFrame, public:
|
|
|
| +BrowserFrame::BrowserFrame(BrowserView* browser_view)
|
| + : native_browser_frame_(NULL),
|
| + root_view_(NULL),
|
| + browser_frame_view_(NULL),
|
| + browser_view_(browser_view) {
|
| + browser_view_->set_frame(this);
|
| + set_is_secondary_widget(false);
|
| +}
|
| +
|
| BrowserFrame::~BrowserFrame() {
|
| }
|
|
|
| -views::Window* BrowserFrame::GetWindow() {
|
| - return native_browser_frame_->AsNativeWindow()->GetWindow();
|
| +void BrowserFrame::InitBrowserFrame() {
|
| + native_browser_frame_ =
|
| + NativeBrowserFrame::CreateNativeBrowserFrame(this, browser_view_);
|
| + views::Window::InitParams params(browser_view_);
|
| + params.native_window = native_browser_frame_->AsNativeWindow();
|
| + params.widget_init_params.native_widget =
|
| + params.native_window->AsNativeWidget();
|
| + InitWindow(params);
|
| +#if defined(OS_CHROMEOS)
|
| + // On ChromeOS we always want top-level windows to appear active.
|
| + if (!browser_view_->IsBrowserTypePopup())
|
| + DisableInactiveRendering();
|
| +#endif
|
| }
|
|
|
| int BrowserFrame::GetMinimizeButtonOffset() const {
|
| @@ -39,12 +69,20 @@
|
| browser_frame_view_->UpdateThrobber(running);
|
| }
|
|
|
| -ui::ThemeProvider* BrowserFrame::GetThemeProviderForFrame() const {
|
| - return native_browser_frame_->GetThemeProviderForFrame();
|
| -}
|
| +bool BrowserFrame::AlwaysUseNativeFrame() const {
|
| + // App panel windows draw their own frame.
|
| + if (browser_view_->IsBrowserTypePanel())
|
| + return false;
|
|
|
| -bool BrowserFrame::AlwaysUseNativeFrame() const {
|
| - return native_browser_frame_->AlwaysUseNativeFrame();
|
| + // 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() && ShouldUseNativeFrame())
|
| + return true;
|
| +
|
| + // Otherwise, we use the native frame when we're told we should by the theme
|
| + // provider (e.g. no custom theme is active).
|
| + return GetThemeProvider()->ShouldUseNativeFrame();
|
| }
|
|
|
| views::View* BrowserFrame::GetFrameView() const {
|
| @@ -52,32 +90,68 @@
|
| }
|
|
|
| void BrowserFrame::TabStripDisplayModeChanged() {
|
| + if (GetRootView()->has_children()) {
|
| + // Make sure the child of the root view gets Layout again.
|
| + GetRootView()->GetChildViewAt(0)->InvalidateLayout();
|
| + }
|
| + GetRootView()->Layout();
|
| native_browser_frame_->TabStripDisplayModeChanged();
|
| }
|
|
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserFrame, NativeBrowserFrameDelegate implementation:
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +// BrowserFrameWin, views::Window overrides:
|
|
|
| -views::RootView* BrowserFrame::DelegateCreateRootView() {
|
| +bool BrowserFrame::IsMaximized() const {
|
| +#if defined(OS_CHROMEOS)
|
| + if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeosFrame)) {
|
| + return !IsFullscreen() &&
|
| + (!browser_view_->IsBrowserTypePopup() || Window::IsMaximized());
|
| + }
|
| +#endif
|
| + return Window::IsMaximized();
|
| +}
|
| +
|
| +views::RootView* BrowserFrame::CreateRootView() {
|
| root_view_ = new BrowserRootView(
|
| browser_view_,
|
| native_browser_frame_->AsNativeWindow()->AsNativeWidget()->GetWidget());
|
| return root_view_;
|
| }
|
|
|
| -views::NonClientFrameView* BrowserFrame::DelegateCreateFrameViewForWindow() {
|
| - browser_frame_view_ =
|
| - native_browser_frame_->CreateBrowserNonClientFrameView();
|
| +views::NonClientFrameView* BrowserFrame::CreateFrameViewForWindow() {
|
| +#if defined(OS_WIN)
|
| + if (AlwaysUseNativeFrame()) {
|
| + browser_frame_view_ = new GlassBrowserFrameView(this, browser_view_);
|
| + } else {
|
| +#endif
|
| + browser_frame_view_ =
|
| + browser::CreateBrowserNonClientFrameView(this, browser_view_);
|
| +#if defined(OS_WIN)
|
| + }
|
| +#endif
|
| return browser_frame_view_;
|
| }
|
|
|
| +bool BrowserFrame::GetAccelerator(int command_id,
|
| + ui::Accelerator* accelerator) {
|
| + return browser_view_->GetAccelerator(command_id, accelerator);
|
| +}
|
|
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserFrame, protected:
|
| +ThemeProvider* BrowserFrame::GetThemeProvider() const {
|
| + return ThemeServiceFactory::GetForProfile(
|
| + browser_view_->browser()->profile());
|
| +}
|
|
|
| -BrowserFrame::BrowserFrame(BrowserView* browser_view)
|
| - : native_browser_frame_(NULL),
|
| - root_view_(NULL),
|
| - browser_frame_view_(NULL),
|
| - browser_view_(browser_view) {
|
| +void BrowserFrame::OnNativeWindowActivationChanged(bool active) {
|
| + if (active) {
|
| + // When running under remote desktop, if the remote desktop client is not
|
| + // active on the users desktop, then none of the windows contained in the
|
| + // remote desktop will be activated. However, WindowWin::Activate will
|
| + // still bring this browser window to the foreground. We explicitly set
|
| + // ourselves as the last active browser window to ensure that we get treated
|
| + // as such by the rest of Chrome.
|
| + BrowserList::SetLastActive(browser_view_->browser());
|
| + }
|
| + Window::OnNativeWindowActivationChanged(active);
|
| }
|
| +
|
|
|