|
@@ -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();
|
|
|
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");
|
|
|
if (window)
|
|
|
{
|
|
|
- const GLFWbool lshift = (GetAsyncKeyState(VK_LSHIFT) & 0x8000) != 0;
|
|
|
- const GLFWbool rshift = (GetAsyncKeyState(VK_RSHIFT) & 0x8000) != 0;
|
|
|
-
|
|
|
- if (!lshift && window->keys[GLFW_KEY_LEFT_SHIFT] == GLFW_PRESS)
|
|
|
+ int i;
|
|
|
+ const int keys[4][2] =
|
|
|
{
|
|
|
- const int mods = getAsyncKeyMods();
|
|
|
- const int scancode = _glfw.win32.scancodes[GLFW_KEY_LEFT_SHIFT];
|
|
|
- _glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, scancode, GLFW_RELEASE, mods);
|
|
|
- }
|
|
|
- else if (!rshift && window->keys[GLFW_KEY_RIGHT_SHIFT] == GLFW_PRESS)
|
|
|
+ { VK_LSHIFT, GLFW_KEY_LEFT_SHIFT },
|
|
|
+ { VK_RSHIFT, GLFW_KEY_RIGHT_SHIFT },
|
|
|
+ { VK_LWIN, GLFW_KEY_LEFT_SUPER },
|
|
|
+ { VK_RWIN, GLFW_KEY_RIGHT_SUPER }
|
|
|
+ };
|
|
|
+
|
|
|
+ for (i = 0; i < 4; i++)
|
|
|
{
|
|
|
- const int mods = getAsyncKeyMods();
|
|
|
- const int scancode = _glfw.win32.scancodes[GLFW_KEY_RIGHT_SHIFT];
|
|
|
- _glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, scancode, GLFW_RELEASE, mods);
|
|
|
+ const int vk = keys[i][0];
|
|
|
+ const int key = keys[i][1];
|
|
|
+ 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());
|
|
|
}
|
|
|
}
|
|
|
}
|