Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: chrome/browser/ui/gtk/browser_titlebar.h

Issue 231733005: Delete the GTK+ port of Chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remerge to ToT Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 // A helper class that contains the gtk widgets that make up the titlebar. The
6 // titlebar consists of the tabstrip and if the custom chrome frame is turned
7 // on, it includes the taller titlebar and minimize, restore, maximize, and
8 // close buttons.
9
10 #ifndef CHROME_BROWSER_UI_GTK_BROWSER_TITLEBAR_H_
11 #define CHROME_BROWSER_UI_GTK_BROWSER_TITLEBAR_H_
12
13 #include <gtk/gtk.h>
14
15 #include "base/compiler_specific.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/prefs/pref_member.h"
18 #include "chrome/browser/ui/gtk/titlebar_throb_animation.h"
19 #include "content/public/browser/notification_observer.h"
20 #include "content/public/browser/notification_registrar.h"
21 #include "ui/base/gtk/gtk_signal.h"
22 #include "ui/base/models/simple_menu_model.h"
23 #include "ui/base/x/active_window_watcher_x_observer.h"
24
25 class AvatarMenuButtonGtk;
26 class BrowserWindowGtk;
27 class CustomDrawButton;
28 class GtkThemeService;
29 class MenuGtk;
30 class PopupPageMenuModel;
31
32 namespace content {
33 class WebContents;
34 }
35
36 class BrowserTitlebar : public content::NotificationObserver,
37 public ui::ActiveWindowWatcherXObserver,
38 public ui::SimpleMenuModel::Delegate {
39 public:
40 // A default button order string for when we aren't asking gconf for the
41 // metacity configuration.
42 static const char kDefaultButtonString[];
43
44 BrowserTitlebar(BrowserWindowGtk* browser_window, GtkWindow* window);
45 virtual ~BrowserTitlebar();
46
47 // Updates the title and icon when in app or popup mode (no tabstrip).
48 void UpdateTitleAndIcon();
49
50 GtkWidget* widget() {
51 return container_;
52 }
53
54 void set_window(GtkWindow* window) { window_ = window; }
55
56 // Build the titlebar, the space above the tab strip, and (maybe) the min,
57 // max, close buttons. |container_| is the gtk container that we put the
58 // widget into.
59 void Init();
60
61 // Builds the buttons based on the metacity |button_string|.
62 void BuildButtons(const std::string& button_string);
63
64 // Update the appearance of the title bar based on whether we're showing a
65 // custom frame or not. If |use_custom_frame| is true, we show an extra
66 // tall titlebar and the min/max/close buttons.
67 void UpdateCustomFrame(bool use_custom_frame);
68
69 // Called by the browser asking us to update the loading throbber.
70 // |web_contents| is the tab that is associated with the window throbber.
71 // |web_contents| can be null.
72 void UpdateThrobber(content::WebContents* web_contents);
73
74 // On Windows, right clicking in the titlebar background brings up the system
75 // menu. There's no such thing on linux, so we just show the menu items we
76 // add to the menu.
77 void ShowContextMenu(GdkEventButton* event);
78
79 AvatarMenuButtonGtk* avatar_button() { return avatar_button_.get(); }
80
81 private:
82 class ContextMenuModel : public ui::SimpleMenuModel {
83 public:
84 explicit ContextMenuModel(ui::SimpleMenuModel::Delegate* delegate);
85 };
86
87 // Builds the button as denoted by |button_token|. Returns true if the button
88 // is created successfully.
89 bool BuildButton(const std::string& button_token, bool left_side);
90
91 // Retrieves the 3 image ids (IDR_) and a tooltip id (IDS) for the purpose of
92 // painting a CustomDraw button.
93 void GetButtonResources(const std::string& button_name,
94 int* normal_image_id,
95 int* pressed_image_id,
96 int* hover_image_id,
97 int* tooltip_id) const;
98
99 // Constructs a CustomDraw button given button name and left or right side of
100 // the titlebar where the button is placed.
101 CustomDrawButton* CreateTitlebarButton(const std::string& button_name,
102 bool left_side);
103
104 // Lazily builds and returns |titlebar_{left,right}_buttons_vbox_| and their
105 // subtrees. We do this lazily because in most situations, only one of them
106 // is allocated (though the user can (and do) manually mess with their gconf
107 // settings to get absolutely horrid combinations of buttons on both sides.
108 GtkWidget* GetButtonHBox(bool left_side);
109
110 // Updates the theme supplied background color and image.
111 void UpdateButtonBackground(CustomDrawButton* button);
112
113 // Updates the color of the title bar. Called whenever we have a state
114 // change in the window.
115 void UpdateTextColor();
116
117 // Updates the color of the avatar label text and background.
118 void UpdateAvatarLabel();
119
120 // Update the titlebar spacing based on the custom frame and maximized state.
121 void UpdateTitlebarAlignment();
122
123 // Updates the avatar image displayed, either a multi-profile avatar or the
124 // incognito spy guy.
125 void UpdateAvatar();
126
127 // The maximize button was clicked, take an action depending on which mouse
128 // button the user pressed.
129 void MaximizeButtonClicked();
130
131 // Updates the visibility of the maximize and restore buttons; only one can
132 // be visible at a time.
133 void UpdateMaximizeRestoreVisibility();
134
135 // Callback for changes to window state. This includes
136 // maximizing/restoring/minimizing the window.
137 CHROMEG_CALLBACK_1(BrowserTitlebar, gboolean, OnWindowStateChanged,
138 GtkWindow*, GdkEventWindowState*);
139
140 // Callback for mousewheel events.
141 CHROMEGTK_CALLBACK_1(BrowserTitlebar, gboolean, OnScroll,
142 GdkEventScroll*);
143
144 // Callback for min/max/close buttons.
145 CHROMEGTK_CALLBACK_0(BrowserTitlebar, void, OnButtonClicked);
146
147 // Callback for favicon/settings buttons.
148 CHROMEGTK_CALLBACK_1(BrowserTitlebar, gboolean,
149 OnFaviconMenuButtonPressed, GdkEventButton*);
150
151 // Callback for avatar menu label.
152 CHROMEGTK_CALLBACK_1(BrowserTitlebar, gboolean,
153 OnAvatarLabelButtonPressed, GdkEventButton*);
154
155 // -- Context Menu -----------------------------------------------------------
156
157 // SimpleMenuModel::Delegate implementation:
158 virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
159 virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
160 virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
161 virtual bool GetAcceleratorForCommandId(
162 int command_id,
163 ui::Accelerator* accelerator) OVERRIDE;
164
165 // Overridden from content::NotificationObserver:
166 virtual void Observe(int type,
167 const content::NotificationSource& source,
168 const content::NotificationDetails& details) OVERRIDE;
169
170 // Overriden from ActiveWindowWatcherXObserver.
171 virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE;
172
173 // Whether to display the avatar image.
174 bool ShouldDisplayAvatar();
175
176 // Returns true if the profile associated with this BrowserWindow is off the
177 // record.
178 bool IsOffTheRecord();
179
180 // Pointers to the browser window that owns us and its GtkWindow.
181 BrowserWindowGtk* browser_window_;
182 GtkWindow* window_;
183
184 // The container widget the holds the hbox which contains the whole titlebar.
185 GtkWidget* container_;
186
187 // The hbox that contains the whole titlebar.
188 GtkWidget* container_hbox_;
189
190 // VBoxes that holds the min/max/close buttons box and an optional padding
191 // that defines the skyline if the user turns off window manager decorations.
192 // There is a left and right version of this box since we try to integrate
193 // with the recent Ubuntu theme changes which put the buttons on the left.
194 GtkWidget* titlebar_left_buttons_vbox_;
195 GtkWidget* titlebar_right_buttons_vbox_;
196
197 // HBoxes that contains the actual min/max/close buttons.
198 GtkWidget* titlebar_left_buttons_hbox_;
199 GtkWidget* titlebar_right_buttons_hbox_;
200
201 // Avatar frame. One of these frames holds either the spy guy in incognito
202 // mode, or the avatar image when using multiple-profiles. It's the side with
203 // the least window control buttons (close, maximize, minimize).
204 // These pointers are never NULL.
205 GtkWidget* titlebar_left_avatar_frame_;
206 GtkWidget* titlebar_right_avatar_frame_;
207
208 // Avatar label. Used if the active profile is managed. The label is either
209 // displayed on the right side of the avatar image if the image is displayed
210 // on the left, or on the left side of the avatar image if the image is
211 // displayed on the right.
212 GtkWidget* titlebar_left_label_frame_;
213 GtkWidget* titlebar_right_label_frame_;
214
215 // The avatar image widget. It will be NULL if there is no avatar displayed.
216 GtkWidget* avatar_;
217
218 // The avatar label of a managed user. It will be NULL if no avatar label is
219 // displayed.
220 GtkWidget* avatar_label_;
221 GtkWidget* avatar_label_bg_;
222
223 // Padding between the titlebar buttons and the top of the screen. Only show
224 // when not maximized.
225 GtkWidget* top_padding_left_;
226 GtkWidget* top_padding_right_;
227
228 // Gtk alignment that contains the tab strip. If the user turns off window
229 // manager decorations, we draw this taller.
230 GtkWidget* titlebar_alignment_;
231
232 // The favicon and page title used when in app mode or popup mode.
233 GtkWidget* app_mode_favicon_;
234 GtkWidget* app_mode_title_;
235
236 // Whether we are using a custom frame.
237 bool using_custom_frame_;
238
239 // Whether we have focus (gtk_window_is_active() sometimes returns the wrong
240 // value, so manually track the focus-in and focus-out events.)
241 bool window_has_focus_;
242
243 // Whether to display the avatar image on the left or right of the titlebar.
244 bool display_avatar_on_left_;
245
246 // We change the size of these three buttons when the window is maximized, so
247 // we use these structs to keep track of their original size.
248 GtkRequisition close_button_req_;
249 GtkRequisition minimize_button_req_;
250 GtkRequisition restore_button_req_;
251
252 // Maximize and restore widgets in the titlebar.
253 scoped_ptr<CustomDrawButton> minimize_button_;
254 scoped_ptr<CustomDrawButton> maximize_button_;
255 scoped_ptr<CustomDrawButton> restore_button_;
256 scoped_ptr<CustomDrawButton> close_button_;
257
258 // The context menu view and model.
259 scoped_ptr<MenuGtk> context_menu_;
260 scoped_ptr<ContextMenuModel> context_menu_model_;
261
262 // The favicon menu view and model.
263 scoped_ptr<MenuGtk> favicon_menu_;
264 scoped_ptr<PopupPageMenuModel> favicon_menu_model_;
265
266 // The throbber used when the window is in app mode or popup window mode.
267 TitlebarThrobAnimation throbber_;
268
269 // The avatar button.
270 scoped_ptr<AvatarMenuButtonGtk> avatar_button_;
271
272 // Theme provider for building buttons.
273 GtkThemeService* theme_service_;
274
275 content::NotificationRegistrar registrar_;
276 };
277
278 #endif // CHROME_BROWSER_UI_GTK_BROWSER_TITLEBAR_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698