|
|
|
@ -104,6 +104,38 @@ static void showCursor(_GLFWwindow* window) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Retrieves and translates modifier keys
|
|
|
|
|
//
|
|
|
|
|
static int getKeyMods(void) |
|
|
|
|
{ |
|
|
|
|
int mods = 0; |
|
|
|
|
|
|
|
|
|
if (GetKeyState(VK_SHIFT) & (1 << 31)) |
|
|
|
|
mods |= GLFW_MOD_SHIFT; |
|
|
|
|
if (GetKeyState(VK_CONTROL) & (1 << 31)) |
|
|
|
|
mods |= GLFW_MOD_CTRL; |
|
|
|
|
if (GetKeyState(VK_MENU) & (1 << 31)) |
|
|
|
|
mods |= GLFW_MOD_ALT; |
|
|
|
|
|
|
|
|
|
return mods; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Retrieves and translates modifier keys
|
|
|
|
|
//
|
|
|
|
|
static int getAsyncKeyMods(void) |
|
|
|
|
{ |
|
|
|
|
int mods = 0; |
|
|
|
|
|
|
|
|
|
if (GetAsyncKeyState(VK_SHIFT) & (1 << 31)) |
|
|
|
|
mods |= GLFW_MOD_SHIFT; |
|
|
|
|
if (GetAsyncKeyState(VK_CONTROL) & (1 << 31)) |
|
|
|
|
mods |= GLFW_MOD_CTRL; |
|
|
|
|
if (GetAsyncKeyState(VK_MENU) & (1 << 31)) |
|
|
|
|
mods |= GLFW_MOD_ALT; |
|
|
|
|
|
|
|
|
|
return mods; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Translates a Windows key to the corresponding GLFW key
|
|
|
|
|
//
|
|
|
|
|
static int translateKey(WPARAM wParam, LPARAM lParam) |
|
|
|
@ -433,7 +465,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, |
|
|
|
|
case WM_KEYDOWN: |
|
|
|
|
case WM_SYSKEYDOWN: |
|
|
|
|
{ |
|
|
|
|
_glfwInputKey(window, translateKey(wParam, lParam), GLFW_PRESS); |
|
|
|
|
_glfwInputKey(window, translateKey(wParam, lParam), GLFW_PRESS, getKeyMods()); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -461,20 +493,22 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, |
|
|
|
|
case WM_KEYUP: |
|
|
|
|
case WM_SYSKEYUP: |
|
|
|
|
{ |
|
|
|
|
const int mods = getKeyMods(); |
|
|
|
|
|
|
|
|
|
if (wParam == VK_SHIFT) |
|
|
|
|
{ |
|
|
|
|
// Special trick: release both shift keys on SHIFT up event
|
|
|
|
|
_glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, GLFW_RELEASE); |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, GLFW_RELEASE); |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, GLFW_RELEASE, mods); |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, GLFW_RELEASE, mods); |
|
|
|
|
} |
|
|
|
|
else if (wParam == VK_SNAPSHOT) |
|
|
|
|
{ |
|
|
|
|
// Key down is not reported for the print screen key
|
|
|
|
|
_glfwInputKey(window, GLFW_KEY_PRINT_SCREEN, GLFW_PRESS); |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_PRINT_SCREEN, GLFW_RELEASE); |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_PRINT_SCREEN, GLFW_PRESS, mods); |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_PRINT_SCREEN, GLFW_RELEASE, mods); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
_glfwInputKey(window, translateKey(wParam, lParam), GLFW_RELEASE); |
|
|
|
|
_glfwInputKey(window, translateKey(wParam, lParam), GLFW_RELEASE, getKeyMods()); |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -484,20 +518,22 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, |
|
|
|
|
case WM_MBUTTONDOWN: |
|
|
|
|
case WM_XBUTTONDOWN: |
|
|
|
|
{ |
|
|
|
|
const int mods = getKeyMods(); |
|
|
|
|
|
|
|
|
|
SetCapture(hWnd); |
|
|
|
|
|
|
|
|
|
if (uMsg == WM_LBUTTONDOWN) |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS); |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS, mods); |
|
|
|
|
else if (uMsg == WM_RBUTTONDOWN) |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS); |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS, mods); |
|
|
|
|
else if (uMsg == WM_MBUTTONDOWN) |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS); |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS, mods); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (HIWORD(wParam) == XBUTTON1) |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_4, GLFW_PRESS); |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_4, GLFW_PRESS, mods); |
|
|
|
|
else if (HIWORD(wParam) == XBUTTON2) |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_5, GLFW_PRESS); |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_5, GLFW_PRESS, mods); |
|
|
|
|
|
|
|
|
|
return TRUE; |
|
|
|
|
} |
|
|
|
@ -510,20 +546,22 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, |
|
|
|
|
case WM_MBUTTONUP: |
|
|
|
|
case WM_XBUTTONUP: |
|
|
|
|
{ |
|
|
|
|
const int mods = getKeyMods(); |
|
|
|
|
|
|
|
|
|
ReleaseCapture(); |
|
|
|
|
|
|
|
|
|
if (uMsg == WM_LBUTTONUP) |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE); |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE, mods); |
|
|
|
|
else if (uMsg == WM_RBUTTONUP) |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE); |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE, mods); |
|
|
|
|
else if (uMsg == WM_MBUTTONUP) |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_MIDDLE, GLFW_RELEASE); |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_MIDDLE, GLFW_RELEASE, mods); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (HIWORD(wParam) == XBUTTON1) |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_4, GLFW_RELEASE); |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_4, GLFW_RELEASE, mods); |
|
|
|
|
else if (HIWORD(wParam) == XBUTTON2) |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_5, GLFW_RELEASE); |
|
|
|
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_5, GLFW_RELEASE, mods); |
|
|
|
|
|
|
|
|
|
return TRUE; |
|
|
|
|
} |
|
|
|
@ -1017,19 +1055,19 @@ void _glfwPlatformPollEvents(void) |
|
|
|
|
// This is the only async event handling in GLFW, but it solves some
|
|
|
|
|
// nasty problems
|
|
|
|
|
{ |
|
|
|
|
int lshiftDown, rshiftDown; |
|
|
|
|
const int mods = getAsyncKeyMods(); |
|
|
|
|
|
|
|
|
|
// Get current state of left and right shift keys
|
|
|
|
|
lshiftDown = (GetAsyncKeyState(VK_LSHIFT) >> 15) & 1; |
|
|
|
|
rshiftDown = (GetAsyncKeyState(VK_RSHIFT) >> 15) & 1; |
|
|
|
|
const int lshiftDown = (GetAsyncKeyState(VK_LSHIFT) >> 15) & 1; |
|
|
|
|
const int rshiftDown = (GetAsyncKeyState(VK_RSHIFT) >> 15) & 1; |
|
|
|
|
|
|
|
|
|
// See if this differs from our belief of what has happened
|
|
|
|
|
// (we only have to check for lost key up events)
|
|
|
|
|
if (!lshiftDown && window->key[GLFW_KEY_LEFT_SHIFT] == 1) |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, GLFW_RELEASE); |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, GLFW_RELEASE, mods); |
|
|
|
|
|
|
|
|
|
if (!rshiftDown && window->key[GLFW_KEY_RIGHT_SHIFT] == 1) |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, GLFW_RELEASE); |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, GLFW_RELEASE, mods); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Did the cursor move in an focused window that has captured the cursor
|
|
|
|
|