Fixed lost mouse button when in relative mouse warp mode and you click on the title bar, entering a modal move/resize loop. Testing: * Set the SDL_HINT_MOUSE_RELATIVE_MODE_WARP hint true, run testsprite2, press Ctrl-R to enter relative mode, alt tab away from the window, then click on the title bar of the window. Didn't get the mouse button release before, and we do now. CR: Yahn + Alfred
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c
index f448d2b..dbd8e2e 100644
--- a/src/video/windows/SDL_windowsevents.c
+++ b/src/video/windows/SDL_windowsevents.c
@@ -259,6 +259,30 @@ WIN_CheckRawMouseButtons( ULONG rawButtons, SDL_WindowData *data )
}
}
+void
+WIN_CheckAsyncMouseRelease( SDL_WindowData *data )
+{
+ Uint32 mouseFlags;
+ SHORT keyState;
+
+ /* mouse buttons may have changed state here, we need to resync them,
+ but we will get a WM_MOUSEMOVE right away which will fix things up if in non raw mode also
+ */
+ mouseFlags = SDL_GetMouseState( NULL, NULL );
+
+ keyState = GetAsyncKeyState( VK_LBUTTON );
+ WIN_CheckWParamMouseButton( ( keyState & 0x8000 ), ( mouseFlags & SDL_BUTTON_LMASK ), data, SDL_BUTTON_LEFT );
+ keyState = GetAsyncKeyState( VK_RBUTTON );
+ WIN_CheckWParamMouseButton( ( keyState & 0x8000 ), ( mouseFlags & SDL_BUTTON_RMASK ), data, SDL_BUTTON_RIGHT );
+ keyState = GetAsyncKeyState( VK_MBUTTON );
+ WIN_CheckWParamMouseButton( ( keyState & 0x8000 ), ( mouseFlags & SDL_BUTTON_MMASK ), data, SDL_BUTTON_MIDDLE );
+ keyState = GetAsyncKeyState( VK_XBUTTON1 );
+ WIN_CheckWParamMouseButton( ( keyState & 0x8000 ), ( mouseFlags & SDL_BUTTON_X1MASK ), data, SDL_BUTTON_X1 );
+ keyState = GetAsyncKeyState( VK_XBUTTON2 );
+ WIN_CheckWParamMouseButton( ( keyState & 0x8000 ), ( mouseFlags & SDL_BUTTON_X2MASK ), data, SDL_BUTTON_X2 );
+ data->mouse_button_flags = 0;
+}
+
SDL_FORCE_INLINE BOOL
WIN_ConvertUTF32toUTF8(UINT32 codepoint, char * text)
{
@@ -344,32 +368,12 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
minimized = HIWORD(wParam);
if (!minimized && (LOWORD(wParam) != WA_INACTIVE)) {
- Uint32 mouseFlags;
- SHORT keyState;
-
SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_SHOWN, 0, 0);
if (SDL_GetKeyboardFocus() != data->window) {
SDL_SetKeyboardFocus(data->window);
}
- /* mouse buttons may have changed state here, we need
- to resync them, but we will get a WM_MOUSEMOVE right away which will fix
- things up if in non raw mode also
- */
- mouseFlags = SDL_GetMouseState( NULL, NULL );
-
- keyState = GetAsyncKeyState( VK_LBUTTON );
- WIN_CheckWParamMouseButton( ( keyState & 0x8000 ), (mouseFlags & SDL_BUTTON_LMASK), data, SDL_BUTTON_LEFT );
- keyState = GetAsyncKeyState( VK_RBUTTON );
- WIN_CheckWParamMouseButton( ( keyState & 0x8000 ), (mouseFlags & SDL_BUTTON_RMASK), data, SDL_BUTTON_RIGHT );
- keyState = GetAsyncKeyState( VK_MBUTTON );
- WIN_CheckWParamMouseButton( ( keyState & 0x8000 ), (mouseFlags & SDL_BUTTON_MMASK), data, SDL_BUTTON_MIDDLE );
- keyState = GetAsyncKeyState( VK_XBUTTON1 );
- WIN_CheckWParamMouseButton( ( keyState & 0x8000 ), (mouseFlags & SDL_BUTTON_X1MASK), data, SDL_BUTTON_X1 );
- keyState = GetAsyncKeyState( VK_XBUTTON2 );
- WIN_CheckWParamMouseButton( ( keyState & 0x8000 ), (mouseFlags & SDL_BUTTON_X2MASK), data, SDL_BUTTON_X2 );
- data->mouse_button_flags = 0;
-
WIN_UpdateClipCursor(data->window);
+ WIN_CheckAsyncMouseRelease(data);
/*
* FIXME: Update keyboard state
@@ -578,6 +582,9 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
data->in_modal_loop = SDL_FALSE;
WIN_UpdateClipCursor(data->window);
+
+ /* The mouse may have been released during the modal loop */
+ WIN_CheckAsyncMouseRelease(data);
}
break;