Index: chrome/browser/gtk/browser_toolbar_gtk.cc |
=================================================================== |
--- chrome/browser/gtk/browser_toolbar_gtk.cc (revision 20047) |
+++ chrome/browser/gtk/browser_toolbar_gtk.cc (working copy) |
@@ -154,6 +154,10 @@ |
l10n_util::GetStringUTF8(IDS_PAGEMENU_TOOLTIP), |
&page_menu_button_); |
page_menu_.reset(new MenuGtk(this, GetStandardPageMenu(), 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(IDR_MENU_CHROME, |
@@ -161,6 +165,10 @@ |
WideToUTF16(l10n_util::GetString(IDS_PRODUCT_NAME))), |
&app_menu_button_); |
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); |
@@ -377,6 +385,27 @@ |
G_CALLBACK(OnDragDataReceived), this); |
} |
+void BrowserToolbarGtk::ChangeActiveMenu(GtkWidget* active_menu, |
+ guint timestamp) { |
+ MenuGtk* old_menu; |
+ MenuGtk* new_menu; |
+ GtkWidget* relevant_button; |
+ if (active_menu == app_menu_->widget()) { |
+ old_menu = app_menu_.get(); |
+ new_menu = page_menu_.get(); |
+ relevant_button = page_menu_button_.get(); |
+ } else { |
+ old_menu = page_menu_.get(); |
+ new_menu = app_menu_.get(); |
+ relevant_button = app_menu_button_.get(); |
+ } |
+ |
+ old_menu->Cancel(); |
+ gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(relevant_button), |
+ GTK_STATE_ACTIVE); |
+ new_menu->Popup(relevant_button, 0, timestamp); |
+} |
+ |
// static |
gboolean BrowserToolbarGtk::OnToolbarExpose(GtkWidget* widget, |
GdkEventExpose* e, |
@@ -461,6 +490,40 @@ |
} |
} |
+// 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; |
+} |
+ |
+// static |
+void BrowserToolbarGtk::OnPageAppMenuMoveCurrent(GtkWidget* menu, |
+ GtkMenuDirectionType dir, BrowserToolbarGtk* toolbar) { |
+ GtkWidget* active_item = GTK_MENU_SHELL(menu)->active_menu_item; |
+ |
+ 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; |
+ } |
+} |
+ |
void BrowserToolbarGtk::InitNineBox() { |
// TODO(estade): use |profile_|? |
background_ninebox_.reset(new NineBox( |