summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorderat@chromium.org <derat@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-11 15:29:39 +0000
committerderat@chromium.org <derat@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-11 15:29:39 +0000
commit9056f03371dc601059272a66345cc4d5e80eeae9 (patch)
tree6f406fcd02b82d0dc91c4ed8a7888b25bc445643
parentce4575185befd1ee165f3e01d52fb3fea4b72675 (diff)
downloadchromium_src-9056f03371dc601059272a66345cc4d5e80eeae9.zip
chromium_src-9056f03371dc601059272a66345cc4d5e80eeae9.tar.gz
chromium_src-9056f03371dc601059272a66345cc4d5e80eeae9.tar.bz2
Linux: Load PRIMARY selection on middle-click on new tab button.
BUG=18938,11612,11614 TESTED=highlighted text and checked that middle-click loads it if it's a URL but does nothing if it isn't Review URL: http://codereview.chromium.org/164282 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23025 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/gtk/tabs/tab_strip_gtk.cc61
1 files changed, 60 insertions, 1 deletions
diff --git a/chrome/browser/gtk/tabs/tab_strip_gtk.cc b/chrome/browser/gtk/tabs/tab_strip_gtk.cc
index d8bb632..03f6bdb 100644
--- a/chrome/browser/gtk/tabs/tab_strip_gtk.cc
+++ b/chrome/browser/gtk/tabs/tab_strip_gtk.cc
@@ -12,6 +12,8 @@
#include "app/slide_animation.h"
#include "base/gfx/gtk_util.h"
#include "base/gfx/point.h"
+#include "base/string_util.h"
+#include "chrome/browser/autocomplete/autocomplete.h"
#include "chrome/browser/browser_theme_provider.h"
#include "chrome/browser/gtk/custom_button.h"
#include "chrome/browser/gtk/gtk_dnd_util.h"
@@ -1889,7 +1891,62 @@ gboolean TabStripGtk::OnDragDataReceived(GtkWidget* widget,
// static
void TabStripGtk::OnNewTabClicked(GtkWidget* widget, TabStripGtk* tabstrip) {
- tabstrip->model_->delegate()->AddBlankTab(true);
+ GdkEvent* event = gtk_get_current_event();
+ DCHECK_EQ(event->type, GDK_BUTTON_RELEASE);
+ int mouse_button = event->button.button;
+ gdk_event_free(event);
+
+ switch (mouse_button) {
+ case 1:
+ tabstrip->model_->delegate()->AddBlankTab(true);
+ break;
+ case 2: {
+ // On middle-click, try to parse the PRIMARY selection as a URL and load
+ // it instead of creating a blank page.
+ GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+ DCHECK(clipboard);
+ gchar* selection_text = gtk_clipboard_wait_for_text(clipboard);
+ if (!selection_text)
+ return;
+
+ // Use autocomplete to clean up the text, going so far as to turn it into
+ // a search query if necessary.
+ AutocompleteController controller(tabstrip->model_->profile());
+ controller.Start(UTF8ToWide(selection_text),
+ EmptyWString(), // desired_tld
+ true, // prevent_inline_autocomplete
+ false, // prefer_keyword
+ true); // synchronous_only
+ g_free(selection_text);
+ const AutocompleteResult& result = controller.result();
+ AutocompleteResult::const_iterator it = result.default_match();
+ if (it == result.end())
+ return;
+
+ GURL url(it->destination_url);
+ if (!url.is_valid())
+ return;
+
+ TabContents* contents =
+ tabstrip->model_->delegate()->CreateTabContentsForURL(
+ url,
+ GURL(), // referrer
+ tabstrip->model_->profile(),
+ PageTransition::TYPED,
+ false, // defer_load
+ NULL); // instance
+ tabstrip->model_->AddTabContents(
+ contents,
+ -1, // index
+ false, // force_index
+ PageTransition::TYPED,
+ true); // foreground
+ break;
+ }
+ default:
+ NOTREACHED() << "Got click on new tab button with unhandled mouse "
+ << "button " << mouse_button;
+ }
}
void TabStripGtk::SetTabBounds(TabGtk* tab, const gfx::Rect& bounds) {
@@ -1904,6 +1961,8 @@ CustomDrawButton* TabStripGtk::MakeNewTabButton() {
CustomDrawButton* button = new CustomDrawButton(IDR_NEWTAB_BUTTON,
IDR_NEWTAB_BUTTON_P, IDR_NEWTAB_BUTTON_H, 0);
+ // Let the middle mouse button initiate clicks as well.
+ gtk_util::SetButtonTriggersNavigation(button->widget());
g_signal_connect(G_OBJECT(button->widget()), "clicked",
G_CALLBACK(OnNewTabClicked), this);
GTK_WIDGET_UNSET_FLAGS(button->widget(), GTK_CAN_FOCUS);