WebKeyboardEvent WebInputEventFactory::keyboardEvent(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { WebKeyboardEvent result; // TODO(pkasting): http://b/1117926 Are we guaranteed that the message that // GetMessageTime() refers to is the same one that we're passed in? Perhaps // one of the construction parameters should be the time passed by the // caller, who would know for sure. result.timeStampSeconds = GetMessageTime() / 1000.0; result.windowsKeyCode = result.nativeKeyCode = static_cast<int>(wparam); switch (message) { case WM_SYSKEYDOWN: result.isSystemKey = true; case WM_KEYDOWN: result.type = WebInputEvent::RawKeyDown; break; case WM_SYSKEYUP: result.isSystemKey = true; case WM_KEYUP: result.type = WebInputEvent::KeyUp; break; case WM_IME_CHAR: result.type = WebInputEvent::Char; break; case WM_SYSCHAR: result.isSystemKey = true; result.type = WebInputEvent::Char; case WM_CHAR: result.type = WebInputEvent::Char; break; default: ASSERT_NOT_REACHED(); } if (result.type == WebInputEvent::Char || result.type == WebInputEvent::RawKeyDown) { result.text[0] = result.windowsKeyCode; result.unmodifiedText[0] = result.windowsKeyCode; } if (result.type != WebInputEvent::Char) result.setKeyIdentifierFromWindowsKeyCode(); if (GetKeyState(VK_SHIFT) & 0x8000) result.modifiers |= WebInputEvent::ShiftKey; if (GetKeyState(VK_CONTROL) & 0x8000) result.modifiers |= WebInputEvent::ControlKey; if (GetKeyState(VK_MENU) & 0x8000) result.modifiers |= WebInputEvent::AltKey; // NOTE: There doesn't seem to be a way to query the mouse button state in // this case. if (LOWORD(lparam) > 1) result.modifiers |= WebInputEvent::IsAutoRepeat; if (isKeyPad(wparam, lparam)) result.modifiers |= WebInputEvent::IsKeyPad; return result; }
WebKeyboardEvent WebInputEventFactory::keyboardEvent(WebInputEvent::Type type, int modifiers, double timeStampSeconds, int keycode, WebUChar unicodeCharacter, bool isSystemKey) { WebKeyboardEvent result; result.type = type; result.modifiers = modifiers; result.timeStampSeconds = timeStampSeconds; int windowsKeyCode = WebCore::windowsKeyCodeForKeyEvent(keycode); result.windowsKeyCode = WebKeyboardEvent::windowsKeyCodeWithoutLocation(windowsKeyCode); result.modifiers |= WebKeyboardEvent::locationModifiersFromWindowsKeyCode(windowsKeyCode); result.nativeKeyCode = keycode; result.unmodifiedText[0] = unicodeCharacter; if (result.windowsKeyCode == WebCore::VKEY_RETURN) { // This is the same behavior as GTK: // 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'; } result.text[0] = result.unmodifiedText[0]; result.setKeyIdentifierFromWindowsKeyCode(); result.isSystemKey = isSystemKey; return result; }
WebKeyboardEvent WebInputEventFactory::keyboardEvent(const GdkEventKey* event) { WebKeyboardEvent result; result.timeStampSeconds = gdkEventTimeToWebEventTime(event->time); result.modifiers = gdkStateToWebEventModifiers(normalizeEventState(event)); switch (event->type) { case GDK_KEY_RELEASE: result.type = WebInputEvent::KeyUp; break; case GDK_KEY_PRESS: result.type = WebInputEvent::RawKeyDown; break; default: ASSERT_NOT_REACHED(); } // According to MSDN: // http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx // Key events with Alt modifier and F10 are system key events. // We just emulate this behavior. It's necessary to prevent webkit from // processing keypress event generated by alt-d, etc. // F10 is not special on Linux, so don't treat it as system key. if (result.modifiers & WebInputEvent::AltKey) result.isSystemKey = true; // 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. int windowsKeyCode = gdkEventToWindowsKeyCode(event); result.windowsKeyCode = WebKeyboardEvent::windowsKeyCodeWithoutLocation(windowsKeyCode); result.modifiers |= WebKeyboardEvent::locationModifiersFromWindowsKeyCode(windowsKeyCode); result.nativeKeyCode = event->hardware_keycode; 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 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? if (isKeyPadKeyval(event->keyval)) result.modifiers |= WebInputEvent::IsKeyPad; return result; }
void WebDevToolsAgentImpl::dispatchKeyEvent(const PlatformKeyboardEvent& event) { m_generatingEvent = true; WebKeyboardEvent webEvent = WebKeyboardEventBuilder(event); if (!webEvent.keyIdentifier[0] && webEvent.type != WebInputEvent::Char) webEvent.setKeyIdentifierFromWindowsKeyCode(); m_webViewImpl->handleInputEvent(webEvent); m_generatingEvent = false; }
void TextInputController::setComposition(const CppArgumentList& arguments, CppVariant* result) { result->setNull(); if (arguments.size() < 1) return; // Sends a keydown event with key code = 0xE5 to emulate input method behavior. WebKeyboardEvent keyDown; keyDown.type = WebInputEvent::RawKeyDown; keyDown.modifiers = 0; keyDown.windowsKeyCode = 0xE5; // VKEY_PROCESSKEY keyDown.setKeyIdentifierFromWindowsKeyCode(); m_webView->handleInputEvent(keyDown); WebVector<WebCompositionUnderline> underlines; WebString text(WebString::fromUTF8(arguments[0].toString())); m_webView->setComposition(text, underlines, 0, text.length()); }