|
|
|
@ -305,37 +305,6 @@ static int translateKey(WPARAM wParam, LPARAM lParam) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//========================================================================
|
|
|
|
|
// Translates a Windows key to Unicode
|
|
|
|
|
//========================================================================
|
|
|
|
|
|
|
|
|
|
static void translateChar(_GLFWwindow* window, DWORD wParam, DWORD lParam) |
|
|
|
|
{ |
|
|
|
|
BYTE keyboard_state[256]; |
|
|
|
|
WCHAR unicode_buf[10]; |
|
|
|
|
UINT scan_code; |
|
|
|
|
int i, num_chars; |
|
|
|
|
|
|
|
|
|
GetKeyboardState(keyboard_state); |
|
|
|
|
|
|
|
|
|
// Derive scan code from lParam and action
|
|
|
|
|
scan_code = (lParam & 0x01ff0000) >> 16; |
|
|
|
|
|
|
|
|
|
num_chars = ToUnicode( |
|
|
|
|
wParam, // virtual-key code
|
|
|
|
|
scan_code, // scan code
|
|
|
|
|
keyboard_state, // key-state array
|
|
|
|
|
unicode_buf, // buffer for translated key
|
|
|
|
|
10, // size of translated key buffer
|
|
|
|
|
0 // active-menu flag
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// Report characters
|
|
|
|
|
for (i = 0; i < num_chars; i++) |
|
|
|
|
_glfwInputChar(window, (int) unicode_buf[i]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//========================================================================
|
|
|
|
|
// Window callback function (handles window events)
|
|
|
|
|
//========================================================================
|
|
|
|
@ -459,13 +428,15 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, |
|
|
|
|
case WM_SYSKEYDOWN: |
|
|
|
|
{ |
|
|
|
|
_glfwInputKey(window, translateKey(wParam, lParam), GLFW_PRESS); |
|
|
|
|
|
|
|
|
|
if (_glfwLibrary.charCallback) |
|
|
|
|
translateChar(window, (DWORD) wParam, (DWORD) lParam); |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
case WM_CHAR: |
|
|
|
|
{ |
|
|
|
|
_glfwInputChar(window, wParam); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
case WM_KEYUP: |
|
|
|
|
case WM_SYSKEYUP: |
|
|
|
|
{ |
|
|
|
@ -1177,28 +1148,22 @@ void _glfwPlatformPollEvents(void) |
|
|
|
|
|
|
|
|
|
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) |
|
|
|
|
{ |
|
|
|
|
switch (msg.message) |
|
|
|
|
if (msg.message == WM_QUIT) |
|
|
|
|
{ |
|
|
|
|
case WM_QUIT: |
|
|
|
|
{ |
|
|
|
|
// Treat WM_QUIT as a close on all windows
|
|
|
|
|
|
|
|
|
|
window = _glfwLibrary.windowListHead; |
|
|
|
|
while (window) |
|
|
|
|
{ |
|
|
|
|
_glfwInputWindowCloseRequest(window); |
|
|
|
|
window = window->next; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
// Treat WM_QUIT as a close on all windows
|
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
window = _glfwLibrary.windowListHead; |
|
|
|
|
while (window) |
|
|
|
|
{ |
|
|
|
|
DispatchMessage(&msg); |
|
|
|
|
break; |
|
|
|
|
_glfwInputWindowCloseRequest(window); |
|
|
|
|
window = window->next; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
TranslateMessage(&msg); |
|
|
|
|
DispatchMessage(&msg); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// LSHIFT/RSHIFT fixup (keys tend to "stick" without this fix)
|
|
|
|
|