summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/views/frame/browser_frame.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/views/frame/browser_frame.cc')
-rw-r--r--chrome/browser/ui/views/frame/browser_frame.cc114
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);
}
+