Skip to content
Permalink
Browse files

Fixed bug #447

Xlib uses the native locale, not latin1

... the question is... what does the server use? :)
  • Loading branch information
slouken committed Jul 4, 2007
1 parent b145b53 commit 4c351fcf59c2035ed12f331b82f56605ee7be00b
Showing with 35 additions and 10 deletions.
  1. +1 −2 include/SDL_stdinc.h
  2. +26 −0 src/stdlib/SDL_iconv.c
  3. +8 −8 src/video/x11/SDL_x11wm.c
@@ -584,8 +584,7 @@ extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, siz
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)

@@ -772,6 +772,26 @@ int SDL_iconv_close(SDL_iconv_t cd)

#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 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inb
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;
@@ -257,13 +257,13 @@ void X11_SetCaptionNoLock(_THIS, const char *title, const char *icon)
#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 @@ void X11_SetCaptionNoLock(_THIS, const char *title, const char *icon)
#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);

0 comments on commit 4c351fc

Please sign in to comment.