src/video/wincommon/SDL_syswm.c
branchSDL-1.2
changeset 3919 d13618a935a2
parent 3869 b0955ae208f3
child 4088 cbe2f23a1c2b
--- a/src/video/wincommon/SDL_syswm.c	Fri Feb 16 03:50:42 2007 +0000
+++ b/src/video/wincommon/SDL_syswm.c	Fri Feb 16 04:56:17 2007 +0000
@@ -207,6 +207,8 @@
 #endif /* DISABLE_ICON_SUPPORT */
 }
 
+typedef BOOL (WINAPI *PtrSetWindowTextW)(HWND hWnd, LPCWSTR lpString);
+
 void WIN_SetWMCaption(_THIS, const char *title, const char *icon)
 {
 #ifdef _WIN32_WCE
@@ -215,8 +217,36 @@
 	SetWindowText(SDL_Window, lpszW);
 	SDL_free(lpszW);
 #else
-	char *lpsz = SDL_iconv_utf8_latin1((char *)title);
-	SetWindowText(SDL_Window, lpsz);
+	/*
+	 * Try loading SetWindowTextW from kernel32.dll first, and if it exists,
+	 *  pass the UCS-2 string to it. If it doesn't, use
+	 *  WideCharToMultiByte(CP_ACP) and hope that the codepage can support the
+	 *  string data in question. This lets us keep binary compatibility with
+	 *  Win95/98/ME but still use saner Unicode on NT-based Windows.
+	 */
+	static int tried_loading = 0;
+	static PtrSetWindowTextW swtw = NULL;
+	Uint16 *lpsz = SDL_iconv_utf8_ucs2(title);
+	if (!tried_loading) {
+		HMODULE dll = LoadLibrary("user32.dll");
+		if (dll != NULL) {
+			swtw = (PtrSetWindowTextW) GetProcAddress(dll, "SetWindowTextW");
+			if (swtw == NULL) {
+				FreeLibrary(dll);
+			}
+		}
+		tried_loading = 1;
+	}
+
+	if (swtw != NULL) {
+		swtw(SDL_Window, lpsz);
+	} else {
+		size_t len = WideCharToMultiByte(CP_ACP, 0, lpsz, -1, NULL, 0, NULL, NULL);
+		char *cvt = SDL_malloc(len + 1);
+		WideCharToMultiByte(CP_ACP, 0, lpsz, -1, cvt, len, NULL, NULL);
+		SetWindowText(SDL_Window, cvt);
+		SDL_free(cvt);
+	}
 	SDL_free(lpsz);
 #endif
 }