summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-07 19:37:55 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-07 19:37:55 +0000
commitbc9e271112139a38fb81c38f00809a8a6d496542 (patch)
tree0eb67d503958b2cd91107fc4435189b3df656841
parentb475c0507c663dfbd8d711f11f8394a3c6910f75 (diff)
downloadchromium_src-bc9e271112139a38fb81c38f00809a8a6d496542.zip
chromium_src-bc9e271112139a38fb81c38f00809a8a6d496542.tar.gz
chromium_src-bc9e271112139a38fb81c38f00809a8a6d496542.tar.bz2
GTK: Handle some accelerators after the focused widget has had a chance to handle the keypress.
Also, don't try to give the browser commands that are disabled. ---- (this description may need to be re-written) BUG=11526 Review URL: http://codereview.chromium.org/113050 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15570 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc19
-rw-r--r--chrome/browser/gtk/browser_toolbar_gtk.cc4
-rw-r--r--chrome/browser/gtk/browser_window_gtk.cc27
3 files changed, 35 insertions, 15 deletions
diff --git a/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc b/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc
index 566c8d2..b1d0791 100644
--- a/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc
+++ b/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/autocomplete/autocomplete_edit.h"
#include "chrome/browser/autocomplete/autocomplete_popup_model.h"
#include "chrome/browser/autocomplete/autocomplete_popup_view_gtk.h"
+#include "chrome/browser/gtk/browser_window_gtk.h"
#include "chrome/browser/gtk/location_bar_view_gtk.h"
#include "chrome/browser/tab_contents/tab_contents.h"
#include "chrome/browser/toolbar_model.h"
@@ -352,6 +353,24 @@ void AutocompleteEditViewGtk::HandleEndUserAction() {
gboolean AutocompleteEditViewGtk::HandleKeyPress(GtkWidget* widget,
GdkEventKey* event) {
+ GdkModifierType modifier = GdkModifierType(
+ event->state & gtk_accelerator_get_default_mod_mask());
+
+ // We want to let the browser handle ctrl-pgup and ctrl-pgdn.
+ if ((event->keyval == GDK_Page_Up || event->keyval == GDK_Page_Down) &&
+ modifier == GDK_CONTROL_MASK) {
+ GtkWidget* window = gtk_widget_get_toplevel(widget);
+ if (!window) {
+ NOTREACHED();
+ } else {
+ BrowserWindowGtk* browser_window = static_cast<BrowserWindowGtk*>(
+ g_object_get_data(G_OBJECT(window), "browser_window_gtk"));
+ browser_window->HandleAccelerator(event->keyval,
+ static_cast<GdkModifierType>(event->state));
+ return TRUE;
+ }
+ }
+
// This is very similar to the special casing of the return key in the
// GtkTextView key_press default handler. TODO(deanm): We do however omit
// some IME related code, this might become a problem if an IME wants to
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.cc b/chrome/browser/gtk/browser_toolbar_gtk.cc
index fbedb38..3a02d7f 100644
--- a/chrome/browser/gtk/browser_toolbar_gtk.cc
+++ b/chrome/browser/gtk/browser_toolbar_gtk.cc
@@ -112,9 +112,7 @@ void BrowserToolbarGtk::Init(Profile* profile,
IDR_BACK_D,
l10n_util::GetStringUTF8(IDS_TOOLTIP_BACK)));
AddAcceleratorToButton(back_, GDK_Left, GDK_MOD1_MASK);
- // TODO(estade): I ran into some problems with backspace in the find bar when
- // I enabled this accelerator. Figure it out and re-enable the shortcut.
- // AddAcceleratorToButton(back_, GDK_BackSpace, 0);
+ AddAcceleratorToButton(back_, GDK_BackSpace, 0);
forward_.reset(BuildBackForwardButton(IDR_FORWARD, IDR_FORWARD_P,
IDR_FORWARD_H, IDR_FORWARD_D,
l10n_util::GetStringUTF8(IDS_TOOLTIP_FORWARD)));
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc
index be98e95..b7a56e5 100644
--- a/chrome/browser/gtk/browser_window_gtk.cc
+++ b/chrome/browser/gtk/browser_window_gtk.cc
@@ -197,24 +197,26 @@ gboolean HandleCustomAccelerator(guint keyval, GdkModifierType modifier,
return FALSE;
}
-// Usually accelerators are checked before propagating the key event, but if the
-// focus is on the render area we want to reverse the order of things to allow
-// webkit to handle key events like ctrl-l.
+// Let the focused widget have first crack at the key event so we don't
+// override their accelerators.
gboolean OnKeyPress(GtkWindow* window, GdkEventKey* event, Browser* browser) {
+ // If a widget besides the native view is focused, we have to try to handle
+ // the custom accelerators before letting it handle them.
TabContents* current_tab_contents =
browser->tabstrip_model()->GetSelectedTabContents();
- // If there is no current tab contents or its view is gone (if the renderview
- // crashed) or it is not focused then let the default GtkWindow key handler
- // run.
+ // The current tab might not have a render view if it crashed.
if (!current_tab_contents || !current_tab_contents->GetContentNativeView() ||
!gtk_widget_is_focus(current_tab_contents->GetContentNativeView())) {
- return HandleCustomAccelerator(event->keyval,
- static_cast<GdkModifierType>(event->state), browser);
+ gboolean handled = HandleCustomAccelerator(event->keyval,
+ GdkModifierType(event->state), browser);
+ if (handled)
+ return TRUE;
}
- // If the content area is focused, let it handle the key event.
- gboolean result = gtk_window_propagate_key_event(window, event);
- DCHECK(result);
+ if (!gtk_window_propagate_key_event(window, event)) {
+ static_cast<BrowserWindowGtk*>(browser->window())->HandleAccelerator(
+ event->keyval, GdkModifierType(event->state));
+ }
return TRUE;
}
@@ -760,5 +762,6 @@ gboolean BrowserWindowGtk::OnGtkAccelerator(GtkAccelGroup* accel_group,
}
void BrowserWindowGtk::ExecuteBrowserCommand(int id) {
- browser_->ExecuteCommand(id);
+ if (browser_->command_updater()->IsCommandEnabled(id))
+ browser_->ExecuteCommand(id);
}