diff options
author | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-26 18:43:26 +0000 |
---|---|---|
committer | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-26 18:43:26 +0000 |
commit | 1676374870966b50e20d7097881e49c084a7caf5 (patch) | |
tree | d8b0f38dcce4287f1c591510f346e32638db2673 /chrome/browser/gtk/browser_window_gtk.cc | |
parent | 1b03426641d2f49d586e940a4366104bb685ff28 (diff) | |
download | chromium_src-1676374870966b50e20d7097881e49c084a7caf5.zip chromium_src-1676374870966b50e20d7097881e49c084a7caf5.tar.gz chromium_src-1676374870966b50e20d7097881e49c084a7caf5.tar.bz2 |
Hook up ctrl+tab and ctrl+shift+tab for switching tabs in linux
We can't just add accelerators for these because GDK_Tab and GDK_ISO_Left_Tab are not valid accelerator keys:
http://www.google.com/codesearch/p?hl=en#ycarM8Ghiog/gtk+-2.4.0/gtk/gtkaccelgroup.c&q=gtk_accel_groups_activate&l=805
Instead, handle these keys in keypress and forward the event on to BrowserWindowGtk::OnAccelerator directly. We stash a pointer to BrowserWindowGtk on the GtkWindow.
Review URL: http://codereview.chromium.org/42611
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12581 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/browser_window_gtk.cc')
-rw-r--r-- | chrome/browser/gtk/browser_window_gtk.cc | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc index e2960f8..7bf8a69 100644 --- a/chrome/browser/gtk/browser_window_gtk.cc +++ b/chrome/browser/gtk/browser_window_gtk.cc @@ -165,6 +165,7 @@ BrowserWindowGtk::BrowserWindowGtk(Browser* browser) method_factory_(this) { window_ = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); gtk_window_set_default_size(window_, 640, 480); + g_object_set_data(G_OBJECT(window_), "browser_window_gtk", this); g_signal_connect(window_, "delete-event", G_CALLBACK(MainWindowDeleteEvent), this); g_signal_connect(window_, "destroy", @@ -251,6 +252,31 @@ BrowserWindowGtk::~BrowserWindowGtk() { browser_->tabstrip_model()->RemoveObserver(this); } +void BrowserWindowGtk::HandleAccelerator(guint keyval, + GdkModifierType modifier) { + // Filter modifier to only include accelerator modifiers. + modifier = static_cast<GdkModifierType>( + modifier & gtk_accelerator_get_default_mod_mask()); + switch (keyval) { + // Gtk doesn't allow GDK_Tab or GDK_ISO_Left_Tab to be an accelerator (see + // gtk_accelerator_valid), so we need to handle these accelerators + // manually. + case GDK_Tab: + if (GDK_CONTROL_MASK == modifier) + ExecuteBrowserCommand(IDC_SELECT_NEXT_TAB); + break; + + case GDK_ISO_Left_Tab: + if ((GDK_CONTROL_MASK | GDK_SHIFT_MASK) == modifier) + ExecuteBrowserCommand(IDC_SELECT_PREVIOUS_TAB); + break; + + default: + // Pass the accelerator on to GTK. + gtk_accel_groups_activate(G_OBJECT(window_), keyval, modifier); + } +} + gboolean BrowserWindowGtk::OnContentAreaExpose(GtkWidget* widget, GdkEventExpose* e, BrowserWindowGtk* window) { @@ -542,7 +568,7 @@ void BrowserWindowGtk::ConnectAccelerators() { for (size_t i = 0; i < arraysize(kAcceleratorMap); ++i) { gtk_accel_group_connect( accel_group, kAcceleratorMap[i].keyval, GDK_CONTROL_MASK, - GtkAccelFlags(0), g_cclosure_new(G_CALLBACK(OnAccelerator), + GtkAccelFlags(0), g_cclosure_new(G_CALLBACK(OnGtkAccelerator), this, NULL)); } } @@ -559,11 +585,11 @@ void BrowserWindowGtk::SetCustomFrame(bool custom_frame) { } // static -gboolean BrowserWindowGtk::OnAccelerator(GtkAccelGroup* accel_group, - GObject* acceleratable, - guint keyval, - GdkModifierType modifier, - BrowserWindowGtk* browser_window) { +gboolean BrowserWindowGtk::OnGtkAccelerator(GtkAccelGroup* accel_group, + GObject* acceleratable, + guint keyval, + GdkModifierType modifier, + BrowserWindowGtk* browser_window) { int command_id = GetCommandFromKeyval(keyval); // We have to delay certain commands that may try to destroy widgets to which // GTK is currently holding a reference. (For now the only such command is |