| Index: webkit/api/src/gtk/WebInputEventFactory.cpp
|
| ===================================================================
|
| --- webkit/api/src/gtk/WebInputEventFactory.cpp (revision 25971)
|
| +++ webkit/api/src/gtk/WebInputEventFactory.cpp (working copy)
|
| @@ -170,6 +170,52 @@
|
| return WebCore::windowsKeyCodeForKeyEvent(event->keyval);
|
| }
|
|
|
| +// Gets the corresponding control character of a specified key code. See:
|
| +// http://en.wikipedia.org/wiki/Control_characters
|
| +// We emulate Windows behavior here.
|
| +static WebUChar getControlCharacter(int windowsKeyCode, bool shift)
|
| +{
|
| + if (windowsKeyCode >= WebCore::VKEY_A && windowsKeyCode <= WebCore::VKEY_Z) {
|
| + // ctrl-A ~ ctrl-Z map to \x01 ~ \x1A
|
| + return windowsKeyCode - WebCore::VKEY_A + 1;
|
| + }
|
| + if (shift) {
|
| + // following graphics chars require shift key to input.
|
| + switch (windowsKeyCode) {
|
| + // ctrl-@ maps to \x00 (Null byte)
|
| + case WebCore::VKEY_2:
|
| + return 0;
|
| + // ctrl-^ maps to \x1E (Record separator, Information separator two)
|
| + case WebCore::VKEY_6:
|
| + return 0x1E;
|
| + // ctrl-_ maps to \x1F (Unit separator, Information separator one)
|
| + case WebCore::VKEY_OEM_MINUS:
|
| + return 0x1F;
|
| + // Returns 0 for all other keys to avoid inputting unexpected chars.
|
| + default:
|
| + return 0;
|
| + }
|
| + } else {
|
| + switch (windowsKeyCode) {
|
| + // ctrl-[ maps to \x1B (Escape)
|
| + case WebCore::VKEY_OEM_4:
|
| + return 0x1B;
|
| + // ctrl-\ maps to \x1C (File separator, Information separator four)
|
| + case WebCore::VKEY_OEM_5:
|
| + return 0x1C;
|
| + // ctrl-] maps to \x1D (Group separator, Information separator three)
|
| + case WebCore::VKEY_OEM_6:
|
| + return 0x1D;
|
| + // ctrl-Enter maps to \x0A (Line feed)
|
| + case WebCore::VKEY_RETURN:
|
| + return 0x0A;
|
| + // Returns 0 for all other keys to avoid inputting unexpected chars.
|
| + default:
|
| + return 0;
|
| + }
|
| + }
|
| +}
|
| +
|
| // WebKeyboardEvent -----------------------------------------------------------
|
|
|
| WebKeyboardEvent WebInputEventFactory::keyboardEvent(const GdkEventKey* event)
|
| @@ -205,24 +251,22 @@
|
| result.windowsKeyCode = gdkEventToWindowsKeyCode(event);
|
| result.nativeKeyCode = event->hardware_keycode;
|
|
|
| - switch (event->keyval) {
|
| - // We need to treat the enter key as a key press of character \r. This
|
| - // is apparently just how webkit handles it and what it expects.
|
| - case GDK_ISO_Enter:
|
| - case GDK_KP_Enter:
|
| - case GDK_Return:
|
| - result.unmodifiedText[0] = result.text[0] = static_cast<WebUChar>('\r');
|
| - break;
|
| - default:
|
| - // This should set text to 0 when it's not a real character.
|
| + if (result.windowsKeyCode == WebCore::VKEY_RETURN)
|
| + // We need to treat the enter key as a key press of character \r. This
|
| + // is apparently just how webkit handles it and what it expects.
|
| + result.unmodifiedText[0] = '\r';
|
| + else
|
| // FIXME: fix for non BMP chars
|
| - // TODO(james.su@gmail.com):
|
| - // Support control characters input like Windows.
|
| - // See: http://en.wikipedia.org/wiki/Control_characters
|
| - result.unmodifiedText[0] = result.text[0] =
|
| + result.unmodifiedText[0] =
|
| static_cast<WebUChar>(gdk_keyval_to_unicode(event->keyval));
|
| - }
|
|
|
| + // If ctrl key is pressed down, then control character shall be input.
|
| + if (result.modifiers & WebInputEvent::ControlKey)
|
| + result.text[0] = getControlCharacter(
|
| + result.windowsKeyCode, result.modifiers & WebInputEvent::ShiftKey);
|
| + else
|
| + result.text[0] = result.unmodifiedText[0];
|
| +
|
| result.setKeyIdentifierFromWindowsKeyCode();
|
|
|
| // FIXME: Do we need to set IsAutoRepeat or IsKeyPad?
|
|
|