Replace WTF::move with WTFMove
[WebKit-https.git] / Source / WebCore / platform / win / WheelEventWin.cpp
1 /*
2  * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "PlatformWheelEvent.h"
28
29 #include "FloatPoint.h"
30 #include "FloatSize.h"
31 #include "GDIUtilities.h"
32 #include "HWndDC.h"
33 #include <windows.h>
34 #include <windowsx.h>
35
36 namespace WebCore {
37
38 #define HIGH_BIT_MASK_SHORT 0x8000
39 #define SPI_GETWHEELSCROLLCHARS 0x006C
40
41 static IntPoint positionForEvent(HWND hWnd, LPARAM lParam)
42 {
43     POINT point = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)};
44     ScreenToClient(hWnd, &point);
45     IntPoint logicalPoint(point);
46     float inverseScaleFactor = 1.0f / deviceScaleFactorForWindow(hWnd);
47     logicalPoint.scale(inverseScaleFactor, inverseScaleFactor);
48     return logicalPoint;
49 }
50
51 static IntPoint globalPositionForEvent(HWND hWnd, LPARAM lParam)
52 {
53     IntPoint logicalPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
54     float inverseScaleFactor = 1.0f / deviceScaleFactorForWindow(hWnd);
55     logicalPoint.scale(inverseScaleFactor, inverseScaleFactor);
56     return logicalPoint;
57 }
58
59 static int horizontalScrollChars()
60 {
61     static ULONG scrollChars;
62     if (!scrollChars && !SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &scrollChars, 0))
63         scrollChars = 1;
64     return scrollChars;
65 }
66
67 static int verticalScrollLines()
68 {
69     static ULONG scrollLines;
70     if (!scrollLines && !SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scrollLines, 0))
71         scrollLines = 3;
72     return scrollLines;
73 }
74
75 PlatformWheelEvent::PlatformWheelEvent(HWND hWnd, const FloatSize& delta, const FloatPoint& location)
76     : PlatformEvent(PlatformEvent::Wheel, false, false, false, false, ::GetTickCount() * 0.001)
77     , m_directionInvertedFromDevice(false)
78 {
79     m_deltaX = delta.width();
80     m_deltaY = delta.height();
81
82     m_wheelTicksX = m_deltaX;
83     m_wheelTicksY = m_deltaY;
84
85     // Global Position is just x, y location of event
86     POINT point = {location.x(), location.y()};
87     float inverseScaleFactor = 1.0f / deviceScaleFactorForWindow(hWnd);
88     m_globalPosition = point;
89     m_globalPosition.scale(inverseScaleFactor, inverseScaleFactor);
90
91     // Position needs to be translated to our client
92     ScreenToClient(hWnd, &point);
93     m_position = point;
94     m_position.scale(inverseScaleFactor, inverseScaleFactor);
95 }
96
97 PlatformWheelEvent::PlatformWheelEvent(HWND hWnd, WPARAM wParam, LPARAM lParam, bool isMouseHWheel)
98     : PlatformEvent(PlatformEvent::Wheel, wParam & MK_SHIFT, wParam & MK_CONTROL, GetKeyState(VK_MENU) & HIGH_BIT_MASK_SHORT, GetKeyState(VK_MENU) & HIGH_BIT_MASK_SHORT, ::GetTickCount() * 0.001)
99     , m_position(positionForEvent(hWnd, lParam))
100     , m_globalPosition(globalPositionForEvent(hWnd, lParam))
101     , m_directionInvertedFromDevice(false)
102 {
103     float scaleFactor = deviceScaleFactorForWindow(hWnd);
104
105     // How many pixels should we scroll per line?  Gecko uses the height of the
106     // current line, which means scroll distance changes as you go through the
107     // page or go to different pages.  IE 7 is ~50 px/line, although the value
108     // seems to vary slightly by page and zoom level.  Since IE 7 has a
109     // smoothing algorithm on scrolling, it can get away with slightly larger
110     // scroll values without feeling jerky.  Here we use 100 px per three lines
111     // (the default scroll amount on Windows is three lines per wheel tick).
112     static const float cScrollbarPixelsPerLine = scaleFactor * 100.0f / 3.0f;
113     float delta = GET_WHEEL_DELTA_WPARAM(wParam) / (scaleFactor * static_cast<float>(WHEEL_DELTA));
114     if (isMouseHWheel) {
115         // Windows is <-- -/+ -->, WebKit wants <-- +/- -->, so we negate
116         // |delta| after saving the original value on the wheel tick member.
117         m_wheelTicksX = delta;
118         m_wheelTicksY = 0;
119         delta = -delta;
120     } else {
121         // Even though we use shift + vertical wheel to scroll horizontally in
122         // WebKit, we still note it as a vertical scroll on the wheel tick
123         // member, so that the DOM event we later construct will match the real
124         // hardware event better.
125         m_wheelTicksX = 0;
126         m_wheelTicksY = delta;
127     }
128     if (isMouseHWheel || shiftKey()) {
129         m_deltaX = delta * static_cast<float>(horizontalScrollChars()) * cScrollbarPixelsPerLine;
130         m_deltaY = 0;
131         m_granularity = ScrollByPixelWheelEvent;
132     } else {
133         m_deltaX = 0;
134         m_deltaY = delta;
135         int verticalMultiplier = verticalScrollLines();
136         m_granularity = (verticalMultiplier == WHEEL_PAGESCROLL) ? ScrollByPageWheelEvent : ScrollByPixelWheelEvent;
137         if (m_granularity == ScrollByPixelWheelEvent)
138             m_deltaY *= static_cast<float>(verticalMultiplier) * cScrollbarPixelsPerLine;
139     }
140 }
141
142 }