| Index: chrome/browser/gtk/browser_toolbar_gtk.cc
|
| ===================================================================
|
| --- chrome/browser/gtk/browser_toolbar_gtk.cc (revision 25676)
|
| +++ chrome/browser/gtk/browser_toolbar_gtk.cc (working copy)
|
| @@ -82,7 +82,8 @@
|
| model_(browser->toolbar_model()),
|
| browser_(browser),
|
| window_(window),
|
| - profile_(NULL) {
|
| + profile_(NULL),
|
| + menu_bar_helper_(this) {
|
| browser_->command_updater()->AddCommandObserver(IDC_BACK, this);
|
| browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this);
|
| browser_->command_updater()->AddCommandObserver(IDC_RELOAD, this);
|
| @@ -219,6 +220,7 @@
|
| GtkWidget* page_menu = BuildToolbarMenuButton(
|
| l10n_util::GetStringUTF8(IDS_PAGEMENU_TOOLTIP),
|
| &page_menu_button_);
|
| + menu_bar_helper_.Add(page_menu_button_.get());
|
| page_menu_image_ = gtk_image_new_from_pixbuf(
|
| theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_PAGE));
|
| gtk_container_add(GTK_CONTAINER(page_menu), page_menu_image_);
|
| @@ -226,24 +228,17 @@
|
| encodings_menu_.reset(BuildEncodingsMenu(profile, this));
|
| page_menu_.reset(new MenuGtk(this, GetStandardPageMenu(encodings_menu_.get()),
|
| accel_group_));
|
| - g_signal_connect(page_menu_->widget(), "motion-notify-event",
|
| - G_CALLBACK(OnPageAppMenuMouseMotion), this);
|
| - g_signal_connect(page_menu_->widget(), "move-current",
|
| - G_CALLBACK(OnPageAppMenuMoveCurrent), this);
|
| gtk_box_pack_start(GTK_BOX(menus_hbox_), page_menu, FALSE, FALSE, 0);
|
|
|
| GtkWidget* chrome_menu = BuildToolbarMenuButton(
|
| l10n_util::GetStringFUTF8(IDS_APPMENU_TOOLTIP,
|
| WideToUTF16(l10n_util::GetString(IDS_PRODUCT_NAME))),
|
| &app_menu_button_);
|
| + menu_bar_helper_.Add(app_menu_button_.get());
|
| app_menu_image_ = gtk_image_new_from_pixbuf(
|
| theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_CHROME));
|
| gtk_container_add(GTK_CONTAINER(chrome_menu), app_menu_image_);
|
| app_menu_.reset(new MenuGtk(this, GetStandardAppMenu(), accel_group_));
|
| - g_signal_connect(app_menu_->widget(), "motion-notify-event",
|
| - G_CALLBACK(OnPageAppMenuMouseMotion), this);
|
| - g_signal_connect(app_menu_->widget(), "move-current",
|
| - G_CALLBACK(OnPageAppMenuMoveCurrent), this);
|
| gtk_box_pack_start(GTK_BOX(menus_hbox_), chrome_menu, FALSE, FALSE, 0);
|
|
|
| gtk_box_pack_start(GTK_BOX(toolbar_), menus_hbox_, FALSE, FALSE, 0);
|
| @@ -646,6 +641,7 @@
|
| MenuGtk* menu = button == toolbar->page_menu_button_.get() ?
|
| toolbar->page_menu_.get() : toolbar->app_menu_.get();
|
| menu->Popup(button, reinterpret_cast<GdkEvent*>(event));
|
| + toolbar->menu_bar_helper_.MenuStartedShowing(button, menu->widget());
|
|
|
| return TRUE;
|
| }
|
| @@ -653,11 +649,7 @@
|
| // static
|
| gboolean BrowserToolbarGtk::OnMenuClicked(GtkWidget* button,
|
| BrowserToolbarGtk* toolbar) {
|
| - gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(button),
|
| - GTK_STATE_ACTIVE);
|
| - MenuGtk* menu = button == toolbar->page_menu_button_.get() ?
|
| - toolbar->page_menu_.get() : toolbar->app_menu_.get();
|
| - menu->PopupAsFromKeyEvent(button);
|
| + toolbar->PopupForButton(button);
|
|
|
| return TRUE;
|
| }
|
| @@ -685,41 +677,26 @@
|
| }
|
| }
|
|
|
| -// static
|
| -gboolean BrowserToolbarGtk::OnPageAppMenuMouseMotion(GtkWidget* menu,
|
| - GdkEventMotion* event, BrowserToolbarGtk* toolbar) {
|
| - if (gtk_util::WidgetContainsCursor(menu == toolbar->app_menu_->widget() ?
|
| - toolbar->page_menu_button_.get() :
|
| - toolbar->app_menu_button_.get())) {
|
| - toolbar->ChangeActiveMenu(menu, event->time);
|
| - return TRUE;
|
| - }
|
| -
|
| - return FALSE;
|
| +bool BrowserToolbarGtk::ShouldOnlyShowLocation() const {
|
| + // If we're a popup window, only show the location bar (omnibox).
|
| + return browser_->type() != Browser::TYPE_NORMAL;
|
| }
|
|
|
| -// static
|
| -void BrowserToolbarGtk::OnPageAppMenuMoveCurrent(GtkWidget* menu,
|
| - GtkMenuDirectionType dir, BrowserToolbarGtk* toolbar) {
|
| - GtkWidget* active_item = GTK_MENU_SHELL(menu)->active_menu_item;
|
| +void BrowserToolbarGtk::PopupForButton(GtkWidget* button) {
|
| + page_menu_->Cancel();
|
| + app_menu_->Cancel();
|
|
|
| - switch (dir) {
|
| - case GTK_MENU_DIR_CHILD:
|
| - // The move is going to open a submenu; don't override default behavior.
|
| - if (active_item && gtk_menu_item_get_submenu(GTK_MENU_ITEM(active_item)))
|
| - break;
|
| - // Fall through.
|
| - case GTK_MENU_DIR_PARENT:
|
| - toolbar->ChangeActiveMenu(menu, gtk_get_current_event_time());
|
| - // This signal doesn't have a return value; we have to manually stop its
|
| - // propagation.
|
| - g_signal_stop_emission_by_name(menu, "move-current");
|
| - default:
|
| - break;
|
| - }
|
| + gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(button),
|
| + GTK_STATE_ACTIVE);
|
| + MenuGtk* menu = button == page_menu_button_.get() ?
|
| + page_menu_.get() : app_menu_.get();
|
| + menu->PopupAsFromKeyEvent(button);
|
| + menu_bar_helper_.MenuStartedShowing(button, menu->widget());
|
| }
|
|
|
| -bool BrowserToolbarGtk::ShouldOnlyShowLocation() const {
|
| - // If we're a popup window, only show the location bar (omnibox).
|
| - return browser_->type() != Browser::TYPE_NORMAL;
|
| +void BrowserToolbarGtk::PopupForButtonNextTo(GtkWidget* button,
|
| + GtkMenuDirectionType dir) {
|
| + GtkWidget* other_button = button == page_menu_button_.get() ?
|
| + app_menu_button_.get() : page_menu_button_.get();
|
| + PopupForButton(other_button);
|
| }
|
|
|