diff options
Diffstat (limited to 'chrome/browser/ui/views/frame/browser_frame.cc')
-rw-r--r-- | chrome/browser/ui/views/frame/browser_frame.cc | 114 |
1 files changed, 94 insertions, 20 deletions
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc index 94d0fa7..0b0842e 100644 --- a/chrome/browser/ui/views/frame/browser_frame.cc +++ b/chrome/browser/ui/views/frame/browser_frame.cc @@ -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 @@ void BrowserFrame::UpdateThrobber(bool running) { browser_frame_view_->UpdateThrobber(running); } -ui::ThemeProvider* BrowserFrame::GetThemeProviderForFrame() const { - return native_browser_frame_->GetThemeProviderForFrame(); -} - bool BrowserFrame::AlwaysUseNativeFrame() const { - return native_browser_frame_->AlwaysUseNativeFrame(); + // App panel windows draw their own frame. + if (browser_view_->IsBrowserTypePanel()) + return false; + + // 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 @@ views::View* BrowserFrame::GetFrameView() const { } 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: + +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::DelegateCreateRootView() { +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); } + |