diff options
author | suzhe@chromium.org <suzhe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-26 03:56:20 +0000 |
---|---|---|
committer | suzhe@chromium.org <suzhe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-26 03:56:20 +0000 |
commit | 14cbb6a5af82cc577b2fc3442d5a5df0a2b710de (patch) | |
tree | 39b3d408454d48099ef12ff7a8fca92072977cdd | |
parent | 4df55d887f46b11ff832cdeec3ced59215af9663 (diff) | |
download | chromium_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.cc | 32 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_window_gtk.h | 4 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_view_gtk.cc | 89 |
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, |