summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsuzhe@chromium.org <suzhe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-26 03:56:20 +0000
committersuzhe@chromium.org <suzhe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-26 03:56:20 +0000
commit14cbb6a5af82cc577b2fc3442d5a5df0a2b710de (patch)
tree39b3d408454d48099ef12ff7a8fca92072977cdd
parent4df55d887f46b11ff832cdeec3ced59215af9663 (diff)
downloadchromium_src-14cbb6a5af82cc577b2fc3442d5a5df0a2b710de.zip
chromium_src-14cbb6a5af82cc577b2fc3442d5a5df0a2b710de.tar.gz
chromium_src-14cbb6a5af82cc577b2fc3442d5a5df0a2b710de.tar.bz2
Improves key event handing code of BrowserWindowGtk.
This CL improves the key event handing code of BrowserWindowGtk. Issue 20118 is also fixed. BUG=20118: Typing a colon (:) into the address bar causes the browser to freeze TEST=Run chrome with a XIM input method, chrome and x server's cpu usage shall be very low after pressing shift key (or any other modifier key) in omnibox. Review URL: http://codereview.chromium.org/173344 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24422 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/gtk/browser_window_gtk.cc32
-rw-r--r--chrome/browser/gtk/browser_window_gtk.h4
-rw-r--r--chrome/browser/tab_contents/tab_contents_view_gtk.cc89
3 files changed, 28 insertions, 97 deletions
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc
index 2c559ca..1a7f8b2c 100644
--- a/chrome/browser/gtk/browser_window_gtk.cc
+++ b/chrome/browser/gtk/browser_window_gtk.cc
@@ -437,12 +437,20 @@ gboolean OnKeyPress(GtkWindow* window, GdkEventKey* event, Browser* browser) {
return TRUE;
}
- return gtk_window_propagate_key_event(window, event);
+ // Propagate the key event to child widget first, so we don't override their
+ // accelerators.
+ if (!gtk_window_propagate_key_event(window, event)) {
+ if (!gtk_window_activate_key(window, event)) {
+ gtk_bindings_activate_event(GTK_OBJECT(window), event);
+ }
+ }
} else {
bool rv = gtk_window_propagate_key_event(window, event);
DCHECK(rv);
- return TRUE;
}
+
+ // Prevents the default handler from handling this event.
+ return TRUE;
}
GdkCursorType GdkWindowEdgeToGdkCursorType(GdkWindowEdge edge) {
@@ -533,11 +541,21 @@ BrowserWindowGtk::~BrowserWindowGtk() {
}
}
-void BrowserWindowGtk::HandleAccelerator(guint keyval,
- GdkModifierType modifier) {
- if (!HandleCustomAccelerator(keyval, modifier, browser_.get())) {
- // Pass the accelerator on to GTK.
- gtk_accel_groups_activate(G_OBJECT(window_), keyval, modifier);
+void BrowserWindowGtk::HandleKeyboardEvent(GdkEventKey* event) {
+ // Handles a key event in following sequence:
+ // 1. Our special key accelerators, such as ctrl-tab, etc.
+ // 2. Gtk mnemonics and accelerators.
+ // 3. Gtk binding set.
+ // This sequence matches the default key press handler of GtkWindow.
+ //
+ // It's not necessary to care about the keyboard layout issue, as
+ // gtk_window_activate_key() and gtk_bindings_activate_event() take care of it
+ // automatically.
+ if (!HandleCustomAccelerator(event->keyval, GdkModifierType(event->state),
+ browser_.get())) {
+ if (!gtk_window_activate_key(window_, event)) {
+ gtk_bindings_activate_event(GTK_OBJECT(window_), event);
+ }
}
}
diff --git a/chrome/browser/gtk/browser_window_gtk.h b/chrome/browser/gtk/browser_window_gtk.h
index 0c684b2..7a35e9f 100644
--- a/chrome/browser/gtk/browser_window_gtk.h
+++ b/chrome/browser/gtk/browser_window_gtk.h
@@ -55,8 +55,8 @@ class BrowserWindowGtk : public BrowserWindow,
Browser* browser() const { return browser_.get(); }
- // Process a keyboard input and try to find an accelerator for it.
- void HandleAccelerator(guint keyval, GdkModifierType modifier);
+ // Process a keyboard event which was not handled by webkit.
+ void HandleKeyboardEvent(GdkEventKey* event);
// Overridden from BrowserWindow
virtual void Show();
diff --git a/chrome/browser/tab_contents/tab_contents_view_gtk.cc b/chrome/browser/tab_contents/tab_contents_view_gtk.cc
index d08c780..aba3c6e 100644
--- a/chrome/browser/tab_contents/tab_contents_view_gtk.cc
+++ b/chrome/browser/tab_contents/tab_contents_view_gtk.cc
@@ -104,91 +104,6 @@ void SetSizeRequest(GtkWidget* widget, gpointer userdata) {
}
}
-int GdkEventKeyToLayoutIndependentKeyval(const GdkEventKey* event) {
- // This function is a copy of WebKit::gdkEventToWindowsKeyCode() but returns
- // a GDK key value instead of a Windows virtual key code.
- static const int kHardwareCodeToGdkKeyval[] = {
- 0, // 0x00:
- 0, // 0x01:
- 0, // 0x02:
- 0, // 0x03:
- 0, // 0x04:
- 0, // 0x05:
- 0, // 0x06:
- 0, // 0x07:
- 0, // 0x08:
- 0, // 0x09: GDK_Escape
- GDK_1, // 0x0A: GDK_1
- GDK_2, // 0x0B: GDK_2
- GDK_3, // 0x0C: GDK_3
- GDK_4, // 0x0D: GDK_4
- GDK_5, // 0x0E: GDK_5
- GDK_6, // 0x0F: GDK_6
- GDK_7, // 0x10: GDK_7
- GDK_8, // 0x11: GDK_8
- GDK_9, // 0x12: GDK_9
- GDK_0, // 0x13: GDK_0
- GDK_minus, // 0x14: GDK_minus
- GDK_equal, // 0x15: GDK_equal
- 0, // 0x16: GDK_BackSpace
- 0, // 0x17: GDK_Tab
- GDK_q, // 0x18: GDK_q
- GDK_w, // 0x19: GDK_w
- GDK_e, // 0x1A: GDK_e
- GDK_r, // 0x1B: GDK_r
- GDK_t, // 0x1C: GDK_t
- GDK_y, // 0x1D: GDK_y
- GDK_u, // 0x1E: GDK_u
- GDK_i, // 0x1F: GDK_i
- GDK_o, // 0x20: GDK_o
- GDK_p, // 0x21: GDK_p
- GDK_bracketleft, // 0x22: GDK_bracketleft
- GDK_bracketright, // 0x23: GDK_bracketright
- 0, // 0x24: GDK_Return
- 0, // 0x25: GDK_Control_L
- GDK_a, // 0x26: GDK_a
- GDK_s, // 0x27: GDK_s
- GDK_d, // 0x28: GDK_d
- GDK_f, // 0x29: GDK_f
- GDK_g, // 0x2A: GDK_g
- GDK_h, // 0x2B: GDK_h
- GDK_j, // 0x2C: GDK_j
- GDK_k, // 0x2D: GDK_k
- GDK_l, // 0x2E: GDK_l
- GDK_semicolon, // 0x2F: GDK_semicolon
- GDK_apostrophe, // 0x30: GDK_apostrophe
- GDK_grave, // 0x31: GDK_grave
- 0, // 0x32: GDK_Shift_L
- GDK_backslash, // 0x33: GDK_backslash
- GDK_z, // 0x34: GDK_z
- GDK_x, // 0x35: GDK_x
- GDK_c, // 0x36: GDK_c
- GDK_v, // 0x37: GDK_v
- GDK_b, // 0x38: GDK_b
- GDK_n, // 0x39: GDK_n
- GDK_m, // 0x3A: GDK_m
- GDK_comma, // 0x3B: GDK_comma
- GDK_period, // 0x3C: GDK_period
- GDK_slash, // 0x3D: GDK_slash
- 0, // 0x3E: GDK_Shift_R
- };
-
- // If this |event->keyval| represents an ASCII character, we use it for
- // accelerators. Otherwise, we look up a table from a hardware keycode to
- // keyval and use its result.
- wchar_t c = gdk_keyval_to_unicode(event->keyval);
- if (c <= 0x7F)
- return event->keyval;
-
- if (event->hardware_keycode < arraysize(kHardwareCodeToGdkKeyval)) {
- int keyval = kHardwareCodeToGdkKeyval[event->hardware_keycode];
- if (keyval)
- return keyval;
- }
-
- return event->keyval;
-}
-
} // namespace
// A helper class that handles DnD for drops in the renderer. In GTK parlance,
@@ -654,9 +569,7 @@ void TabContentsViewGtk::HandleKeyboardEvent(
BrowserWindowGtk* browser_window =
BrowserWindowGtk::GetBrowserWindowForNativeWindow(window);
DCHECK(browser_window);
- browser_window->HandleAccelerator(
- GdkEventKeyToLayoutIndependentKeyval(event.os_event),
- static_cast<GdkModifierType>(event.os_event->state));
+ browser_window->HandleKeyboardEvent(event.os_event);
}
void TabContentsViewGtk::Observe(NotificationType type,