Fixing problem with non-client area becoming unresponsive on Windows due to mouse capture that isn't released. Thanks Philipp Kutin (on list!) for figuring this out and proposing a solution.

-> It appears GetAsyncKeyState's return can be non-zero even when the queried key is not pressed

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1627 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
dcnieho 2013-11-09 05:33:02 +00:00
parent 855c10d908
commit 2715e0929e

View File

@ -578,6 +578,18 @@ static int fgPlatformGetModifiers (void)
( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 );
} }
/* Check whether a button (VK_*BUTTON) is currently depressed. Returns
* non-zero (not necessarily 1) if yes. */
static SHORT fgGetAsyncKeyState(int vKey)
{
/* MSDN says: "If the most significant bit is set, the key is down, and if
* the least significant bit is set, the key was pressed after the previous
* call to GetAsyncKeyState." This behavior cannot be relied upon however.
* Remove this bit so that we can simply test with ! if key is up.
*/
return GetAsyncKeyState(vKey) & ~1;
}
static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean keydown, WPARAM wParam, LPARAM lParam) static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean keydown, WPARAM wParam, LPARAM lParam)
{ {
static unsigned char lControl = 0, lShift = 0, lAlt = 0, static unsigned char lControl = 0, lShift = 0, lAlt = 0,
@ -629,12 +641,12 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke
* so when we get an alt, shift or control keypress here, we manually check whether it was the left or the right * so when we get an alt, shift or control keypress here, we manually check whether it was the left or the right
*/ */
#define ASYNC_KEY_EVENT(winKey,glutKey,keyStateVar)\ #define ASYNC_KEY_EVENT(winKey,glutKey,keyStateVar)\
if (!keyStateVar && GetAsyncKeyState ( winKey ))\ if (!keyStateVar && fgGetAsyncKeyState ( winKey ))\
{\ {\
keypress = glutKey;\ keypress = glutKey;\
keyStateVar = 1;\ keyStateVar = 1;\
}\ }\
else if (keyStateVar && !GetAsyncKeyState ( winKey ))\ else if (keyStateVar && !fgGetAsyncKeyState ( winKey ))\
{\ {\
keypress = glutKey;\ keypress = glutKey;\
keyStateVar = 0;\ keyStateVar = 0;\
@ -1237,7 +1249,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
SetCapture ( window->Window.Handle ) ; SetCapture ( window->Window.Handle ) ;
setCaptureActive = 1; /* Set to false in WM_CAPTURECHANGED handler */ setCaptureActive = 1; /* Set to false in WM_CAPTURECHANGED handler */
} }
else if (!GetAsyncKeyState(VK_LBUTTON) && !GetAsyncKeyState(VK_MBUTTON) && !GetAsyncKeyState(VK_RBUTTON)) else if (!fgGetAsyncKeyState(VK_LBUTTON) && !fgGetAsyncKeyState(VK_MBUTTON) && !fgGetAsyncKeyState(VK_RBUTTON))
/* Make sure all mouse buttons are released before releasing capture */ /* Make sure all mouse buttons are released before releasing capture */
ReleaseCapture () ; ReleaseCapture () ;