@ -1934,30 +1934,39 @@ void _glfwPlatformPollEvents(void)
}
}
}
}
// HACK: Release modifier keys that the system did not emit KEYUP for
// NOTE: Shift keys on Windows tend to "stick" when both are pressed as
// no key up message is generated by the first key release
// NOTE: Windows key is not reported as released by the Win+V hotkey
// Other Win hotkeys are handled implicitly by _glfwInputWindowFocus
// because they change the input focus
handle = GetActiveWindow ( ) ;
handle = GetActiveWindow ( ) ;
if ( handle )
if ( handle )
{
{
// NOTE: Shift keys on Windows tend to "stick" when both are pressed as
// no key up message is generated by the first key release
// The other half of this is in the handling of WM_KEYUP
// HACK: Query actual key state and synthesize release events as needed
window = GetPropW ( handle , L " GLFW " ) ;
window = GetPropW ( handle , L " GLFW " ) ;
if ( window )
if ( window )
{
{
const GLFWbool lshift = ( GetAsyncKeyState ( VK_LSHIFT ) & 0x8000 ) ! = 0 ;
int i ;
const GLFWbool rshift = ( GetAsyncKeyState ( VK_RSHIFT ) & 0x8000 ) ! = 0 ;
const int keys [ 4 ] [ 2 ] =
if ( ! lshift & & window - > keys [ GLFW_KEY_LEFT_SHIFT ] = = GLFW_PRESS )
{
{
const int mods = getAsyncKeyMods ( ) ;
{ VK_LSHIFT , GLFW_KEY_LEFT_SHIFT } ,
const int scancode = _glfw . win32 . scancodes [ GLFW_KEY_LEFT_SHIFT ] ;
{ VK_RSHIFT , GLFW_KEY_RIGHT_SHIFT } ,
_glfwInputKey ( window , GLFW_KEY_LEFT_SHIFT , scancode , GLFW_RELEASE , mods ) ;
{ VK_LWIN , GLFW_KEY_LEFT_SUPER } ,
}
{ VK_RWIN , GLFW_KEY_RIGHT_SUPER }
else if ( ! rshift & & window - > keys [ GLFW_KEY_RIGHT_SHIFT ] = = GLFW_PRESS )
} ;
for ( i = 0 ; i < 4 ; i + + )
{
{
const int mods = getAsyncKeyMods ( ) ;
const int vk = keys [ i ] [ 0 ] ;
const int scancode = _glfw . win32 . scancodes [ GLFW_KEY_RIGHT_SHIFT ] ;
const int key = keys [ i ] [ 1 ] ;
_glfwInputKey ( window , GLFW_KEY_RIGHT_SHIFT , scancode , GLFW_RELEASE , mods ) ;
const int scancode = _glfw . win32 . scancodes [ key ] ;
if ( ( GetAsyncKeyState ( vk ) & 0x8000 ) )
continue ;
if ( window - > keys [ key ] ! = GLFW_PRESS )
continue ;
_glfwInputKey ( window , key , scancode , GLFW_RELEASE , getAsyncKeyMods ( ) ) ;
}
}
}
}
}
}