| Index: webkit/api/src/gtk/WebInputEventFactory.cpp | 
| =================================================================== | 
| --- webkit/api/src/gtk/WebInputEventFactory.cpp	(revision 19224) | 
| +++ webkit/api/src/gtk/WebInputEventFactory.cpp	(working copy) | 
| @@ -71,6 +71,101 @@ | 
| return modifiers; | 
| } | 
|  | 
| +static int gdkEventToWindowsKeyCode(const GdkEventKey* event) | 
| +{ | 
| +    static const unsigned int hardwareCodeToGDKKeyval[] = { | 
| +        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 | 
| +    }; | 
| + | 
| +    // |windowKeyCode| shouldn't change even when we change the keyboard | 
| +    // layout, e.g. when we type an 'A' key of a US keyboard on the French | 
| +    // layout, |windowsKeyCode| should be VK_A. On the other hand, | 
| +    // |event->keyval| may change when we change the keyboard layout (the | 
| +    // GdkKeymap object attached to the GdkDisplay object), e.g. when we type | 
| +    // an 'A' key of a US keyboard on the French (or Hebrew) layout, | 
| +    // |event->keyval| becomes GDK_q (or GDK_hebrew_shin). | 
| +    // To improve compatibilty with Windows, we use |event->hardware_keycode| | 
| +    // for retrieving its Windows key-code for the keys that can be changed by | 
| +    // GdkKeymap objects (keyboard-layout drivers). | 
| +    // We shouldn't use |event->hardware_keycode| for keys that GdkKeymap | 
| +    // objects cannot change because |event->hardware_keycode| doesn't change | 
| +    // even when we change the layout options, e.g. when we swap a control | 
| +    // key and a caps-lock key, GTK doesn't swap their | 
| +    // |event->hardware_keycode| values but swap their |event->keyval| values. | 
| +    const int tableSize = sizeof(hardwareCodeToGDKKeyval) / sizeof(hardwareCodeToGDKKeyval[0]); | 
| +    if (event->hardware_keycode < tableSize) { | 
| +        int keyval = hardwareCodeToGDKKeyval[event->hardware_keycode]; | 
| +        if (keyval) | 
| +            return WebCore::windowsKeyCodeForKeyEvent(keyval); | 
| +    } | 
| + | 
| +    // This key is one that keyboard-layout drivers cannot change. | 
| +    // Use |event->keyval| to retrieve its |windowsKeyCode| value. | 
| +    return WebCore::windowsKeyCodeForKeyEvent(event->keyval); | 
| +} | 
| + | 
| // WebKeyboardEvent ----------------------------------------------------------- | 
|  | 
| WebKeyboardEvent WebInputEventFactory::keyboardEvent(const GdkEventKey* event) | 
| @@ -85,7 +180,7 @@ | 
| result.type = WebInputEvent::KeyUp; | 
| break; | 
| case GDK_KEY_PRESS: | 
| -        result.type = WebInputEvent::KeyDown; | 
| +        result.type = WebInputEvent::RawKeyDown; | 
| break; | 
| default: | 
| ASSERT_NOT_REACHED(); | 
| @@ -94,7 +189,7 @@ | 
| // The key code tells us which physical key was pressed (for example, the | 
| // A key went down or up).  It does not determine whether A should be lower | 
| // or upper case.  This is what text does, which should be the keyval. | 
| -    result.windowsKeyCode = WebCore::windowsKeyCodeForKeyEvent(event->keyval); | 
| +    result.windowsKeyCode = gdkEventToWindowsKeyCode(event); | 
| result.nativeKeyCode = event->hardware_keycode; | 
|  | 
| switch (event->keyval) { | 
| @@ -119,6 +214,23 @@ | 
| return result; | 
| } | 
|  | 
| +WebKeyboardEvent WebInputEventFactory::keyboardEvent(wchar_t character, double timeStampSeconds) | 
| +{ | 
| +    // keyboardEvent(const GdkEventKey*) depends on the GdkEventKey object and | 
| +    // it is hard to use/ it from signal handlers which don't use GdkEventKey | 
| +    // objects (e.g. GtkIMContext signal handlers.) For such handlers, this | 
| +    // function creates a WebInputEvent::Char event without using a | 
| +    // GdkEventKey object. | 
| +    WebKeyboardEvent result; | 
| +    result.type = WebKit::WebInputEvent::Char; | 
| +    result.timeStampSeconds = timeStampSeconds; | 
| +    result.windowsKeyCode = character; | 
| +    result.nativeKeyCode = character; | 
| +    result.text[0] = character; | 
| +    result.unmodifiedText[0] = character; | 
| +    return result; | 
| +} | 
| + | 
| // WebMouseEvent -------------------------------------------------------------- | 
|  | 
| WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event) | 
|  |