diff options
author | michi_cc <michi_cc@openttd.org> | 2013-08-05 20:36:40 +0000 |
---|---|---|
committer | michi_cc <michi_cc@openttd.org> | 2013-08-05 20:36:40 +0000 |
commit | fdc436b531a36264d6f2ad8d4ae10170a8c281a8 (patch) | |
tree | 05812fe435175c36edfc49a540ccab297e1eb7be | |
parent | 019984a14f01e4463ae479765d2340ff26055367 (diff) | |
download | openttd-fdc436b531a36264d6f2ad8d4ae10170a8c281a8.tar.xz |
(svn r25672) -Fix: [Win32] Handle Unicode characters from outside the BMP correctly.
-rw-r--r-- | src/video/win32_v.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 7a6e8a866..fb50367fc 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -439,12 +439,31 @@ static void PaintWindowThread(void *) } /** Forward key presses to the window system. */ -static LRESULT HandleCharMsg(uint keycode, uint charcode) +static LRESULT HandleCharMsg(uint keycode, WChar charcode) { #if !defined(UNICODE) wchar_t w; int len = MultiByteToWideChar(_codepage, 0, (char*)&charcode, 1, &w, 1); charcode = len == 1 ? w : 0; +#else + static WChar prev_char = 0; + + /* Did we get a lead surrogate? If yes, store and exit. */ + if (Utf16IsLeadSurrogate(charcode)) { + if (prev_char != 0) DEBUG(driver, 1, "Got two UTF-16 lead surrogates, dropping the first one"); + prev_char = charcode; + return 0; + } + + /* Stored lead surrogate and incoming trail surrogate? Combine and forward to input handling. */ + if (prev_char != 0) { + if (Utf16IsTrailSurrogate(charcode)) { + charcode = Utf16DecodeSurrogate(prev_char, charcode); + } else { + DEBUG(driver, 1, "Got an UTF-16 lead surrogate without a trail surrogate, dropping the lead surrogate"); + } + } + prev_char = 0; #endif /* UNICODE */ HandleKeypress(keycode, charcode); |