Index: chrome/browser/ui/gtk/browser_window_gtk.cc |
diff --git a/chrome/browser/ui/gtk/browser_window_gtk.cc b/chrome/browser/ui/gtk/browser_window_gtk.cc |
index 8037ff8b57b6dca5f4fd0756c75e537ce76cf886..d3b64ac26f150e992947a926168296e822239b47 100644 |
--- a/chrome/browser/ui/gtk/browser_window_gtk.cc |
+++ b/chrome/browser/ui/gtk/browser_window_gtk.cc |
@@ -78,6 +78,7 @@ |
#include "chrome/browser/ui/omnibox/omnibox_view.h" |
#include "chrome/browser/ui/page_info_bubble.h" |
#include "chrome/browser/ui/tab_contents/tab_contents.h" |
+#include "chrome/browser/ui/tabs/mru_tab_controller.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/browser/web_applications/web_app.h" |
#include "chrome/common/chrome_notification_types.h" |
@@ -1793,6 +1794,8 @@ void BrowserWindowGtk::ConnectHandlersToSignals() { |
G_CALLBACK(OnWindowStateThunk), this); |
g_signal_connect(window_, "key-press-event", |
G_CALLBACK(OnKeyPressThunk), this); |
+ g_signal_connect(window_, "key-release-event", |
+ G_CALLBACK(OnKeyReleaseThunk), this); |
g_signal_connect(window_, "motion-notify-event", |
G_CALLBACK(OnMouseMoveEventThunk), this); |
g_signal_connect(window_, "button-press-event", |
@@ -2213,6 +2216,22 @@ gboolean BrowserWindowGtk::OnKeyPress(GtkWidget* widget, GdkEventKey* event) { |
if (extension_keybinding_registry_->HasPriorityHandler(event)) |
return FALSE; |
+ // Pause tab mru stack updates when control key is pressed. For eg. ignore |
+ // active tab changes when ctrl key is pressed. Commit the changes only |
+ // on releasing the ctrl key. |
+ MRUTabController* mru_tab_controller = browser()->mru_tab_controller(); |
+ if (mru_tab_controller) { |
+ guint modifier = event->state & gtk_accelerator_get_default_mod_mask(); |
+ if (GDK_CONTROL_MASK == modifier) { |
+ if ((event->keyval == GDK_KEY_asciitilde) || |
+ (event->keyval == GDK_KEY_quoteleft)) { |
+ mru_tab_controller->CommitActiveTabChanges(); |
+ } else { |
+ mru_tab_controller->PauseStackUpdates(); |
+ } |
+ } |
+ } |
+ |
// If a widget besides the native view is focused, we have to try to handle |
// the custom accelerators before letting it handle them. |
WebContents* current_web_contents = chrome::GetActiveWebContents(browser()); |
@@ -2242,6 +2261,17 @@ gboolean BrowserWindowGtk::OnKeyPress(GtkWidget* widget, GdkEventKey* event) { |
return TRUE; |
} |
+gboolean BrowserWindowGtk::OnKeyRelease(GtkWidget* widget, GdkEventKey* event) { |
+ MRUTabController* mru_tab_controller = browser()->mru_tab_controller(); |
+ if (mru_tab_controller && |
+ (event->keyval == GDK_KEY_Control_L || |
+ event->keyval == GDK_KEY_Control_R)) { |
+ mru_tab_controller->CommitActiveTabChanges(); |
+ } |
+ |
+ return FALSE; |
+} |
+ |
gboolean BrowserWindowGtk::OnMouseMoveEvent(GtkWidget* widget, |
GdkEventMotion* event) { |
// This method is used to update the mouse cursor when over the edge of the |