should be using GetKeyState not GetAsyncKeyState to check for modifier keys as we care which modifiers were active at the time of the key/mouse press we are processing

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1642 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
dcnieho 2014-01-22 12:06:59 +00:00
parent e8d8bdf9e3
commit f6a11225ad

View File

@ -580,14 +580,10 @@ static int fgPlatformGetModifiers (void)
/* Check whether a button (VK_*BUTTON) is currently depressed. Returns /* Check whether a button (VK_*BUTTON) is currently depressed. Returns
* non-zero (not necessarily 1) if yes. */ * non-zero (not necessarily 1) if yes. */
static SHORT fgGetAsyncKeyState(int vKey) static SHORT fgGetKeyState(int vKey)
{ {
/* MSDN says: "If the most significant bit is set, the key is down, and if /* MSDN says: "If the high-order bit is 1, the key is down; otherwise, it is up". */
* the least significant bit is set, the key was pressed after the previous return GetKeyState(vKey) & 0xFF00;
* 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)
@ -640,30 +636,30 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke
* The VK_L* & VK_R* left and right Alt, Ctrl and Shift virtual keys are however only used as parameters to GetAsyncKeyState() and GetKeyState() * The VK_L* & VK_R* left and right Alt, Ctrl and Shift virtual keys are however only used as parameters to GetAsyncKeyState() and GetKeyState()
* 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 KEY_EVENT(winKey,glutKey,keyStateVar)\
if (!keyStateVar && fgGetAsyncKeyState ( winKey ))\ if (!keyStateVar && fgGetKeyState ( winKey ))\
{\ {\
keypress = glutKey;\ keypress = glutKey;\
keyStateVar = 1;\ keyStateVar = 1;\
}\ }\
else if (keyStateVar && !fgGetAsyncKeyState ( winKey ))\ else if (keyStateVar && !fgGetKeyState ( winKey ))\
{\ {\
keypress = glutKey;\ keypress = glutKey;\
keyStateVar = 0;\ keyStateVar = 0;\
} }
case VK_CONTROL: case VK_CONTROL:
ASYNC_KEY_EVENT(VK_LCONTROL,GLUT_KEY_CTRL_L,lControl); KEY_EVENT(VK_LCONTROL,GLUT_KEY_CTRL_L,lControl);
ASYNC_KEY_EVENT(VK_RCONTROL,GLUT_KEY_CTRL_R,rControl); KEY_EVENT(VK_RCONTROL,GLUT_KEY_CTRL_R,rControl);
break; break;
case VK_SHIFT: case VK_SHIFT:
ASYNC_KEY_EVENT(VK_LSHIFT,GLUT_KEY_SHIFT_L,lShift); KEY_EVENT(VK_LSHIFT,GLUT_KEY_SHIFT_L,lShift);
ASYNC_KEY_EVENT(VK_RSHIFT,GLUT_KEY_SHIFT_R,rShift); KEY_EVENT(VK_RSHIFT,GLUT_KEY_SHIFT_R,rShift);
break; break;
case VK_MENU: case VK_MENU:
ASYNC_KEY_EVENT(VK_LMENU,GLUT_KEY_ALT_L,lAlt); KEY_EVENT(VK_LMENU,GLUT_KEY_ALT_L,lAlt);
ASYNC_KEY_EVENT(VK_RMENU,GLUT_KEY_ALT_R,rAlt); KEY_EVENT(VK_RMENU,GLUT_KEY_ALT_R,rAlt);
break; break;
#undef ASYNC_KEY_EVENT #undef KEY_EVENT
case VK_DELETE: case VK_DELETE:
/* The delete key should be treated as an ASCII keypress: */ /* The delete key should be treated as an ASCII keypress: */
@ -1249,7 +1245,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 (!fgGetAsyncKeyState(VK_LBUTTON) && !fgGetAsyncKeyState(VK_MBUTTON) && !fgGetAsyncKeyState(VK_RBUTTON)) else if (!fgGetKeyState(VK_LBUTTON) && !fgGetKeyState(VK_MBUTTON) && !fgGetKeyState(VK_RBUTTON))
/* Make sure all mouse buttons are released before releasing capture */ /* Make sure all mouse buttons are released before releasing capture */
ReleaseCapture () ; ReleaseCapture () ;