|
@@ -646,11 +646,38 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|
|
|
|
|
case WM_CHAR:
|
|
|
case WM_SYSCHAR:
|
|
|
- case WM_UNICHAR:
|
|
|
{
|
|
|
- const GLFWbool plain = (uMsg != WM_SYSCHAR);
|
|
|
+ if (wParam >= 0xd800 && wParam <= 0xdbff)
|
|
|
+ window->win32.highSurrogate = (WCHAR) wParam;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ unsigned int codepoint = 0;
|
|
|
+
|
|
|
+ if (wParam >= 0xdc00 && wParam <= 0xdfff)
|
|
|
+ {
|
|
|
+ if (window->win32.highSurrogate)
|
|
|
+ {
|
|
|
+ codepoint += (window->win32.highSurrogate - 0xd800) << 10;
|
|
|
+ codepoint += (WCHAR) wParam - 0xdc00;
|
|
|
+ codepoint += 0x10000;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ codepoint = (WCHAR) wParam;
|
|
|
|
|
|
- if (uMsg == WM_UNICHAR && wParam == UNICODE_NOCHAR)
|
|
|
+ window->win32.highSurrogate = 0;
|
|
|
+ _glfwInputChar(window, codepoint, getKeyMods(), uMsg != WM_SYSCHAR);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (uMsg == WM_SYSCHAR && window->win32.keymenu)
|
|
|
+ break;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ case WM_UNICHAR:
|
|
|
+ {
|
|
|
+ if (wParam == UNICODE_NOCHAR)
|
|
|
{
|
|
|
// WM_UNICHAR is not sent by Windows, but is sent by some
|
|
|
// third-party input method engine
|
|
@@ -658,11 +685,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|
|
return TRUE;
|
|
|
}
|
|
|
|
|
|
- _glfwInputChar(window, (unsigned int) wParam, getKeyMods(), plain);
|
|
|
-
|
|
|
- if (uMsg == WM_SYSCHAR && window->win32.keymenu)
|
|
|
- break;
|
|
|
-
|
|
|
+ _glfwInputChar(window, (unsigned int) wParam, getKeyMods(), GLFW_TRUE);
|
|
|
return 0;
|
|
|
}
|
|
|
|