Fixed bug #447
Xlib uses the native locale, not latin1
... the question is... what does the server use? :)
--- 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);