changeset 20697:c3ef81a9b92e draft

-Fix: [Win32] Handle Unicode characters from outside the BMP correctly.
author Michael Lutz <michi@icosahedron.de>
date Sun, 21 Jul 2013 22:35:24 +0200
parents d6112ef021b2
children cbef5ef83eb0
files src/video/win32_v.cpp
diffstat 1 files changed, 20 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/video/win32_v.cpp
+++ b/src/video/win32_v.cpp
@@ -434,12 +434,31 @@
 }
 
 /** 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);