Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1831)

Unified Diff: webkit/glue/webinputevent_win.cc

Issue 40135: Various fixes to mouse wheel scrolling:... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« webkit/glue/webinputevent_mac.mm ('K') | « webkit/glue/webinputevent_mac.mm ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/glue/webinputevent_win.cc
===================================================================
--- webkit/glue/webinputevent_win.cc (revision 10933)
+++ webkit/glue/webinputevent_win.cc (working copy)
@@ -11,6 +11,7 @@
#include "webkit/glue/webinputevent_util.h"
static const unsigned long kDefaultScrollLinesPerWheelDelta = 3;
+static const unsigned long kDefaultScrollCharsPerWheelDelta = 1;
// WebMouseEvent --------------------------------------------------------------
@@ -112,45 +113,36 @@
// WebMouseWheelEvent ---------------------------------------------------------
-WebMouseWheelEvent::WebMouseWheelEvent(HWND hwnd, UINT message, WPARAM wparam,
- LPARAM lparam) {
+WebMouseWheelEvent::WebMouseWheelEvent(HWND hwnd,
+ UINT message,
+ WPARAM wparam,
+ LPARAM lparam)
+ : scroll_by_page(false) {
type = MOUSE_WHEEL;
button = BUTTON_NONE;
- // Add a simple workaround to scroll multiples units per page.
- // The right fix needs to extend webkit's implementation of
- // wheel events and that's not something we want to do at
- // this time. See bug# 928509
- // TODO(joshia): Implement the right fix for bug# 928509
- const int kPageScroll = 10; // 10 times wheel scroll
-
- UINT key_state = GET_KEYSTATE_WPARAM(wparam);
- int wheel_delta = static_cast<int>(GET_WHEEL_DELTA_WPARAM(wparam));
-
+ // Get key state, coordinates, and wheel delta from event.
typedef SHORT (WINAPI *GetKeyStateFunction)(int key);
- GetKeyStateFunction get_key_state = GetKeyState;
+ 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;
- // Synthesize mousewheel event from a scroll event.
- // This is needed to simulate middle mouse scrolling in some
- // laptops (Thinkpads)
- if ((WM_VSCROLL == message) || (WM_HSCROLL == message)) {
-
POINT cursor_position = {0};
GetCursorPos(&cursor_position);
-
global_x = cursor_position.x;
global_y = cursor_position.y;
- key_state = 0;
-
- // Since we are synthesizing the wheel event, we have to
- // use GetAsyncKeyState
- if (GetAsyncKeyState(VK_SHIFT))
- key_state |= MK_SHIFT;
-
- if (GetAsyncKeyState(VK_CONTROL))
- key_state |= MK_CONTROL;
-
switch (LOWORD(wparam)) {
case SB_LINEUP: // == SB_LINELEFT
wheel_delta = WHEEL_DELTA;
@@ -159,99 +151,75 @@
wheel_delta = -WHEEL_DELTA;
break;
case SB_PAGEUP:
- wheel_delta = kPageScroll * WHEEL_DELTA;
+ wheel_delta = 1;
+ scroll_by_page = true;
break;
case SB_PAGEDOWN:
- wheel_delta = -kPageScroll * WHEEL_DELTA;
+ wheel_delta = -1;
+ scroll_by_page = true;
break;
- // TODO(joshia): Handle SB_THUMBPOSITION and SB_THUMBTRACK
- // for compeleteness
- default:
+ default: // We don't supoprt SB_THUMBPOSITION or SB_THUMBTRACK here.
+ wheel_delta = 0;
break;
}
- // Touchpads (or trackpoints) send the following messages in scrolling
- // horizontally.
- // * Scrolling left
- // message == WM_HSCROLL, wparam == SB_LINELEFT (== SB_LINEUP).
- // * Scrolling right
- // message == WM_HSCROLL, wparam == SB_LINERIGHT (== SB_LINEDOWN).
- if (WM_HSCROLL == message) {
- key_state |= MK_SHIFT;
+ if (message == WM_HSCROLL) {
+ horizontal_scroll = true;
wheel_delta = -wheel_delta;
}
-
- // Use GetAsyncKeyState for key state since we are synthesizing
- // the input
- get_key_state = GetAsyncKeyState;
} else {
- // TODO(hbono): we should add a new variable which indicates scroll
- // direction and remove this key_state hack.
- if (WM_MOUSEHWHEEL == message)
- key_state |= MK_SHIFT;
+ // 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) || (key_state & MK_SHIFT)) &&
+ (wheel_delta != 0))
+ 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 };
- ScreenToClient(hwnd, &client_point);
+ MapWindowPoints(NULL, hwnd, &client_point, 1);
x = client_point.x;
y = client_point.y;
- // compute the scroll delta based on Raymond Chen's algorithm:
- // http://blogs.msdn.com/oldnewthing/archive/2003/08/07/54615.aspx
-
- static int carryover = 0;
- static HWND last_window = NULL;
-
- if (hwnd != last_window) {
- last_window = hwnd;
- carryover = 0;
- }
-
- unsigned long scroll_lines = kDefaultScrollLinesPerWheelDelta;
- SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scroll_lines, 0);
-
- int delta_lines = 0;
- if (scroll_lines == WHEEL_PAGESCROLL) {
- scroll_lines = kPageScroll;
- }
-
- if (scroll_lines == 0) {
- carryover = 0;
+ // Convert wheel delta amount to a number of lines/chars to scroll.
+ float scroll_delta = wheel_delta / WHEEL_DELTA;
+ if (horizontal_scroll) {
+ unsigned long scroll_chars = kDefaultScrollCharsPerWheelDelta;
+ SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &scroll_chars, 0);
+ scroll_delta *= static_cast<float>(scroll_chars);
} else {
- const int delta = carryover + wheel_delta;
-
- // see how many lines we should scroll. relies on round-toward-zero.
- delta_lines = delta * static_cast<int>(scroll_lines) / WHEEL_DELTA;
-
- // record the unused portion as the next carryover.
- carryover =
- delta - delta_lines * WHEEL_DELTA / static_cast<int>(scroll_lines);
+ 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);
}
- // Scroll horizontally if shift is held. WebKit's WebKit/win/WebView.cpp
- // does the equivalent.
- // TODO(jackson): Support WM_MOUSEHWHEEL = 0x020E event as well.
- // (Need a mouse with horizontal scrolling capabilities to test it.)
- if (key_state & MK_SHIFT) {
- // Scrolling up should move left, scrolling down should move right
- delta_x = -delta_lines;
+ // Set scroll amount based on above calculations.
+ if (horizontal_scroll) {
+ // Scrolling up should move left, scrolling down should move right. This is
+ // opposite Safari, but seems more consistent with vertical scrolling.
+ delta_x = scroll_delta;
delta_y = 0;
} else {
delta_x = 0;
- delta_y = delta_lines;
+ delta_y = scroll_delta;
}
-
- if (key_state & MK_SHIFT)
- modifiers |= SHIFT_KEY;
- if (key_state & MK_CONTROL)
- modifiers |= CTRL_KEY;
-
- // Get any additional key states needed
- if (get_key_state(VK_MENU) & 0x8000)
- modifiers |= (ALT_KEY | META_KEY);
}
// WebKeyboardEvent -----------------------------------------------------------
« webkit/glue/webinputevent_mac.mm ('K') | « webkit/glue/webinputevent_mac.mm ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698