Index: Source/web/win/WebInputEventFactory.cpp |
diff --git a/Source/web/win/WebInputEventFactory.cpp b/Source/web/win/WebInputEventFactory.cpp |
deleted file mode 100644 |
index 11f83429258bfdaa9914fa07cc921d1175bb1453..0000000000000000000000000000000000000000 |
--- a/Source/web/win/WebInputEventFactory.cpp |
+++ /dev/null |
@@ -1,489 +0,0 @@ |
-/* |
- * Copyright (C) 2006-2009 Google Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions are |
- * met: |
- * |
- * * Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * * Redistributions in binary form must reproduce the above |
- * copyright notice, this list of conditions and the following disclaimer |
- * in the documentation and/or other materials provided with the |
- * distribution. |
- * * Neither the name of Google Inc. nor the names of its |
- * contributors may be used to endorse or promote products derived from |
- * this software without specific prior written permission. |
- * |
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "config.h" |
-#include "WebInputEventFactory.h" |
- |
-#include "WebInputEvent.h" |
- |
-#include "wtf/Assertions.h" |
- |
-namespace WebKit { |
- |
-static const unsigned long defaultScrollLinesPerWheelDelta = 3; |
-static const unsigned long defaultScrollCharsPerWheelDelta = 1; |
- |
-// WebKeyboardEvent ----------------------------------------------------------- |
- |
-static bool isKeyDown(WPARAM wparam) |
-{ |
- return GetKeyState(wparam) & 0x8000; |
-} |
- |
-static int getLocationModifier(WPARAM wparam, LPARAM lparam) |
-{ |
- int modifier = 0; |
- switch (wparam) { |
- case VK_RETURN: |
- if ((lparam >> 16) & KF_EXTENDED) |
- modifier = WebInputEvent::IsKeyPad; |
- break; |
- case VK_INSERT: |
- case VK_DELETE: |
- case VK_HOME: |
- case VK_END: |
- case VK_PRIOR: |
- case VK_NEXT: |
- case VK_UP: |
- case VK_DOWN: |
- case VK_LEFT: |
- case VK_RIGHT: |
- if (!((lparam >> 16) & KF_EXTENDED)) |
- modifier = WebInputEvent::IsKeyPad; |
- break; |
- case VK_NUMPAD0: |
- case VK_NUMPAD1: |
- case VK_NUMPAD2: |
- case VK_NUMPAD3: |
- case VK_NUMPAD4: |
- case VK_NUMPAD5: |
- case VK_NUMPAD6: |
- case VK_NUMPAD7: |
- case VK_NUMPAD8: |
- case VK_NUMPAD9: |
- case VK_DIVIDE: |
- case VK_MULTIPLY: |
- case VK_SUBTRACT: |
- case VK_ADD: |
- case VK_DECIMAL: |
- case VK_CLEAR: |
- modifier = WebInputEvent::IsKeyPad; |
- break; |
- case VK_SHIFT: |
- if (isKeyDown(VK_LSHIFT)) |
- modifier = WebInputEvent::IsLeft; |
- else if (isKeyDown(VK_RSHIFT)) |
- modifier = WebInputEvent::IsRight; |
- break; |
- case VK_CONTROL: |
- if (isKeyDown(VK_LCONTROL)) |
- modifier = WebInputEvent::IsLeft; |
- else if (isKeyDown(VK_RCONTROL)) |
- modifier = WebInputEvent::IsRight; |
- break; |
- case VK_MENU: |
- if (isKeyDown(VK_LMENU)) |
- modifier = WebInputEvent::IsLeft; |
- else if (isKeyDown(VK_RMENU)) |
- modifier = WebInputEvent::IsRight; |
- break; |
- case VK_LWIN: |
- modifier = WebInputEvent::IsLeft; |
- break; |
- case VK_RWIN: |
- modifier = WebInputEvent::IsRight; |
- break; |
- } |
- |
- ASSERT(!modifier |
- || modifier == WebInputEvent::IsKeyPad |
- || modifier == WebInputEvent::IsLeft |
- || modifier == WebInputEvent::IsRight); |
- return modifier; |
-} |
- |
-// Loads the state for toggle keys into the event. |
-static void SetToggleKeyState(WebInputEvent* event) |
-{ |
- // Low bit set from GetKeyState indicates "toggled". |
- if (::GetKeyState(VK_NUMLOCK) & 1) |
- event->modifiers |= WebInputEvent::NumLockOn; |
- if (::GetKeyState(VK_CAPITAL) & 1) |
- event->modifiers |= WebInputEvent::CapsLockOn; |
-} |
- |
-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 = static_cast<int>(wparam); |
- // Record the scan code (along with other context bits) for this key event. |
- result.nativeKeyCode = static_cast<int>(lparam); |
- |
- 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; |
- |
- result.modifiers |= getLocationModifier(wparam, lparam); |
- |
- SetToggleKeyState(&result); |
- return result; |
-} |
- |
-// WebMouseEvent -------------------------------------------------------------- |
- |
-static int gLastClickCount; |
-static double gLastClickTime; |
- |
-static LPARAM GetRelativeCursorPos(HWND hwnd) |
-{ |
- POINT pos = {-1, -1}; |
- GetCursorPos(&pos); |
- ScreenToClient(hwnd, &pos); |
- return MAKELPARAM(pos.x, pos.y); |
-} |
- |
-void WebInputEventFactory::resetLastClickState() |
-{ |
- gLastClickTime = gLastClickCount = 0; |
-} |
- |
-WebMouseEvent WebInputEventFactory::mouseEvent(HWND hwnd, UINT message, |
- WPARAM wparam, LPARAM lparam) |
-{ |
- WebMouseEvent result; //(WebInputEvent::Uninitialized()); |
- |
- switch (message) { |
- case WM_MOUSEMOVE: |
- result.type = WebInputEvent::MouseMove; |
- if (wparam & MK_LBUTTON) |
- result.button = WebMouseEvent::ButtonLeft; |
- else if (wparam & MK_MBUTTON) |
- result.button = WebMouseEvent::ButtonMiddle; |
- else if (wparam & MK_RBUTTON) |
- result.button = WebMouseEvent::ButtonRight; |
- else |
- result.button = WebMouseEvent::ButtonNone; |
- break; |
- case WM_MOUSELEAVE: |
- result.type = WebInputEvent::MouseLeave; |
- result.button = WebMouseEvent::ButtonNone; |
- // set the current mouse position (relative to the client area of the |
- // current window) since none is specified for this event |
- lparam = GetRelativeCursorPos(hwnd); |
- break; |
- case WM_LBUTTONDOWN: |
- case WM_LBUTTONDBLCLK: |
- result.type = WebInputEvent::MouseDown; |
- result.button = WebMouseEvent::ButtonLeft; |
- break; |
- case WM_MBUTTONDOWN: |
- case WM_MBUTTONDBLCLK: |
- result.type = WebInputEvent::MouseDown; |
- result.button = WebMouseEvent::ButtonMiddle; |
- break; |
- case WM_RBUTTONDOWN: |
- case WM_RBUTTONDBLCLK: |
- result.type = WebInputEvent::MouseDown; |
- result.button = WebMouseEvent::ButtonRight; |
- break; |
- case WM_LBUTTONUP: |
- result.type = WebInputEvent::MouseUp; |
- result.button = WebMouseEvent::ButtonLeft; |
- break; |
- case WM_MBUTTONUP: |
- result.type = WebInputEvent::MouseUp; |
- result.button = WebMouseEvent::ButtonMiddle; |
- break; |
- case WM_RBUTTONUP: |
- result.type = WebInputEvent::MouseUp; |
- result.button = WebMouseEvent::ButtonRight; |
- break; |
- default: |
- ASSERT_NOT_REACHED(); |
- } |
- |
- // 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; |
- |
- // set position fields: |
- |
- result.x = static_cast<short>(LOWORD(lparam)); |
- result.y = static_cast<short>(HIWORD(lparam)); |
- result.windowX = result.x; |
- result.windowY = result.y; |
- |
- POINT globalPoint = { result.x, result.y }; |
- ClientToScreen(hwnd, &globalPoint); |
- |
- result.globalX = globalPoint.x; |
- result.globalY = globalPoint.y; |
- |
- // calculate number of clicks: |
- |
- // This differs slightly from the WebKit code in WebKit/win/WebView.cpp |
- // where their original code looks buggy. |
- static int lastClickPositionX; |
- static int lastClickPositionY; |
- static WebMouseEvent::Button lastClickButton = WebMouseEvent::ButtonLeft; |
- |
- double currentTime = result.timeStampSeconds; |
- bool cancelPreviousClick = |
- (abs(lastClickPositionX - result.x) > (GetSystemMetrics(SM_CXDOUBLECLK) / 2)) |
- || (abs(lastClickPositionY - result.y) > (GetSystemMetrics(SM_CYDOUBLECLK) / 2)) |
- || ((currentTime - gLastClickTime) * 1000.0 > GetDoubleClickTime()); |
- |
- if (result.type == WebInputEvent::MouseDown) { |
- if (!cancelPreviousClick && (result.button == lastClickButton)) |
- ++gLastClickCount; |
- else { |
- gLastClickCount = 1; |
- lastClickPositionX = result.x; |
- lastClickPositionY = result.y; |
- } |
- gLastClickTime = currentTime; |
- lastClickButton = result.button; |
- } else if (result.type == WebInputEvent::MouseMove |
- || result.type == WebInputEvent::MouseLeave) { |
- if (cancelPreviousClick) { |
- gLastClickCount = 0; |
- lastClickPositionX = 0; |
- lastClickPositionY = 0; |
- gLastClickTime = 0; |
- } |
- } |
- result.clickCount = gLastClickCount; |
- |
- // set modifiers: |
- |
- if (wparam & MK_CONTROL) |
- result.modifiers |= WebInputEvent::ControlKey; |
- if (wparam & MK_SHIFT) |
- result.modifiers |= WebInputEvent::ShiftKey; |
- if (GetKeyState(VK_MENU) & 0x8000) |
- result.modifiers |= WebInputEvent::AltKey; |
- if (wparam & MK_LBUTTON) |
- result.modifiers |= WebInputEvent::LeftButtonDown; |
- if (wparam & MK_MBUTTON) |
- result.modifiers |= WebInputEvent::MiddleButtonDown; |
- if (wparam & MK_RBUTTON) |
- result.modifiers |= WebInputEvent::RightButtonDown; |
- |
- SetToggleKeyState(&result); |
- return result; |
-} |
- |
-// WebMouseWheelEvent --------------------------------------------------------- |
- |
-WebMouseWheelEvent WebInputEventFactory::mouseWheelEvent(HWND hwnd, UINT message, |
- WPARAM wparam, LPARAM lparam) |
-{ |
- WebMouseWheelEvent result; //(WebInputEvent::Uninitialized()); |
- |
- result.type = WebInputEvent::MouseWheel; |
- |
- // 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.button = WebMouseEvent::ButtonNone; |
- |
- // Get key state, coordinates, and wheel delta from event. |
- typedef SHORT (WINAPI *GetKeyStateFunction)(int key); |
- GetKeyStateFunction getKeyState; |
- UINT keyState; |
- float wheelDelta; |
- bool horizontalScroll = false; |
- if ((message == WM_VSCROLL) || (message == WM_HSCROLL)) { |
- // Synthesize mousewheel event from a scroll event. This is needed to |
- // simulate middle mouse scrolling in some laptops. Use GetAsyncKeyState |
- // for key state since we are synthesizing the input event. |
- getKeyState = GetAsyncKeyState; |
- keyState = 0; |
- if (getKeyState(VK_SHIFT)) |
- keyState |= MK_SHIFT; |
- if (getKeyState(VK_CONTROL)) |
- keyState |= MK_CONTROL; |
- // NOTE: There doesn't seem to be a way to query the mouse button state |
- // in this case. |
- |
- POINT cursorPosition = {0}; |
- GetCursorPos(&cursorPosition); |
- result.globalX = cursorPosition.x; |
- result.globalY = cursorPosition.y; |
- |
- switch (LOWORD(wparam)) { |
- case SB_LINEUP: // == SB_LINELEFT |
- wheelDelta = WHEEL_DELTA; |
- break; |
- case SB_LINEDOWN: // == SB_LINERIGHT |
- wheelDelta = -WHEEL_DELTA; |
- break; |
- case SB_PAGEUP: |
- wheelDelta = 1; |
- result.scrollByPage = true; |
- break; |
- case SB_PAGEDOWN: |
- wheelDelta = -1; |
- result.scrollByPage = true; |
- break; |
- default: // We don't supoprt SB_THUMBPOSITION or SB_THUMBTRACK here. |
- wheelDelta = 0; |
- break; |
- } |
- |
- if (message == WM_HSCROLL) |
- horizontalScroll = true; |
- } else { |
- // Non-synthesized event; we can just read data off the event. |
- getKeyState = GetKeyState; |
- keyState = GET_KEYSTATE_WPARAM(wparam); |
- |
- result.globalX = static_cast<short>(LOWORD(lparam)); |
- result.globalY = static_cast<short>(HIWORD(lparam)); |
- |
- wheelDelta = static_cast<float>(GET_WHEEL_DELTA_WPARAM(wparam)); |
- if (message == WM_MOUSEHWHEEL) { |
- horizontalScroll = true; |
- wheelDelta = -wheelDelta; // Windows is <- -/+ ->, WebKit <- +/- ->. |
- } |
- } |
- if (keyState & MK_SHIFT) |
- horizontalScroll = true; |
- |
- // Set modifiers based on key state. |
- if (keyState & MK_SHIFT) |
- result.modifiers |= WebInputEvent::ShiftKey; |
- if (keyState & MK_CONTROL) |
- result.modifiers |= WebInputEvent::ControlKey; |
- if (getKeyState(VK_MENU) & 0x8000) |
- result.modifiers |= WebInputEvent::AltKey; |
- if (keyState & MK_LBUTTON) |
- result.modifiers |= WebInputEvent::LeftButtonDown; |
- if (keyState & MK_MBUTTON) |
- result.modifiers |= WebInputEvent::MiddleButtonDown; |
- if (keyState & MK_RBUTTON) |
- result.modifiers |= WebInputEvent::RightButtonDown; |
- |
- SetToggleKeyState(&result); |
- |
- // Set coordinates by translating event coordinates from screen to client. |
- POINT clientPoint = { result.globalX, result.globalY }; |
- MapWindowPoints(0, hwnd, &clientPoint, 1); |
- result.x = clientPoint.x; |
- result.y = clientPoint.y; |
- result.windowX = result.x; |
- result.windowY = result.y; |
- |
- // Convert wheel delta amount to a number of pixels to scroll. |
- // |
- // How many pixels should we scroll per line? Gecko uses the height of the |
- // current line, which means scroll distance changes as you go through the |
- // page or go to different pages. IE 8 is ~60 px/line, although the value |
- // seems to vary slightly by page and zoom level. Also, IE defaults to |
- // smooth scrolling while Firefox doesn't, so it can get away with somewhat |
- // larger scroll values without feeling as jerky. Here we use 100 px per |
- // three lines (the default scroll amount is three lines per wheel tick). |
- // Even though we have smooth scrolling, we don't make this as large as IE |
- // because subjectively IE feels like it scrolls farther than you want while |
- // reading articles. |
- static const float scrollbarPixelsPerLine = 100.0f / 3.0f; |
- wheelDelta /= WHEEL_DELTA; |
- float scrollDelta = wheelDelta; |
- if (horizontalScroll) { |
- unsigned long scrollChars = defaultScrollCharsPerWheelDelta; |
- SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &scrollChars, 0); |
- // TODO(pkasting): Should probably have a different multiplier |
- // scrollbarPixelsPerChar here. |
- scrollDelta *= static_cast<float>(scrollChars) * scrollbarPixelsPerLine; |
- } else { |
- unsigned long scrollLines = defaultScrollLinesPerWheelDelta; |
- SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scrollLines, 0); |
- if (scrollLines == WHEEL_PAGESCROLL) |
- result.scrollByPage = true; |
- if (!result.scrollByPage) |
- scrollDelta *= static_cast<float>(scrollLines) * scrollbarPixelsPerLine; |
- } |
- |
- // Set scroll amount based on above calculations. WebKit expects positive |
- // deltaY to mean "scroll up" and positive deltaX to mean "scroll left". |
- if (horizontalScroll) { |
- result.deltaX = scrollDelta; |
- result.wheelTicksX = wheelDelta; |
- } else { |
- result.deltaY = scrollDelta; |
- result.wheelTicksY = wheelDelta; |
- } |
- |
- return result; |
-} |
- |
-} // namespace WebKit |