changeset 3998:098ac044cd2f SDL-1.2

Fixed bug #447 Xlib uses the native locale, not latin1 ... the question is... what does the server use? :)
author Sam Lantinga <slouken@libsdl.org>
date Wed, 04 Jul 2007 07:54:06 +0000
parents 6a4f3a32c2e6
children f61a20d195f7
files include/SDL_stdinc.h src/stdlib/SDL_iconv.c src/video/x11/SDL_x11wm.c
diffstat 3 files changed, 35 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/include/SDL_stdinc.h	Wed Jul 04 04:27:47 2007 +0000
+++ b/include/SDL_stdinc.h	Wed Jul 04 07:54:06 2007 +0000
@@ -584,8 +584,7 @@
    string that must be freed with SDL_free() or NULL on error.
 */
 extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft);
-#define SDL_iconv_utf8_ascii(S)		SDL_iconv_string("646", "UTF-8", S, SDL_strlen(S)+1)
-#define SDL_iconv_utf8_latin1(S)	SDL_iconv_string("8859-1", "UTF-8", S, SDL_strlen(S)+1)
+#define SDL_iconv_utf8_locale(S)	SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1)
 #define SDL_iconv_utf8_ucs2(S)		(Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1)
 #define SDL_iconv_utf8_ucs4(S)		(Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1)
 
--- a/src/stdlib/SDL_iconv.c	Wed Jul 04 04:27:47 2007 +0000
+++ b/src/stdlib/SDL_iconv.c	Wed Jul 04 07:54:06 2007 +0000
@@ -772,6 +772,26 @@
 
 #endif /* !HAVE_ICONV */
 
+static const char *getlocale()
+{
+	const char *lang;
+
+	lang = SDL_getenv("LC_ALL");
+	if ( !lang ) {
+		lang = SDL_getenv("LC_CTYPE");
+	}
+	if ( !lang ) {
+		lang = SDL_getenv("LC_MESSAGES");
+	}
+	if ( !lang ) {
+		lang = SDL_getenv("LANG");
+	}
+	if ( !lang || SDL_strcmp(lang, "C") == 0 ) {
+		lang = "ASCII";
+	}
+	return lang;
+}
+
 char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft)
 {
 	SDL_iconv_t cd;
@@ -781,6 +801,12 @@
 	size_t outbytesleft;
 	size_t retCode = 0;
 
+	if ( !fromcode || !*fromcode ) {
+		fromcode = getlocale();
+	}
+	if ( !tocode || !*tocode ) {
+		tocode = getlocale();
+	}
 	cd = SDL_iconv_open(tocode, fromcode);
 	if ( cd == (SDL_iconv_t)-1 ) {
 		return NULL;
--- a/src/video/x11/SDL_x11wm.c	Wed Jul 04 04:27:47 2007 +0000
+++ b/src/video/x11/SDL_x11wm.c	Wed Jul 04 07:54:06 2007 +0000
@@ -257,13 +257,13 @@
 #endif
 
 	if ( title != NULL ) {
-		char *title_latin1 = SDL_iconv_utf8_latin1((char *)title);
-		if ( !title_latin1 ) {
+		char *title_locale = SDL_iconv_utf8_locale(title);
+		if ( !title_locale ) {
 			SDL_OutOfMemory();
 			return;
 		}
-		status = XStringListToTextProperty(&title_latin1, 1, &titleprop);
-		SDL_free(title_latin1);
+		status = XStringListToTextProperty(&title_locale, 1, &titleprop);
+		SDL_free(title_locale);
 		if ( status ) {
 			XSetTextProperty(SDL_Display, WMwindow, &titleprop, XA_WM_NAME);
 			XFree(titleprop.value);
@@ -280,13 +280,13 @@
 #endif
 	}
 	if ( icon != NULL ) {
-		char *icon_latin1 = SDL_iconv_utf8_latin1((char *)icon);
-		if ( !icon_latin1 ) {
+		char *icon_locale = SDL_iconv_utf8_locale(icon);
+		if ( !icon_locale ) {
 			SDL_OutOfMemory();
 			return;
 		}
-		status = XStringListToTextProperty(&icon_latin1, 1, &iconprop);
-		SDL_free(icon_latin1);
+		status = XStringListToTextProperty(&icon_locale, 1, &iconprop);
+		SDL_free(icon_locale);
 		if ( status ) {
 			XSetTextProperty(SDL_Display, WMwindow, &iconprop, XA_WM_ICON_NAME);
 			XFree(iconprop.value);