diff --git a/ChangeLog b/ChangeLog index 3870762c6..cbce163c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Wed Dec 16 22:50:52 1998 Owen Taylor + + * gdk/gdk.c gdk/gdkim.c: Check for broken glibc 2.0 + mb functions, and avoid them. + Wed Dec 16 16:57:55 1998 Owen Taylor * gdk/gdkevents.c (gdk_events_queue): Don't diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 3870762c6..cbce163c1 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,8 @@ +Wed Dec 16 22:50:52 1998 Owen Taylor + + * gdk/gdk.c gdk/gdkim.c: Check for broken glibc 2.0 + mb functions, and avoid them. + Wed Dec 16 16:57:55 1998 Owen Taylor * gdk/gdkevents.c (gdk_events_queue): Don't diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 3870762c6..cbce163c1 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,8 @@ +Wed Dec 16 22:50:52 1998 Owen Taylor + + * gdk/gdk.c gdk/gdkim.c: Check for broken glibc 2.0 + mb functions, and avoid them. + Wed Dec 16 16:57:55 1998 Owen Taylor * gdk/gdkevents.c (gdk_events_queue): Don't diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 3870762c6..cbce163c1 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,8 @@ +Wed Dec 16 22:50:52 1998 Owen Taylor + + * gdk/gdk.c gdk/gdkim.c: Check for broken glibc 2.0 + mb functions, and avoid them. + Wed Dec 16 16:57:55 1998 Owen Taylor * gdk/gdkevents.c (gdk_events_queue): Don't diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 3870762c6..cbce163c1 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,8 @@ +Wed Dec 16 22:50:52 1998 Owen Taylor + + * gdk/gdk.c gdk/gdkim.c: Check for broken glibc 2.0 + mb functions, and avoid them. + Wed Dec 16 16:57:55 1998 Owen Taylor * gdk/gdkevents.c (gdk_events_queue): Don't diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 3870762c6..cbce163c1 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,8 @@ +Wed Dec 16 22:50:52 1998 Owen Taylor + + * gdk/gdk.c gdk/gdkim.c: Check for broken glibc 2.0 + mb functions, and avoid them. + Wed Dec 16 16:57:55 1998 Owen Taylor * gdk/gdkevents.c (gdk_events_queue): Don't diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 3870762c6..cbce163c1 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,8 @@ +Wed Dec 16 22:50:52 1998 Owen Taylor + + * gdk/gdk.c gdk/gdkim.c: Check for broken glibc 2.0 + mb functions, and avoid them. + Wed Dec 16 16:57:55 1998 Owen Taylor * gdk/gdkevents.c (gdk_events_queue): Don't diff --git a/gdk/gdk.c b/gdk/gdk.c index e09548083..1e3e04954 100644 --- a/gdk/gdk.c +++ b/gdk/gdk.c @@ -18,7 +18,6 @@ */ #include "config.h" -#include #include #include #include @@ -448,39 +447,6 @@ gdk_exit (int errorcode) exit (errorcode); } -/* - *-------------------------------------------------------------- - * gdk_set_locale - * - * Arguments: - * - * Results: - * - * Side effects: - * - *-------------------------------------------------------------- - */ - -gchar* -gdk_set_locale (void) -{ - if (!setlocale (LC_ALL,"")) - g_message ("locale not supported by C library"); - - if (!XSupportsLocale ()) - { - g_message ("locale not supported by Xlib, locale set to C"); - setlocale (LC_ALL, "C"); - } - - if (!XSetLocaleModifiers ("")) - { - g_message ("can not set locale modifiers"); - } - - return setlocale (LC_ALL,NULL); -} - void gdk_set_use_xshm (gint use_xshm) { diff --git a/gdk/gdkim.c b/gdk/gdkim.c index 5b2ded3fd..417430d0f 100644 --- a/gdk/gdkim.c +++ b/gdk/gdkim.c @@ -17,6 +17,7 @@ * Boston, MA 02111-1307, USA. */ +#include #include "gdk.h" #include "gdkprivate.h" #include "gdki18n.h" @@ -39,6 +40,12 @@ typedef struct { gpointer value; } GdkImArg; +/* If this variable is FALSE, it indicates that we should + * avoid trying to use multibyte conversion functions and + * assume everything is 1-byte per character + */ +gboolean gdk_use_mb; + #ifdef USE_XIM static void gdk_im_instantiate_cb (Display *display, @@ -61,6 +68,69 @@ static GList* xim_ic_list; #endif /* USE_XIM */ +/* + *-------------------------------------------------------------- + * gdk_set_locale + * + * Arguments: + * + * Results: + * + * Side effects: + * + *-------------------------------------------------------------- + */ + +gchar* +gdk_set_locale (void) +{ + wchar_t result; + gchar *current_locale; + + gdk_use_mb = FALSE; + + if (!setlocale (LC_ALL,"")) + g_message ("locale not supported by C library"); + + if (!XSupportsLocale ()) + { + g_message ("locale not supported by Xlib, locale set to C"); + setlocale (LC_ALL, "C"); + } + + if (!XSetLocaleModifiers ("")) + g_message ("can not set locale modifiers"); + + current_locale = setlocale (LC_ALL, ""); + + if ((strcmp (current_locale, "C")) && (strcmp (current_locale, "POSIX"))) + { + gdk_use_mb = TRUE; + +#ifndef X_LOCALE + /* Detect GNU libc, where mb == UTF8. Not useful unless it's + * really a UTF8 locale. The below still probably will + * screw up on Greek, Cyrillic, etc, encoded as UTF8. + */ + + if ((MB_CUR_MAX == 2) && + (mbstowcs (&result, "\xdd\xa5", 1) > 0) && + result == 0x765) + { + if ((strlen (current_locale) < 4) || + g_strcasecmp (current_locale + strlen(current_locale) - 4, "utf8")) + gdk_use_mb = FALSE; + } +#endif /* X_LOCALE */ + } + + GDK_NOTE (XIM, + g_message ("%s multi-byte string functions.", + gdk_use_mb ? "Using" : "Not using")); + + return setlocale (LC_ALL,NULL); +} + /* *-------------------------------------------------------------- * gdk_im_begin @@ -1374,37 +1444,56 @@ gchar * gdk_wcstombs (const GdkWChar *src) { gchar *mbstr; - XTextProperty tpr; - if (sizeof(wchar_t) != sizeof(GdkWChar)) + + if (gdk_use_mb) { - gint i; - wchar_t *src_alt; - for (i=0; src[i]; i++); - src_alt = g_new (wchar_t, i+1); - for (; i>=0; i--) - src_alt[i] = src[i]; - if (XwcTextListToTextProperty (gdk_display, &src_alt, 1, XTextStyle, &tpr) - != Success) + XTextProperty tpr; + + if (sizeof(wchar_t) != sizeof(GdkWChar)) { + gint i; + wchar_t *src_alt; + for (i=0; src[i]; i++); + src_alt = g_new (wchar_t, i+1); + for (; i>=0; i--) + src_alt[i] = src[i]; + if (XwcTextListToTextProperty (gdk_display, &src_alt, 1, XTextStyle, &tpr) + != Success) + { + g_free (src_alt); + return NULL; + } g_free (src_alt); - return NULL; } - g_free (src_alt); + else + { + if (XwcTextListToTextProperty (gdk_display, (wchar_t**)&src, 1, + XTextStyle, &tpr) != Success) + { + return NULL; + } + } + /* + * We must copy the string into an area allocated by glib, because + * the string 'tpr.value' must be freed by XFree(). + */ + mbstr = g_strdup(tpr.value); + XFree (tpr.value); } else { - if (XwcTextListToTextProperty (gdk_display, (wchar_t**)&src, 1, - XTextStyle, &tpr) != Success) - { - return NULL; - } + gint length = 0; + gint i; + + while (src[length++] != 0) + ; + + mbstr = g_new (gchar, length + 1); + + for (i=0; i #include "gdk.h" #include "gdkprivate.h" #include "gdki18n.h" @@ -39,6 +40,12 @@ typedef struct { gpointer value; } GdkImArg; +/* If this variable is FALSE, it indicates that we should + * avoid trying to use multibyte conversion functions and + * assume everything is 1-byte per character + */ +gboolean gdk_use_mb; + #ifdef USE_XIM static void gdk_im_instantiate_cb (Display *display, @@ -61,6 +68,69 @@ static GList* xim_ic_list; #endif /* USE_XIM */ +/* + *-------------------------------------------------------------- + * gdk_set_locale + * + * Arguments: + * + * Results: + * + * Side effects: + * + *-------------------------------------------------------------- + */ + +gchar* +gdk_set_locale (void) +{ + wchar_t result; + gchar *current_locale; + + gdk_use_mb = FALSE; + + if (!setlocale (LC_ALL,"")) + g_message ("locale not supported by C library"); + + if (!XSupportsLocale ()) + { + g_message ("locale not supported by Xlib, locale set to C"); + setlocale (LC_ALL, "C"); + } + + if (!XSetLocaleModifiers ("")) + g_message ("can not set locale modifiers"); + + current_locale = setlocale (LC_ALL, ""); + + if ((strcmp (current_locale, "C")) && (strcmp (current_locale, "POSIX"))) + { + gdk_use_mb = TRUE; + +#ifndef X_LOCALE + /* Detect GNU libc, where mb == UTF8. Not useful unless it's + * really a UTF8 locale. The below still probably will + * screw up on Greek, Cyrillic, etc, encoded as UTF8. + */ + + if ((MB_CUR_MAX == 2) && + (mbstowcs (&result, "\xdd\xa5", 1) > 0) && + result == 0x765) + { + if ((strlen (current_locale) < 4) || + g_strcasecmp (current_locale + strlen(current_locale) - 4, "utf8")) + gdk_use_mb = FALSE; + } +#endif /* X_LOCALE */ + } + + GDK_NOTE (XIM, + g_message ("%s multi-byte string functions.", + gdk_use_mb ? "Using" : "Not using")); + + return setlocale (LC_ALL,NULL); +} + /* *-------------------------------------------------------------- * gdk_im_begin @@ -1374,37 +1444,56 @@ gchar * gdk_wcstombs (const GdkWChar *src) { gchar *mbstr; - XTextProperty tpr; - if (sizeof(wchar_t) != sizeof(GdkWChar)) + + if (gdk_use_mb) { - gint i; - wchar_t *src_alt; - for (i=0; src[i]; i++); - src_alt = g_new (wchar_t, i+1); - for (; i>=0; i--) - src_alt[i] = src[i]; - if (XwcTextListToTextProperty (gdk_display, &src_alt, 1, XTextStyle, &tpr) - != Success) + XTextProperty tpr; + + if (sizeof(wchar_t) != sizeof(GdkWChar)) { + gint i; + wchar_t *src_alt; + for (i=0; src[i]; i++); + src_alt = g_new (wchar_t, i+1); + for (; i>=0; i--) + src_alt[i] = src[i]; + if (XwcTextListToTextProperty (gdk_display, &src_alt, 1, XTextStyle, &tpr) + != Success) + { + g_free (src_alt); + return NULL; + } g_free (src_alt); - return NULL; } - g_free (src_alt); + else + { + if (XwcTextListToTextProperty (gdk_display, (wchar_t**)&src, 1, + XTextStyle, &tpr) != Success) + { + return NULL; + } + } + /* + * We must copy the string into an area allocated by glib, because + * the string 'tpr.value' must be freed by XFree(). + */ + mbstr = g_strdup(tpr.value); + XFree (tpr.value); } else { - if (XwcTextListToTextProperty (gdk_display, (wchar_t**)&src, 1, - XTextStyle, &tpr) != Success) - { - return NULL; - } + gint length = 0; + gint i; + + while (src[length++] != 0) + ; + + mbstr = g_new (gchar, length + 1); + + for (i=0; i #include #include #include @@ -448,39 +447,6 @@ gdk_exit (int errorcode) exit (errorcode); } -/* - *-------------------------------------------------------------- - * gdk_set_locale - * - * Arguments: - * - * Results: - * - * Side effects: - * - *-------------------------------------------------------------- - */ - -gchar* -gdk_set_locale (void) -{ - if (!setlocale (LC_ALL,"")) - g_message ("locale not supported by C library"); - - if (!XSupportsLocale ()) - { - g_message ("locale not supported by Xlib, locale set to C"); - setlocale (LC_ALL, "C"); - } - - if (!XSetLocaleModifiers ("")) - { - g_message ("can not set locale modifiers"); - } - - return setlocale (LC_ALL,NULL); -} - void gdk_set_use_xshm (gint use_xshm) {