summaryrefslogtreecommitdiff
path: root/src/video/win32_v.cpp
diff options
context:
space:
mode:
authormichi_cc <michi_cc@openttd.org>2017-12-09 19:21:45 +0000
committermichi_cc <michi_cc@openttd.org>2017-12-09 19:21:45 +0000
commitc722cb26b8bc61d720c8a7a037e3c8639851599c (patch)
tree85dd1fd48f3bee7fcc45a129cb8afeb3b4c9ac7a /src/video/win32_v.cpp
parente856e3cca8831be0853a838ccc4f8a1e1decda07 (diff)
downloadopenttd-c722cb26b8bc61d720c8a7a037e3c8639851599c.tar.xz
(svn r27935) -Fix [FS#6629]: [Win32] Right mouse scrolling didn't work properly with the Windows 10 Fall Creators Update.
Diffstat (limited to 'src/video/win32_v.cpp')
-rw-r--r--src/video/win32_v.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp
index 4a9861b64..23794cb32 100644
--- a/src/video/win32_v.cpp
+++ b/src/video/win32_v.cpp
@@ -34,6 +34,10 @@
#define MAPVK_VK_TO_CHAR (2)
#endif
+#ifndef PM_QS_INPUT
+#define PM_QS_INPUT 0x20000
+#endif
+
static struct {
HWND main_wnd;
HBITMAP dib_sect;
@@ -737,7 +741,6 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
case WM_MOUSEMOVE: {
int x = (int16)LOWORD(lParam);
int y = (int16)HIWORD(lParam);
- POINT pt;
/* If the mouse was not in the window and it has moved it means it has
* come into the window, so start drawing the mouse. Also start
@@ -747,7 +750,18 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
SetTimer(hwnd, TID_POLLMOUSE, MOUSE_POLL_DELAY, (TIMERPROC)TrackMouseTimerProc);
}
- if (_cursor.UpdateCursorPosition(x, y, true)) {
+ if (_cursor.fix_at) {
+ /* Get all queued mouse events now in case we have to warp the cursor. In the
+ * end, we only care about the current mouse position and not bygone events. */
+ MSG m;
+ while (PeekMessage(&m, hwnd, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE | PM_NOYIELD | PM_QS_INPUT)) {
+ x = (int16)LOWORD(m.lParam);
+ y = (int16)HIWORD(m.lParam);
+ }
+ }
+
+ if (_cursor.UpdateCursorPosition(x, y, false)) {
+ POINT pt;
pt.x = _cursor.pos.x;
pt.y = _cursor.pos.y;
ClientToScreen(hwnd, &pt);