diff options
Diffstat (limited to 'chrome/browser/gtk/menu_bar_helper.h')
-rw-r--r-- | chrome/browser/gtk/menu_bar_helper.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/chrome/browser/gtk/menu_bar_helper.h b/chrome/browser/gtk/menu_bar_helper.h new file mode 100644 index 0000000..c3f92cf --- /dev/null +++ b/chrome/browser/gtk/menu_bar_helper.h @@ -0,0 +1,77 @@ +// Copyright (c) 2010 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. +// +// This class replicates some menubar behaviors that are tricky to get right. +// It is used to create a more native feel for the bookmark bar. + +#ifndef CHROME_BROWSER_GTK_MENU_BAR_HELPER_H_ +#define CHROME_BROWSER_GTK_MENU_BAR_HELPER_H_ + +#include <gtk/gtk.h> + +#include <vector> + +#include "app/gtk_signal.h" +#include "base/scoped_ptr.h" + +class GtkSignalRegistrar; + +class MenuBarHelper { + public: + class Delegate { + public: + virtual ~Delegate() {} + + // Called when a the menu for a button ought to be triggered. + virtual void PopupForButton(GtkWidget* button) = 0; + virtual void PopupForButtonNextTo(GtkWidget* button, + GtkMenuDirectionType dir) = 0; + }; + + // |delegate| cannot be null. + explicit MenuBarHelper(Delegate* delegate); + ~MenuBarHelper(); + + // Must be called whenever a button's menu starts showing. It triggers the + // MenuBarHelper to start listening for certain events. + void MenuStartedShowing(GtkWidget* button, GtkWidget* menu); + + // Add |button| to the set of buttons we care about. + void Add(GtkWidget* button); + + // Remove |button| from the set of buttons we care about. + void Remove(GtkWidget* button); + + // Clear all buttons from the set. + void Clear(); + + private: + CHROMEGTK_CALLBACK_1(MenuBarHelper, gboolean, OnMenuMotionNotify, + GdkEventMotion*); + CHROMEGTK_CALLBACK_0(MenuBarHelper, void, OnMenuHidden); + CHROMEGTK_CALLBACK_1(MenuBarHelper, void, OnMenuMoveCurrent, + GtkMenuDirectionType); + + // The buttons for which we pop up menus. We do not own these, or even add + // refs to them. + std::vector<GtkWidget*> buttons_; + + // The button that is currently showing a menu, or NULL. + GtkWidget* button_showing_menu_; + + // The highest level menu that is currently showing, or NULL. + GtkWidget* showing_menu_; + + // All the submenus of |showing_menu_|. We connect to motion events on all + // of them. + std::vector<GtkWidget*> submenus_; + + // Signal handlers that are attached only between the "show" and "hide" events + // for the menu. + scoped_ptr<GtkSignalRegistrar> signal_handlers_; + + Delegate* delegate_; +}; + +#endif // CHROME_BROWSER_GTK_MENU_BAR_HELPER_H_ |