diff options
Diffstat (limited to 'webkit/glue/webinputevent_win.cc')
-rw-r--r-- | webkit/glue/webinputevent_win.cc | 345 |
1 files changed, 0 insertions, 345 deletions
diff --git a/webkit/glue/webinputevent_win.cc b/webkit/glue/webinputevent_win.cc deleted file mode 100644 index 9dd4d85..0000000 --- a/webkit/glue/webinputevent_win.cc +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "config.h" - -#include "webkit/glue/webinputevent.h" - -#include "base/logging.h" -#include "base/string_util.h" -#include "webkit/glue/webinputevent_util.h" - -static const unsigned long kDefaultScrollLinesPerWheelDelta = 3; -static const unsigned long kDefaultScrollCharsPerWheelDelta = 1; - -// WebMouseEvent -------------------------------------------------------------- - -static LPARAM GetRelativeCursorPos(HWND hwnd) { - POINT pos = {-1, -1}; - GetCursorPos(&pos); - ScreenToClient(hwnd, &pos); - return MAKELPARAM(pos.x, pos.y); -} - -WebMouseEvent::WebMouseEvent(HWND hwnd, UINT message, WPARAM wparam, - LPARAM lparam) { - switch (message) { - case WM_MOUSEMOVE: - type = MOUSE_MOVE; - if (wparam & MK_LBUTTON) - button = BUTTON_LEFT; - else if (wparam & MK_MBUTTON) - button = BUTTON_MIDDLE; - else if (wparam & MK_RBUTTON) - button = BUTTON_MIDDLE; - else - button = BUTTON_NONE; - break; - case WM_MOUSELEAVE: - type = MOUSE_LEAVE; - button = BUTTON_NONE; - // 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: - type = MOUSE_DOWN; - button = BUTTON_LEFT; - break; - case WM_MBUTTONDOWN: - type = MOUSE_DOWN; - button = BUTTON_MIDDLE; - break; - case WM_RBUTTONDOWN: - type = MOUSE_DOWN; - button = BUTTON_RIGHT; - break; - case WM_LBUTTONUP: - type = MOUSE_UP; - button = BUTTON_LEFT; - break; - case WM_MBUTTONUP: - type = MOUSE_UP; - button = BUTTON_MIDDLE; - break; - case WM_RBUTTONUP: - type = MOUSE_UP; - button = BUTTON_RIGHT; - break; - case WM_LBUTTONDBLCLK: - type = MOUSE_DOUBLE_CLICK; - button = BUTTON_LEFT; - break; - case WM_MBUTTONDBLCLK: - type = MOUSE_DOUBLE_CLICK; - button = BUTTON_MIDDLE; - break; - case WM_RBUTTONDBLCLK: - type = MOUSE_DOUBLE_CLICK; - button = BUTTON_RIGHT; - break; - default: - NOTREACHED() << "unexpected native message"; - } - - // set position fields: - - x = static_cast<short>(LOWORD(lparam)); - y = static_cast<short>(HIWORD(lparam)); - - POINT global_point = { x, y }; - ClientToScreen(hwnd, &global_point); - - global_x = global_point.x; - global_y = global_point.y; - - // set modifiers: - - if (wparam & MK_CONTROL) - modifiers |= CTRL_KEY; - if (wparam & MK_SHIFT) - modifiers |= SHIFT_KEY; - if (GetKeyState(VK_MENU) & 0x8000) - modifiers |= (ALT_KEY | META_KEY); // TODO(darin): set META properly - - // TODO(pkasting): http://b/1117926 Instead of using GetTickCount() here, we - // should use GetMessageTime() on the original Windows message in the browser - // process, and pass that in the WebMouseEvent. - timestamp_sec = GetTickCount() / 1000.0; - - layout_test_click_count = 0; -} - -// WebMouseWheelEvent --------------------------------------------------------- - -WebMouseWheelEvent::WebMouseWheelEvent(HWND hwnd, - UINT message, - WPARAM wparam, - LPARAM lparam) - : scroll_by_page(false) { - type = MOUSE_WHEEL; - button = BUTTON_NONE; - - // Get key state, coordinates, and wheel delta from event. - typedef SHORT (WINAPI *GetKeyStateFunction)(int key); - GetKeyStateFunction get_key_state; - UINT key_state; - float wheel_delta; - bool horizontal_scroll = 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. - get_key_state = GetAsyncKeyState; - key_state = 0; - if (get_key_state(VK_SHIFT)) - key_state |= MK_SHIFT; - if (get_key_state(VK_CONTROL)) - key_state |= MK_CONTROL; - - POINT cursor_position = {0}; - GetCursorPos(&cursor_position); - global_x = cursor_position.x; - global_y = cursor_position.y; - - switch (LOWORD(wparam)) { - case SB_LINEUP: // == SB_LINELEFT - wheel_delta = WHEEL_DELTA; - break; - case SB_LINEDOWN: // == SB_LINERIGHT - wheel_delta = -WHEEL_DELTA; - break; - case SB_PAGEUP: - wheel_delta = 1; - scroll_by_page = true; - break; - case SB_PAGEDOWN: - wheel_delta = -1; - scroll_by_page = true; - break; - default: // We don't supoprt SB_THUMBPOSITION or SB_THUMBTRACK here. - wheel_delta = 0; - break; - } - - if (message == WM_HSCROLL) - horizontal_scroll = true; - } else { - // Non-synthesized event; we can just read data off the event. - get_key_state = GetKeyState; - key_state = GET_KEYSTATE_WPARAM(wparam); - - global_x = static_cast<short>(LOWORD(lparam)); - global_y = static_cast<short>(HIWORD(lparam)); - - wheel_delta = static_cast<float>(GET_WHEEL_DELTA_WPARAM(wparam)); - if (message == WM_MOUSEHWHEEL) { - horizontal_scroll = true; - wheel_delta = -wheel_delta; // Windows is <- -/+ ->, WebKit <- +/- ->. - } - } - if (key_state & MK_SHIFT) - horizontal_scroll = true; - - // Set modifiers based on key state. - if (key_state & MK_SHIFT) - modifiers |= SHIFT_KEY; - if (key_state & MK_CONTROL) - modifiers |= CTRL_KEY; - if (get_key_state(VK_MENU) & 0x8000) - modifiers |= (ALT_KEY | META_KEY); - - // Set coordinates by translating event coordinates from screen to client. - POINT client_point = { global_x, global_y }; - MapWindowPoints(NULL, hwnd, &client_point, 1); - x = client_point.x; - y = client_point.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 7 is ~50 px/line, although the value - // seems to vary slightly by page and zoom level. Since IE 7 has a smoothing - // algorithm on scrolling, it can get away with slightly larger scroll values - // without feeling jerky. Here we use 100 px per three lines (the default - // scroll amount is three lines per wheel tick). - static const float kScrollbarPixelsPerLine = 100.0f / 3.0f; - wheel_delta /= WHEEL_DELTA; - float scroll_delta = wheel_delta; - if (horizontal_scroll) { - unsigned long scroll_chars = kDefaultScrollCharsPerWheelDelta; - SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &scroll_chars, 0); - // TODO(pkasting): Should probably have a different multiplier - // kScrollbarPixelsPerChar here. - scroll_delta *= static_cast<float>(scroll_chars) * kScrollbarPixelsPerLine; - } else { - unsigned long scroll_lines = kDefaultScrollLinesPerWheelDelta; - SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scroll_lines, 0); - if (scroll_lines == WHEEL_PAGESCROLL) - scroll_by_page = true; - if (!scroll_by_page) { - scroll_delta *= - static_cast<float>(scroll_lines) * kScrollbarPixelsPerLine; - } - } - - // Set scroll amount based on above calculations. WebKit expects positive - // delta_y to mean "scroll up" and positive delta_x to mean "scroll left". - if (horizontal_scroll) { - delta_x = scroll_delta; - delta_y = 0; - wheel_ticks_x = wheel_delta; - wheel_ticks_y = 0; - } else { - delta_x = 0; - delta_y = scroll_delta; - wheel_ticks_x = 0; - wheel_ticks_y = wheel_delta; - } -} - -// WebKeyboardEvent ----------------------------------------------------------- - -bool IsKeyPad(WPARAM wparam, LPARAM lparam) { - bool keypad = false; - switch (wparam) { - case VK_RETURN: - keypad = (lparam >> 16) & KF_EXTENDED; - 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: - keypad = !((lparam >> 16) & KF_EXTENDED); - break; - case VK_NUMLOCK: - 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: - keypad = true; - break; - default: - keypad = false; - } - - return keypad; -} - -WebKeyboardEvent::WebKeyboardEvent(HWND hwnd, UINT message, WPARAM wparam, - LPARAM lparam) { - system_key = false; - - windows_key_code = native_key_code = static_cast<int>(wparam); - - switch (message) { - case WM_SYSKEYDOWN: - system_key = true; - case WM_KEYDOWN: - type = RAW_KEY_DOWN; - break; - case WM_SYSKEYUP: - system_key = true; - case WM_KEYUP: - type = KEY_UP; - break; - case WM_IME_CHAR: - type = CHAR; - break; - case WM_SYSCHAR: - system_key = true; - type = CHAR; - case WM_CHAR: - type = CHAR; - break; - default: - NOTREACHED() << "unexpected native message: " << message; - } - - memset(&text, 0, sizeof(text)); - memset(&unmodified_text, 0, sizeof(unmodified_text)); - memset(&key_identifier, 0, sizeof(key_identifier)); - - if (type == CHAR || type == RAW_KEY_DOWN) { - text[0] = windows_key_code; - unmodified_text[0] = windows_key_code; - } - if (type != CHAR) { - std::string key_identifier_str = - webkit_glue::GetKeyIdentifierForWindowsKeyCode(windows_key_code); - base::strlcpy(key_identifier, key_identifier_str.c_str(), - kIdentifierLengthCap); - } - - if (GetKeyState(VK_SHIFT) & 0x8000) - modifiers |= SHIFT_KEY; - if (GetKeyState(VK_CONTROL) & 0x8000) - modifiers |= CTRL_KEY; - if (GetKeyState(VK_MENU) & 0x8000) - modifiers |= (ALT_KEY | META_KEY); - - if (LOWORD(lparam) > 1) - modifiers |= IS_AUTO_REPEAT; - if (IsKeyPad(wparam, lparam)) - modifiers |= IS_KEYPAD; -} |