/* GDK - The GIMP Drawing Kit
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ * Copyright (C) 1998-2002 Tor Lillqvist
*
* This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
- * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
+ * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include <config.h>
#include <stdlib.h>
#include <string.h>
+#include <locale.h>
-#include "gdkim.h"
#include "gdkpixmap.h"
-#include "gdkprivate.h"
+#include "gdkinternals.h"
#include "gdki18n.h"
-#include "gdkx.h"
+#include "gdkwin32.h"
/*
*--------------------------------------------------------------
gchar*
gdk_set_locale (void)
{
- gchar *current_locale;
-
- if (!setlocale (LC_ALL,""))
+ if (!setlocale (LC_ALL, ""))
g_warning ("locale not supported by C library");
- current_locale = setlocale (LC_ALL, NULL);
-
- return current_locale;
-}
-
-void
-gdk_im_begin (GdkIC *ic, GdkWindow* window)
-{
-}
-
-void
-gdk_im_end (void)
-{
-}
-
-GdkIMStyle
-gdk_im_decide_style (GdkIMStyle supported_style)
-{
- return GDK_IM_PREEDIT_NONE | GDK_IM_STATUS_NONE;
-}
-
-GdkIMStyle
-gdk_im_set_best_style (GdkIMStyle style)
-{
- return GDK_IM_PREEDIT_NONE | GDK_IM_STATUS_NONE;
-}
-
-gint
-gdk_im_ready (void)
-{
- return FALSE;
-}
-
-GdkIC *
-gdk_ic_new (GdkICAttr *attr, GdkICAttributesType mask)
-{
- return NULL;
-}
-
-void
-gdk_ic_destroy (GdkIC *ic)
-{
-}
-
-GdkIMStyle
-gdk_ic_get_style (GdkIC *ic)
-{
- return GDK_IM_PREEDIT_NONE | GDK_IM_STATUS_NONE;
-}
-
-void
-gdk_ic_set_values (GdkIC *ic, ...)
-{
-}
-
-void
-gdk_ic_get_values (GdkIC *ic, ...)
-{
-}
-
-GdkICAttributesType
-gdk_ic_set_attr (GdkIC *ic, GdkICAttr *attr, GdkICAttributesType mask)
-{
- return 0;
-}
-
-GdkICAttributesType
-gdk_ic_get_attr (GdkIC *ic, GdkICAttr *attr, GdkICAttributesType mask)
-{
- return 0;
-}
-
-GdkEventMask
-gdk_ic_get_events (GdkIC *ic)
-{
- return 0;
+ return g_win32_getlocale ();
}
/*
while (*wcp)
{
int first;
- int i;
GdkWChar c = *wcp++;
if (c < 0x80)
return mbstr;
}
+/* A vesion that converts from wchar_t strings to UTF-8 */
+
+gchar *
+_gdk_ucs2_to_utf8 (const wchar_t *src,
+ gint src_len)
+{
+ gint len;
+ const wchar_t *wcp;
+ guchar *mbstr, *bp;
+
+ wcp = src;
+ len = 0;
+ while (wcp < src + src_len)
+ {
+ const wchar_t c = *wcp++;
+
+ if (c < 0x80)
+ len += 1;
+ else if (c < 0x800)
+ len += 2;
+ else
+ len += 3;
+ }
+
+ mbstr = g_malloc (len + 1);
-/*
- * gdk_mbstowcs
- *
- * Converts the specified string into GDK wide characters, and,
- * returns the number of wide characters written. The string 'src'
- * must be null-terminated. If the conversion is failed, it returns
- * -1.
- *
- * On Win32, thr string is assumed to be in UTF-8. Also note that
- * GdkWChar is 32 bits, while wchar_t, and the wide characters the
- * Windows API uses, are 16 bits!
- */
+ wcp = src;
+ bp = mbstr;
+ while (wcp < src + src_len)
+ {
+ int first;
+ wchar_t c = *wcp++;
+
+ if (c < 0x80)
+ {
+ first = 0;
+ len = 1;
+ }
+ else if (c < 0x800)
+ {
+ first = 0xc0;
+ len = 2;
+ }
+ else
+ {
+ first = 0xe0;
+ len = 3;
+ }
+
+ /* Woo-hoo! */
+ switch (len)
+ {
+ case 3: bp[2] = (c & 0x3f) | 0x80; c >>= 6; /* Fall through */
+ case 2: bp[1] = (c & 0x3f) | 0x80; c >>= 6; /* Fall through */
+ case 1: bp[0] = c | first;
+ }
+
+ bp += len;
+ }
+ *bp = 0;
+
+ return mbstr;
+}
+
+/* Convert from UTF-8 to GdkWChar */
-/* First a helper function for not zero-terminated strings */
gint
-gdk_nmbstowcs (GdkWChar *dest,
- const gchar *src,
- gint src_len,
- gint dest_max)
+_gdk_utf8_to_wcs (GdkWChar *dest,
+ const gchar *src,
+ gint src_len,
+ gint dest_max)
{
guchar *cp, *end;
gint n;
return n;
}
+/*
+ * gdk_mbstowcs
+ *
+ * Converts the specified string into GDK wide characters, and,
+ * returns the number of wide characters written. The string 'src'
+ * must be null-terminated. If the conversion is failed, it returns
+ * -1.
+ *
+ * On Win32, the string is assumed to be in UTF-8. Also note that
+ * GdkWChar is 32 bits, while wchar_t, and the wide characters the
+ * Windows API uses, are 16 bits!
+ */
+
gint
gdk_mbstowcs (GdkWChar *dest,
const gchar *src,
gint dest_max)
{
- return gdk_nmbstowcs (dest, src, strlen (src), dest_max);
+ return _gdk_utf8_to_wcs (dest, src, strlen (src), dest_max);
}
-/* A version that converts to wchar_t wide chars */
+/* A version that converts to a wchar_t string */
gint
-gdk_nmbstowchar_ts (wchar_t *dest,
- const gchar *src,
- gint src_len,
- gint dest_max)
+_gdk_utf8_to_ucs2 (wchar_t *dest,
+ const gchar *src,
+ gint src_len,
+ gint dest_max)
{
+ wchar_t *wcp;
guchar *cp, *end;
gint n;
+ wcp = dest;
cp = (guchar *) src;
end = cp + src_len;
n = 0;
- while (cp != end && dest != dest + dest_max)
+ while (cp != end && wcp != dest + dest_max)
{
gint i, mask = 0, len;
guchar c = *cp;
if (cp + len > end)
return -1;
- *dest = (cp[0] & mask);
+ *wcp = (cp[0] & mask);
for (i = 1; i < len; i++)
{
if ((cp[i] & 0xc0) != 0x80)
return -1;
- *dest <<= 6;
- *dest |= (cp[i] & 0x3f);
+ *wcp <<= 6;
+ *wcp |= (cp[i] & 0x3f);
}
- if (*dest == 0xFFFF)
+ if (*wcp == 0xFFFF)
return -1;
cp += len;
- dest++;
+ wcp++;
n++;
}
if (cp != end)
return n;
}
-