]> Pileus Git - ~andy/gtk/blobdiff - gdk/win32/gdkim-win32.c
Merge from stable:
[~andy/gtk] / gdk / win32 / gdkim-win32.c
index 0d553176555febc50ba87ebc85c2ac5330ad7ab7..b31b1b5dd336b1c36f1e0b61add36139a5ee03a1 100644 (file)
@@ -1,41 +1,40 @@
 /* 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 ();
 }
 
 /*
@@ -180,7 +102,6 @@ gdk_wcstombs (const GdkWChar *src)
   while (*wcp)
     {
       int first;
-      int i;
       GdkWChar c = *wcp++;
 
       if (c < 0x80)
@@ -231,26 +152,77 @@ gdk_wcstombs (const GdkWChar *src)
   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;
@@ -320,30 +292,45 @@ gdk_nmbstowcs (GdkWChar    *dest,
   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;
@@ -369,19 +356,19 @@ gdk_nmbstowchar_ts (wchar_t     *dest,
       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)
@@ -389,4 +376,3 @@ gdk_nmbstowchar_ts (wchar_t     *dest,
 
   return n;
 }
-