Index: chrome/browser/ui/gtk/browser_titlebar.h |
diff --git a/chrome/browser/ui/gtk/browser_titlebar.h b/chrome/browser/ui/gtk/browser_titlebar.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a716a4133e363a21e3bd0bb838106beb7afb41de |
--- /dev/null |
+++ b/chrome/browser/ui/gtk/browser_titlebar.h |
@@ -0,0 +1,239 @@ |
+// 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. |
+// |
+// A helper class that contains the gtk widgets that make up the titlebar. The |
+// titlebar consists of the tabstrip and if the custom chrome frame is turned |
+// on, it includes the taller titlebar and minimize, restore, maximize, and |
+// close buttons. |
+ |
+#ifndef CHROME_BROWSER_UI_GTK_BROWSER_TITLEBAR_H_ |
+#define CHROME_BROWSER_UI_GTK_BROWSER_TITLEBAR_H_ |
+#pragma once |
+ |
+#include <gtk/gtk.h> |
+ |
+#include "app/active_window_watcher_x.h" |
+#include "app/menus/simple_menu_model.h" |
+#include "app/gtk_signal.h" |
+#include "base/scoped_ptr.h" |
+#include "chrome/common/notification_observer.h" |
+#include "chrome/common/notification_registrar.h" |
+ |
+class BrowserWindowGtk; |
+class CustomDrawButton; |
+class GtkThemeProvider; |
+class MenuGtk; |
+class PopupPageMenuModel; |
+class TabContents; |
+ |
+class BrowserTitlebar : public NotificationObserver, |
+ public ActiveWindowWatcherX::Observer, |
+ public menus::SimpleMenuModel::Delegate { |
+ public: |
+ // A default button order string for when we aren't asking gconf for the |
+ // metacity configuration. |
+ static const char kDefaultButtonString[]; |
+ |
+ BrowserTitlebar(BrowserWindowGtk* browser_window, GtkWindow* window); |
+ virtual ~BrowserTitlebar(); |
+ |
+ GtkWidget* widget() { |
+ return container_; |
+ } |
+ |
+ void set_window(GtkWindow* window) { window_ = window; } |
+ |
+ // Builds the buttons based on the metacity |button_string|. |
+ void BuildButtons(const std::string& button_string); |
+ |
+ // Update the appearance of the title bar based on whether we're showing a |
+ // custom frame or not. If |use_custom_frame| is true, we show an extra |
+ // tall titlebar and the min/max/close buttons. |
+ void UpdateCustomFrame(bool use_custom_frame); |
+ |
+ // Updates the title and icon when in app or popup mode (no tabstrip). |
+ void UpdateTitleAndIcon(); |
+ |
+ // Called by the browser asking us to update the loading throbber. |
+ // |tab_contents| is the tab that is associated with the window throbber. |
+ // |tab_contents| can be null. |
+ void UpdateThrobber(TabContents* tab_contents); |
+ |
+ // On Windows, right clicking in the titlebar background brings up the system |
+ // menu. There's no such thing on linux, so we just show the menu items we |
+ // add to the menu. |
+ void ShowContextMenu(); |
+ |
+ private: |
+ // A helper class to keep track of which frame of the throbber animation |
+ // we're showing. |
+ class Throbber { |
+ public: |
+ Throbber() : current_frame_(0), current_waiting_frame_(0) {} |
+ |
+ // Get the next frame in the animation. The image is owned by the throbber |
+ // so the caller doesn't need to unref. |is_waiting| is true if we're |
+ // still waiting for a response. |
+ GdkPixbuf* GetNextFrame(bool is_waiting); |
+ |
+ // Reset back to the first frame. |
+ void Reset(); |
+ private: |
+ // Make sure the frames are loaded. |
+ static void InitFrames(); |
+ |
+ int current_frame_; |
+ int current_waiting_frame_; |
+ }; |
+ |
+ class ContextMenuModel : public menus::SimpleMenuModel { |
+ public: |
+ explicit ContextMenuModel(menus::SimpleMenuModel::Delegate* delegate); |
+ }; |
+ |
+ // Build the titlebar, the space above the tab |
+ // strip, and (maybe) the min, max, close buttons. |container| is the gtk |
+ // continer that we put the widget into. |
+ void Init(); |
+ |
+ // Lazily builds and returns |titlebar_{left,right}_buttons_vbox_| and their |
+ // subtrees. We do this lazily because in most situations, only one of them |
+ // is allocated (though the user can (and do) manually mess with their gconf |
+ // settings to get absolutely horrid combinations of buttons on both sides. |
+ GtkWidget* GetButtonHBox(bool left_side); |
+ |
+ // Constructs a CustomDraw button given 3 image ids (IDR_), the box to place |
+ // the button into, and a tooltip id (IDS_). |
+ CustomDrawButton* BuildTitlebarButton(int image, int image_pressed, |
+ int image_hot, GtkWidget* box, |
+ int tooltip); |
+ |
+ // Update the titlebar spacing based on the custom frame and maximized state. |
+ void UpdateTitlebarAlignment(); |
+ |
+ // Updates the color of the title bar. Called whenever we have a state |
+ // change in the window. |
+ void UpdateTextColor(); |
+ |
+ // Show the menu that the user gets from left-clicking the favicon. |
+ void ShowFaviconMenu(GdkEventButton* event); |
+ |
+ // The maximize button was clicked, take an action depending on which mouse |
+ // button the user pressed. |
+ void MaximizeButtonClicked(); |
+ |
+ // Updates the visibility of the maximize and restore buttons; only one can |
+ // be visible at a time. |
+ void UpdateMaximizeRestoreVisibility(); |
+ |
+ // Callback for changes to window state. This includes |
+ // maximizing/restoring/minimizing the window. |
+ CHROMEG_CALLBACK_1(BrowserTitlebar, gboolean, OnWindowStateChanged, |
+ GtkWindow*, GdkEventWindowState*); |
+ |
+ // Callback for mousewheel events. |
+ CHROMEGTK_CALLBACK_1(BrowserTitlebar, gboolean, OnScroll, |
+ GdkEventScroll*); |
+ |
+ // Callback for min/max/close buttons. |
+ CHROMEGTK_CALLBACK_0(BrowserTitlebar, void, OnButtonClicked); |
+ |
+ // Callback for favicon. |
+ CHROMEGTK_CALLBACK_1(BrowserTitlebar, gboolean, OnButtonPressed, |
+ GdkEventButton*); |
+ |
+ // -- Context Menu ----------------------------------------------------------- |
+ |
+ // SimpleMenuModel::Delegate implementation: |
+ virtual bool IsCommandIdEnabled(int command_id) const; |
+ virtual bool IsCommandIdChecked(int command_id) const; |
+ virtual void ExecuteCommand(int command_id); |
+ virtual bool GetAcceleratorForCommandId(int command_id, |
+ menus::Accelerator* accelerator); |
+ |
+ // Overridden from NotificationObserver: |
+ virtual void Observe(NotificationType type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details); |
+ |
+ // Overriden from ActiveWindowWatcher::Observer. |
+ virtual void ActiveWindowChanged(GdkWindow* active_window); |
+ |
+ // Pointers to the browser window that owns us and it's GtkWindow. |
+ BrowserWindowGtk* browser_window_; |
+ GtkWindow* window_; |
+ |
+ // The container widget the holds the hbox which contains the whole titlebar. |
+ GtkWidget* container_; |
+ |
+ // The hbox that contains the whole titlebar. |
+ GtkWidget* container_hbox_; |
+ |
+ // VBoxes that holds the min/max/close buttons box and an optional padding |
+ // that defines the skyline if the user turns off window manager decorations. |
+ // There is a left and right version of this box since we try to integrate |
+ // with the recent Ubuntu theme changes which put the buttons on the left. |
+ GtkWidget* titlebar_left_buttons_vbox_; |
+ GtkWidget* titlebar_right_buttons_vbox_; |
+ |
+ // HBoxes that contains the actual min/max/close buttons. |
+ GtkWidget* titlebar_left_buttons_hbox_; |
+ GtkWidget* titlebar_right_buttons_hbox_; |
+ |
+ // Spy frame. One of these frames holds the spy guy in incognito mode. It's |
+ // the side with the least buttons. These are NULL when we aren't in |
+ // incognito mode. |
+ GtkWidget* titlebar_left_spy_frame_; |
+ GtkWidget* titlebar_right_spy_frame_; |
+ |
+ // Padding between the titlebar buttons and the top of the screen. Only show |
+ // when not maximized. |
+ GtkWidget* top_padding_left_; |
+ GtkWidget* top_padding_right_; |
+ |
+ // Gtk alignment that contains the tab strip. If the user turns off window |
+ // manager decorations, we draw this taller. |
+ GtkWidget* titlebar_alignment_; |
+ |
+ // The favicon and page title used when in app mode or popup mode. |
+ GtkWidget* app_mode_favicon_; |
+ GtkWidget* app_mode_title_; |
+ |
+ // Whether we are using a custom frame. |
+ bool using_custom_frame_; |
+ |
+ // Whether we have focus (gtk_window_is_active() sometimes returns the wrong |
+ // value, so manually track the focus-in and focus-out events.) |
+ bool window_has_focus_; |
+ |
+ // We change the size of these three buttons when the window is maximized, so |
+ // we use these structs to keep track of their original size. |
+ GtkRequisition close_button_req_; |
+ GtkRequisition minimize_button_req_; |
+ GtkRequisition restore_button_req_; |
+ |
+ // Maximize and restore widgets in the titlebar. |
+ scoped_ptr<CustomDrawButton> minimize_button_; |
+ scoped_ptr<CustomDrawButton> maximize_button_; |
+ scoped_ptr<CustomDrawButton> restore_button_; |
+ scoped_ptr<CustomDrawButton> close_button_; |
+ |
+ // The context menu view and model. |
+ scoped_ptr<MenuGtk> context_menu_; |
+ scoped_ptr<ContextMenuModel> context_menu_model_; |
+ |
+ // The favicon menu view and model. |
+ scoped_ptr<MenuGtk> favicon_menu_; |
+ scoped_ptr<PopupPageMenuModel> favicon_menu_model_; |
+ |
+ // The throbber used when the window is in app mode or popup window mode. |
+ Throbber throbber_; |
+ |
+ // Theme provider for building buttons. |
+ GtkThemeProvider* theme_provider_; |
+ |
+ NotificationRegistrar registrar_; |
+}; |
+ |
+#endif // CHROME_BROWSER_UI_GTK_BROWSER_TITLEBAR_H_ |