Skip to content

Commit

Permalink
Fixed bug 2520 - Held double-click app startup creates a stuck MOUSEB…
Browse files Browse the repository at this point in the history
…UTTONDOWN event

snake5creator

When starting application with the usual "double click on file" method on Windows, only holding the last click, an unnecessary MOUSEBUTTONDOWN event is sent before the initial MOUSEMOTION event, and mouse button state is stuck in the sense that it takes a subsequent button release, followed by another press for the system to resume sending events (beginning with the next button release / MOUSEBUTTONUP event).

Input event log with held double-click startup: http://i.imgur.com/nypGKR2.png

Without: http://i.imgur.com/yaIqAvV.png
  • Loading branch information
slouken committed May 31, 2014
1 parent 70df9cd commit 9d00f75
Showing 1 changed file with 25 additions and 9 deletions.
34 changes: 25 additions & 9 deletions src/video/windows/SDL_windowsevents.c
Expand Up @@ -275,15 +275,25 @@ WIN_CheckAsyncMouseRelease( SDL_WindowData *data )
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 );
if (!(keyState & 0x8000)) {
WIN_CheckWParamMouseButton(SDL_FALSE, (mouseFlags & SDL_BUTTON_LMASK), data, SDL_BUTTON_LEFT);
}
keyState = GetAsyncKeyState(VK_RBUTTON);
if (!(keyState & 0x8000)) {
WIN_CheckWParamMouseButton(SDL_FALSE, (mouseFlags & SDL_BUTTON_RMASK), data, SDL_BUTTON_RIGHT);
}
keyState = GetAsyncKeyState(VK_MBUTTON);
if (!(keyState & 0x8000)) {
WIN_CheckWParamMouseButton(SDL_FALSE, (mouseFlags & SDL_BUTTON_MMASK), data, SDL_BUTTON_MIDDLE);
}
keyState = GetAsyncKeyState(VK_XBUTTON1);
if (!(keyState & 0x8000)) {
WIN_CheckWParamMouseButton(SDL_FALSE, (mouseFlags & SDL_BUTTON_X1MASK), data, SDL_BUTTON_X1);
}
keyState = GetAsyncKeyState(VK_XBUTTON2);
if (!(keyState & 0x8000)) {
WIN_CheckWParamMouseButton(SDL_FALSE, (mouseFlags & SDL_BUTTON_X2MASK), data, SDL_BUTTON_X2);
}
data->mouse_button_flags = 0;
}

Expand Down Expand Up @@ -368,6 +378,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

case WM_ACTIVATE:
{
POINT cursorPos;
BOOL minimized;

minimized = HIWORD(wParam);
Expand All @@ -377,6 +388,11 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
SDL_SetKeyboardFocus(data->window);
}
WIN_UpdateClipCursor(data->window);

GetCursorPos(&cursorPos);
ScreenToClient(hwnd, &cursorPos);
SDL_SendMouseMotion(data->window, 0, 0, cursorPos.x, cursorPos.y);

WIN_CheckAsyncMouseRelease(data);

/*
Expand Down

0 comments on commit 9d00f75

Please sign in to comment.