1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
|
// Copyright (c) 2009 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.
#ifndef CHROME_BROWSER_GTK_BROWSER_WINDOW_GTK_H_
#define CHROME_BROWSER_GTK_BROWSER_WINDOW_GTK_H_
#include <gtk/gtk.h>
#include <map>
#include "base/gfx/rect.h"
#include "base/scoped_ptr.h"
#include "base/timer.h"
#include "build/build_config.h"
#include "chrome/browser/browser_window.h"
#include "chrome/browser/tabs/tab_strip_model.h"
#include "chrome/common/notification_registrar.h"
#include "chrome/common/pref_member.h"
#include "chrome/common/x11_util.h"
class BookmarkBarGtk;
class Browser;
class BrowserTitlebar;
class BrowserToolbarGtk;
class CustomDrawButton;
class DownloadShelfGtk;
class ExtensionShelfGtk;
class FindBarGtk;
class InfoBarContainerGtk;
class LocationBar;
class StatusBubbleGtk;
class TabContentsContainerGtk;
class TabStripGtk;
#ifdef OS_CHROMEOS
class PanelController;
#endif
// An implementation of BrowserWindow for GTK.
// Cross-platform code will interact with this object when
// it needs to manipulate the window.
class BrowserWindowGtk : public BrowserWindow,
public NotificationObserver,
public TabStripModelObserver {
public:
explicit BrowserWindowGtk(Browser* browser);
virtual ~BrowserWindowGtk();
Browser* browser() const { return browser_.get(); }
// Process a keyboard input and try to find an accelerator for it.
void HandleAccelerator(guint keyval, GdkModifierType modifier);
// Overridden from BrowserWindow
virtual void Show();
virtual void SetBounds(const gfx::Rect& bounds);
virtual void Close();
virtual void Activate();
virtual bool IsActive() const;
virtual void FlashFrame();
virtual gfx::NativeWindow GetNativeHandle();
virtual BrowserWindowTesting* GetBrowserWindowTesting();
virtual StatusBubble* GetStatusBubble();
virtual void SelectedTabToolbarSizeChanged(bool is_animating);
virtual void UpdateTitleBar();
virtual void UpdateDevTools();
virtual void FocusDevTools();
virtual void UpdateLoadingAnimations(bool should_animate);
virtual void SetStarredState(bool is_starred);
virtual gfx::Rect GetNormalBounds() const;
virtual bool IsMaximized() const;
virtual void SetFullscreen(bool fullscreen);
virtual bool IsFullscreen() const;
virtual LocationBar* GetLocationBar() const;
virtual void SetFocusToLocationBar();
virtual void UpdateStopGoState(bool is_loading, bool force);
virtual void UpdateToolbar(TabContents* contents,
bool should_restore_state);
virtual void FocusToolbar();
virtual bool IsBookmarkBarVisible() const;
virtual gfx::Rect GetRootWindowResizerRect() const;
virtual void ConfirmAddSearchProvider(const TemplateURL* template_url,
Profile* profile);
virtual void ToggleBookmarkBar();
virtual void ShowAboutChromeDialog();
virtual void ShowTaskManager();
virtual void ShowBookmarkManager();
virtual void ShowBookmarkBubble(const GURL& url, bool already_bookmarked);
virtual bool IsDownloadShelfVisible() const;
virtual DownloadShelf* GetDownloadShelf();
virtual void ShowReportBugDialog();
virtual void ShowClearBrowsingDataDialog();
virtual void ShowImportDialog();
virtual void ShowSearchEnginesDialog();
virtual void ShowPasswordManager();
virtual void ShowSelectProfileDialog();
virtual void ShowNewProfileDialog();
virtual void ConfirmBrowserCloseWithPendingDownloads();
virtual void ShowHTMLDialog(HtmlDialogUIDelegate* delegate,
gfx::NativeWindow parent_window);
virtual void UserChangedTheme();
virtual int GetExtraRenderViewHeight() const;
virtual void TabContentsFocused(TabContents* tab_contents);
virtual void ShowPageInfo(gfx::NativeView parent,
Profile* profile,
const GURL& url,
const NavigationEntry::SSLStatus& ssl,
bool show_history);
// Overridden from NotificationObserver:
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// Overridden from TabStripModelObserver:
virtual void TabDetachedAt(TabContents* contents, int index);
virtual void TabSelectedAt(TabContents* old_contents,
TabContents* new_contents,
int index,
bool user_gesture);
virtual void TabStripEmpty();
// Accessor for the tab strip.
TabStripGtk* tabstrip() const { return tabstrip_.get(); }
void UpdateDevToolsForContents(TabContents* contents);
void UpdateUIForContents(TabContents* contents);
void OnBoundsChanged(const gfx::Rect& bounds);
void OnStateChanged(GdkWindowState state);
// Returns false if we're not ready to close yet. E.g., a tab may have an
// onbeforeunload handler that prevents us from closing.
bool CanClose() const;
bool ShouldShowWindowIcon() const;
// Add the find bar widget to the window hierarchy.
void AddFindBar(FindBarGtk* findbar);
#if defined(OS_CHROMEOS)
// Sets whether a drag is active. If a drag is active the window will not
// close.
void set_drag_active(bool drag_active) { drag_active_ = drag_active; }
#endif
// Reset the mouse cursor to the default cursor if it was set to something
// else for the custom frame.
void ResetCustomFrameCursor();
// Returns the BrowserWindowGtk registered with |window|.
static BrowserWindowGtk* GetBrowserWindowForNativeWindow(
gfx::NativeWindow window);
// Retrieves the GtkWindow associated with |xid|, which is the X Window
// ID of the top-level X window of this object.
static GtkWindow* GetBrowserWindowForXID(XID xid);
Browser* browser() {
return browser_.get();
}
GtkWindow* window() { return window_; }
protected:
virtual void DestroyBrowser();
// Top level window.
GtkWindow* window_;
// GtkAlignment that holds the interior components of the chromium window.
GtkWidget* window_container_;
// VBox that holds everything below the tabs.
GtkWidget* content_vbox_;
// VBox that holds everything below the toolbar.
GtkWidget* render_area_vbox_;
scoped_ptr<Browser> browser_;
// The download shelf view (view at the bottom of the page).
scoped_ptr<DownloadShelfGtk> download_shelf_;
private:
// Show or hide the bookmark bar.
void MaybeShowBookmarkBar(TabContents* contents, bool animate);
// Show or hide the extension shelf.
void MaybeShowExtensionShelf();
// Sets the default size for the window and the the way the user is allowed to
// resize it.
void SetGeometryHints();
// Connect to signals on |window_|.
void ConnectHandlersToSignals();
// Create the various UI components.
void InitWidgets();
// Set up background color of the window (depends on if we're incognito or
// not).
void SetBackgroundColor();
// Called when the window size changed.
void OnSizeChanged(int width, int height);
// Applies the window shape to if we're in custom drawing mode.
void UpdateWindowShape(int width, int height);
// Connect accelerators that aren't connected to menu items (like ctrl-o,
// ctrl-l, etc.).
void ConnectAccelerators();
// Change whether we're showing the custom blue frame.
// Must be called once at startup.
// Triggers relayout of the content.
void UpdateCustomFrame();
// Save the window position in the prefs.
void SaveWindowPosition();
// Callback for when the custom frame alignment needs to be redrawn.
// The content area includes the toolbar and web page but not the tab strip.
static gboolean OnCustomFrameExpose(GtkWidget* widget, GdkEventExpose* event,
BrowserWindowGtk* window);
static gboolean OnGtkAccelerator(GtkAccelGroup* accel_group,
GObject* acceleratable,
guint keyval,
GdkModifierType modifier,
BrowserWindowGtk* browser_window);
// Mouse move and mouse button press callbacks.
static gboolean OnMouseMoveEvent(GtkWidget* widget,
GdkEventMotion* event,
BrowserWindowGtk* browser);
static gboolean OnButtonPressEvent(GtkWidget* widget,
GdkEventButton* event,
BrowserWindowGtk* browser);
// Maps and Unmaps the xid of |widget| to |window|.
static void MainWindowMapped(GtkWidget* widget, BrowserWindowGtk* window);
static void MainWindowUnMapped(GtkWidget* widget, BrowserWindowGtk* window);
// A small shim for browser_->ExecuteCommand.
void ExecuteBrowserCommand(int id);
// Callback for the loading animation(s) associated with this window.
void LoadingAnimationCallback();
// Shows UI elements for supported window features.
void ShowSupportedWindowFeatures();
// Hides UI elements for unsupported window features.
void HideUnsupportedWindowFeatures();
// Helper functions that query |browser_| concerning support for UI features
// in this window. (For example, a popup window might not support a tabstrip).
bool IsTabStripSupported();
bool IsToolbarSupported();
bool IsBookmarkBarSupported();
bool IsExtensionShelfSupported();
// Checks to see if the mouse pointer at |x|, |y| is over the border of the
// custom frame (a spot that should trigger a window resize). Returns true if
// it should and sets |edge|.
bool GetWindowEdge(int x, int y, GdkWindowEdge* edge);
NotificationRegistrar registrar_;
gfx::Rect bounds_;
GdkWindowState state_;
// Whether we are full screen. Since IsFullscreen() gets called before
// OnStateChanged(), we can't rely on |state_| & GDK_WINDOW_STATE_FULLSCREEN.
bool full_screen_;
// The container for the titlebar + tab strip.
scoped_ptr<BrowserTitlebar> titlebar_;
// The object that manages all of the widgets in the toolbar.
scoped_ptr<BrowserToolbarGtk> toolbar_;
// The object that manages the bookmark bar.
scoped_ptr<BookmarkBarGtk> bookmark_bar_;
// The object that manages the extension shelf.
scoped_ptr<ExtensionShelfGtk> extension_shelf_;
// The status bubble manager. Always non-NULL.
scoped_ptr<StatusBubbleGtk> status_bubble_;
// A container that manages the GtkWidget*s that are the webpage display
// (along with associated infobars, shelves, and other things that are part
// of the content area).
scoped_ptr<TabContentsContainerGtk> contents_container_;
// A container that manages the GtkWidget*s of developer tools for the
// selected tab contents.
scoped_ptr<TabContentsContainerGtk> devtools_container_;
// Split pane containing the contents_container_ and the devtools_container_.
GtkWidget* contents_split_;
// The tab strip. Always non-NULL.
scoped_ptr<TabStripGtk> tabstrip_;
// The container for info bars. Always non-NULL.
scoped_ptr<InfoBarContainerGtk> infobar_container_;
// The timer used to update frames for the Loading Animation.
base::RepeatingTimer<BrowserWindowGtk> loading_animation_timer_;
// Whether we're showing the custom chrome frame or the window manager
// decorations.
BooleanPrefMember use_custom_frame_;
#if defined(OS_CHROMEOS)
// True if a drag is active. See description above setter for details.
bool drag_active_;
// Controls interactions with the window manager for popup panels.
PanelController* panel_controller_;
#endif
// A map which translates an X Window ID into its respective GtkWindow.
static std::map<XID, GtkWindow*> xid_map_;
// The current window cursor. We set it to a resize cursor when over the
// custom frame border. We set it to NULL if we want the default cursor.
GdkCursor* frame_cursor_;
// True if the window manager thinks the window is active. Not all window
// managers keep track of this state (_NET_ACTIVE_WINDOW), in which case
// this will always be true.
bool is_active_;
DISALLOW_COPY_AND_ASSIGN(BrowserWindowGtk);
};
#endif // CHROME_BROWSER_GTK_BROWSER_WINDOW_GTK_H_
|