• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/ui/views/frame/browser_frame_gtk.h"
6 
7 #include "base/logging.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/themes/theme_service.h"
10 #include "chrome/browser/themes/theme_service_factory.h"
11 #include "chrome/browser/ui/status_bubble.h"
12 #include "chrome/browser/ui/views/frame/app_panel_browser_frame_view.h"
13 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
14 #include "chrome/browser/ui/views/frame/browser_root_view.h"
15 #include "chrome/browser/ui/views/frame/browser_view.h"
16 #include "ui/gfx/font.h"
17 #include "views/widget/root_view.h"
18 #include "views/window/hit_test.h"
19 
20 #if !defined(OS_CHROMEOS)
21 // static (Factory method.)
Create(BrowserView * browser_view,Profile * profile)22 BrowserFrame* BrowserFrame::Create(BrowserView* browser_view,
23                                    Profile* profile) {
24   BrowserFrameGtk* frame = new BrowserFrameGtk(browser_view, profile);
25   frame->InitBrowserFrame();
26   return frame;
27 }
28 #endif
29 
30 // static
GetTitleFont()31 const gfx::Font& BrowserFrame::GetTitleFont() {
32   static gfx::Font *title_font = new gfx::Font();
33   return *title_font;
34 }
35 
BrowserFrameGtk(BrowserView * browser_view,Profile * profile)36 BrowserFrameGtk::BrowserFrameGtk(BrowserView* browser_view, Profile* profile)
37     : BrowserFrame(browser_view),
38       WindowGtk(browser_view),
39       ALLOW_THIS_IN_INITIALIZER_LIST(delegate_(this)),
40       browser_view_(browser_view) {
41   set_native_browser_frame(this);
42   browser_view_->set_frame(this);
43   non_client_view()->SetFrameView(CreateFrameViewForWindow());
44 }
45 
~BrowserFrameGtk()46 BrowserFrameGtk::~BrowserFrameGtk() {
47 }
48 
InitBrowserFrame()49 void BrowserFrameGtk::InitBrowserFrame() {
50   WindowGtk::InitWindow(NULL, gfx::Rect());
51   // Don't focus anything on creation, selecting a tab will set the focus.
52 }
53 
54 ////////////////////////////////////////////////////////////////////////////////
55 // BrowserFrameGtk, NativeBrowserFrame implementation:
56 
AsNativeWindow()57 views::NativeWindow* BrowserFrameGtk::AsNativeWindow() {
58   return this;
59 }
60 
AsNativeWindow() const61 const views::NativeWindow* BrowserFrameGtk::AsNativeWindow() const {
62   return this;
63 }
64 
CreateBrowserNonClientFrameView()65 BrowserNonClientFrameView* BrowserFrameGtk::CreateBrowserNonClientFrameView() {
66   return browser::CreateBrowserNonClientFrameView(this, browser_view_);
67 }
68 
GetMinimizeButtonOffset() const69 int BrowserFrameGtk::GetMinimizeButtonOffset() const {
70   NOTIMPLEMENTED();
71   return 0;
72 }
73 
GetThemeProviderForFrame() const74 ThemeProvider* BrowserFrameGtk::GetThemeProviderForFrame() const {
75   // This is implemented for a different interface than GetThemeProvider is,
76   // but they mean the same things.
77   return GetThemeProvider();
78 }
79 
AlwaysUseNativeFrame() const80 bool BrowserFrameGtk::AlwaysUseNativeFrame() const {
81   return false;
82 }
83 
TabStripDisplayModeChanged()84 void BrowserFrameGtk::TabStripDisplayModeChanged() {
85   if (GetRootView()->has_children()) {
86     // Make sure the child of the root view gets Layout again.
87     GetRootView()->GetChildViewAt(0)->InvalidateLayout();
88   }
89   GetRootView()->Layout();
90 }
91 
92 ////////////////////////////////////////////////////////////////////////////////
93 // BrowserFrameGtk, WindowGtk overrides :
94 
GetThemeProvider() const95 ThemeProvider* BrowserFrameGtk::GetThemeProvider() const {
96   return ThemeServiceFactory::GetForProfile(
97       browser_view_->browser()->profile());
98 }
99 
SetInitialFocus()100 void BrowserFrameGtk::SetInitialFocus() {
101   browser_view_->RestoreFocus();
102 }
103 
CreateRootView()104 views::RootView* BrowserFrameGtk::CreateRootView() {
105   return delegate_->DelegateCreateRootView();
106 }
107 
GetAccelerator(int cmd_id,ui::Accelerator * accelerator)108 bool BrowserFrameGtk::GetAccelerator(int cmd_id,
109                                      ui::Accelerator* accelerator) {
110   return browser_view_->GetAccelerator(cmd_id, accelerator);
111 }
112 
CreateFrameViewForWindow()113 views::NonClientFrameView* BrowserFrameGtk::CreateFrameViewForWindow() {
114   return delegate_->DelegateCreateFrameViewForWindow();
115 }
116 
OnWindowStateEvent(GtkWidget * widget,GdkEventWindowState * event)117 gboolean BrowserFrameGtk::OnWindowStateEvent(GtkWidget* widget,
118                                              GdkEventWindowState* event) {
119   bool was_full_screen = IsFullscreen();
120   gboolean result = views::WindowGtk::OnWindowStateEvent(widget, event);
121   if ((!IsVisible() || IsMinimized()) && browser_view_->GetStatusBubble()) {
122     // The window is effectively hidden. We have to hide the status bubble as
123     // unlike windows gtk has no notion of child windows that are hidden along
124     // with the parent.
125     browser_view_->GetStatusBubble()->Hide();
126   }
127   if (was_full_screen != IsFullscreen())
128     browser_view_->FullScreenStateChanged();
129   return result;
130 }
131 
OnConfigureEvent(GtkWidget * widget,GdkEventConfigure * event)132 gboolean BrowserFrameGtk::OnConfigureEvent(GtkWidget* widget,
133                                            GdkEventConfigure* event) {
134   browser_view_->WindowMoved();
135   return views::WindowGtk::OnConfigureEvent(widget, event);
136 }
137