// Copyright (c) 2011 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_frame_gtk.h" #include "base/logging.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/ui/status_bubble.h" #include "chrome/browser/ui/views/frame/app_panel_browser_frame_view.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 "ui/gfx/font.h" #include "views/widget/root_view.h" #include "views/window/hit_test.h" #if !defined(OS_CHROMEOS) // static (Factory method.) BrowserFrame* BrowserFrame::Create(BrowserView* browser_view, Profile* profile) { BrowserFrameGtk* frame = new BrowserFrameGtk(browser_view, profile); frame->InitBrowserFrame(); return frame; } #endif // static const gfx::Font& BrowserFrame::GetTitleFont() { static gfx::Font *title_font = new gfx::Font(); return *title_font; } BrowserFrameGtk::BrowserFrameGtk(BrowserView* browser_view, Profile* profile) : BrowserFrame(browser_view), WindowGtk(browser_view), ALLOW_THIS_IN_INITIALIZER_LIST(delegate_(this)), browser_view_(browser_view) { set_native_browser_frame(this); browser_view_->set_frame(this); non_client_view()->SetFrameView(CreateFrameViewForWindow()); } BrowserFrameGtk::~BrowserFrameGtk() { } void BrowserFrameGtk::InitBrowserFrame() { WindowGtk::InitWindow(NULL, gfx::Rect()); // Don't focus anything on creation, selecting a tab will set the focus. } //////////////////////////////////////////////////////////////////////////////// // BrowserFrameGtk, NativeBrowserFrame implementation: views::NativeWindow* BrowserFrameGtk::AsNativeWindow() { return this; } const views::NativeWindow* BrowserFrameGtk::AsNativeWindow() const { return this; } BrowserNonClientFrameView* BrowserFrameGtk::CreateBrowserNonClientFrameView() { return browser::CreateBrowserNonClientFrameView(this, browser_view_); } int BrowserFrameGtk::GetMinimizeButtonOffset() const { NOTIMPLEMENTED(); return 0; } ThemeProvider* BrowserFrameGtk::GetThemeProviderForFrame() const { // This is implemented for a different interface than GetThemeProvider is, // but they mean the same things. return GetThemeProvider(); } bool BrowserFrameGtk::AlwaysUseNativeFrame() const { return false; } void BrowserFrameGtk::TabStripDisplayModeChanged() { if (GetRootView()->has_children()) { // Make sure the child of the root view gets Layout again. GetRootView()->GetChildViewAt(0)->InvalidateLayout(); } GetRootView()->Layout(); } //////////////////////////////////////////////////////////////////////////////// // BrowserFrameGtk, WindowGtk overrides : ThemeProvider* BrowserFrameGtk::GetThemeProvider() const { return ThemeServiceFactory::GetForProfile( browser_view_->browser()->profile()); } void BrowserFrameGtk::SetInitialFocus() { browser_view_->RestoreFocus(); } views::RootView* BrowserFrameGtk::CreateRootView() { return delegate_->DelegateCreateRootView(); } bool BrowserFrameGtk::GetAccelerator(int cmd_id, ui::Accelerator* accelerator) { return browser_view_->GetAccelerator(cmd_id, accelerator); } views::NonClientFrameView* BrowserFrameGtk::CreateFrameViewForWindow() { return delegate_->DelegateCreateFrameViewForWindow(); } gboolean BrowserFrameGtk::OnWindowStateEvent(GtkWidget* widget, GdkEventWindowState* event) { bool was_full_screen = IsFullscreen(); gboolean result = views::WindowGtk::OnWindowStateEvent(widget, event); if ((!IsVisible() || IsMinimized()) && browser_view_->GetStatusBubble()) { // The window is effectively hidden. We have to hide the status bubble as // unlike windows gtk has no notion of child windows that are hidden along // with the parent. browser_view_->GetStatusBubble()->Hide(); } if (was_full_screen != IsFullscreen()) browser_view_->FullScreenStateChanged(); return result; } gboolean BrowserFrameGtk::OnConfigureEvent(GtkWidget* widget, GdkEventConfigure* event) { browser_view_->WindowMoved(); return views::WindowGtk::OnConfigureEvent(widget, event); }