From 30729c347ccfc3773a7e0bece475632cbe59ad60 Mon Sep 17 00:00:00 2001 From: "estade@chromium.org" Date: Wed, 15 Jul 2009 20:30:54 +0000 Subject: Make more things clickable in the bookmark bar menus: - folder within a folder - "empty" menu item Note that it can be hard to click on a folder within a folder since hovering over the folder pops up a submenu that grabs focus, so you end up needing to right click twice. It's a little odd but the hackery required to fix it doesn't seem worth it. BUG=15886 TEST=right click on an empty menu item Review URL: http://codereview.chromium.org/155586 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20785 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/gtk/bookmark_menu_controller_gtk.cc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'chrome') diff --git a/chrome/browser/gtk/bookmark_menu_controller_gtk.cc b/chrome/browser/gtk/bookmark_menu_controller_gtk.cc index 58629b8..b68b51c 100644 --- a/chrome/browser/gtk/bookmark_menu_controller_gtk.cc +++ b/chrome/browser/gtk/bookmark_menu_controller_gtk.cc @@ -38,6 +38,11 @@ const BookmarkNode* GetNodeFromMenuItem(GtkWidget* menu_item) { g_object_get_data(G_OBJECT(menu_item), "bookmark-node")); } +const BookmarkNode* GetParentNodeFromEmptyMenuItem(GtkWidget* menu_item) { + return static_cast( + g_object_get_data(G_OBJECT(menu_item), "parent-node")); +} + void* AsVoid(const BookmarkNode* node) { return const_cast(node); } @@ -115,6 +120,8 @@ void BookmarkMenuController::BuildMenu(const BookmarkNode* parent, GtkWidget* menu_item = gtk_image_menu_item_new_with_label( WideToUTF8(node->GetTitle()).c_str()); g_object_set_data(G_OBJECT(menu_item), "bookmark-node", AsVoid(node)); + g_signal_connect(G_OBJECT(menu_item), "button-press-event", + G_CALLBACK(OnButtonPressed), this); if (node->is_url()) { SkBitmap icon = profile_->GetBookmarkModel()->GetFavIcon(node); @@ -125,8 +132,6 @@ void BookmarkMenuController::BuildMenu(const BookmarkNode* parent, SetImageMenuItem(menu_item, icon); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(OnMenuItemActivated), this); - g_signal_connect(G_OBJECT(menu_item), "button-press-event", - G_CALLBACK(OnButtonPressed), this); g_signal_connect(G_OBJECT(menu_item), "button-release-event", G_CALLBACK(OnButtonReleased), this); } else if (node->is_folder()) { @@ -160,6 +165,11 @@ void BookmarkMenuController::BuildMenu(const BookmarkNode* parent, GtkWidget* empty_menu = gtk_menu_item_new_with_label( l10n_util::GetStringUTF8(IDS_MENU_EMPTY_SUBMENU).c_str()); gtk_widget_set_sensitive(empty_menu, FALSE); + // We connect to the menu rather than the item because the item is + // insensitive and doesn't listen for button presses. + g_signal_connect(G_OBJECT(menu), "button-press-event", + G_CALLBACK(OnButtonPressed), this); + g_object_set_data(G_OBJECT(menu), "parent-node", AsVoid(parent)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), empty_menu); } } @@ -174,9 +184,11 @@ gboolean BookmarkMenuController::OnButtonPressed( if (event->button == 3) { // Show the right click menu and stop processing this button event. const BookmarkNode* node = GetNodeFromMenuItem(sender); - const BookmarkNode* parent = node->GetParent(); + const BookmarkNode* parent = node ? node->GetParent() : + GetParentNodeFromEmptyMenuItem(sender); std::vector nodes; - nodes.push_back(node); + if (node) + nodes.push_back(node); controller->context_menu_.reset( new BookmarkContextMenu( sender, controller->profile_, controller->browser_, -- cgit v1.1