From 0721931f5b92c96ff19bf936186bc4cf3dac38a1 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 6 Apr 2020 19:21:56 -0700 Subject: [PATCH] Avoid sending regular mouse messages for touch input --- src/video/windows/SDL_windowsevents.c | 18 +++++++++++++++--- src/video/windows/SDL_windowswindow.c | 1 + src/video/windows/SDL_windowswindow.h | 1 + 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index d79d42c22..516ecdd23 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -75,6 +75,9 @@ #ifndef WM_MOUSEHWHEEL #define WM_MOUSEHWHEEL 0x020E #endif +#ifndef WM_POINTERUPDATE +#define WM_POINTERUPDATE 0x0245 +#endif #ifndef WM_UNICHAR #define WM_UNICHAR 0x0109 #endif @@ -523,12 +526,19 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) returnCode = 0; break; + case WM_POINTERUPDATE: + { + data->last_pointer_update = lParam; + break; + } + case WM_MOUSEMOVE: { SDL_Mouse *mouse = SDL_GetMouse(); if (!mouse->relative_mode || mouse->relative_mode_warp) { /* Only generate mouse events for real mouse */ - if (GetMouseMessageSource() != SDL_MOUSE_EVENT_SOURCE_TOUCH) { + if (GetMouseMessageSource() != SDL_MOUSE_EVENT_SOURCE_TOUCH && + lParam != data->last_pointer_update) { SDL_SendMouseMotion(data->window, 0, 0, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); if (isWin10FCUorNewer && mouse->relative_mode_warp) { /* To work around #3931, Win10 bug introduced in Fall Creators Update, where @@ -563,7 +573,8 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { SDL_Mouse *mouse = SDL_GetMouse(); if (!mouse->relative_mode || mouse->relative_mode_warp) { - if (GetMouseMessageSource() != SDL_MOUSE_EVENT_SOURCE_TOUCH) { + if (GetMouseMessageSource() != SDL_MOUSE_EVENT_SOURCE_TOUCH && + lParam != data->last_pointer_update) { WIN_CheckWParamMouseButtons(wParam, data, 0); } } @@ -589,7 +600,8 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) /* Mouse data (ignoring synthetic mouse events generated for touchscreens) */ if (inp.header.dwType == RIM_TYPEMOUSE) { - if (GetMouseMessageSource() == SDL_MOUSE_EVENT_SOURCE_TOUCH) { + if (GetMouseMessageSource() == SDL_MOUSE_EVENT_SOURCE_TOUCH || + (GetMessageExtraInfo() & 0x82) == 0x82) { break; } if (isRelative) { diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index c1162937d..ef73142ac 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -188,6 +188,7 @@ SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, HWND parent, SDL_bool cre data->hinstance = (HINSTANCE) GetWindowLongPtr(hwnd, GWLP_HINSTANCE); data->created = created; data->mouse_button_flags = 0; + data->last_pointer_update = (LPARAM)-1; data->videodata = videodata; data->initializing = SDL_TRUE; diff --git a/src/video/windows/SDL_windowswindow.h b/src/video/windows/SDL_windowswindow.h index 71914122c..574a45248 100644 --- a/src/video/windows/SDL_windowswindow.h +++ b/src/video/windows/SDL_windowswindow.h @@ -39,6 +39,7 @@ typedef struct WNDPROC wndproc; SDL_bool created; WPARAM mouse_button_flags; + LPARAM last_pointer_update; SDL_bool initializing; SDL_bool expected_resize; SDL_bool in_border_change;