imm32: Properly handle unicode and non unicode IMEs with SetCompositionString.
authorAric Stewart <aric@codeweavers.com>
Mon, 7 Apr 2008 15:45:22 +0000 (10:45 -0500)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 7 Apr 2008 18:53:23 +0000 (20:53 +0200)
dlls/imm32/imm.c

index beda98f7c81040de2bfebcc4b7d62ca9a432d70e..0995fb68e290326512f69f9b6db18f369e87a026 100644 (file)
@@ -1472,10 +1472,18 @@ BOOL WINAPI ImmSetCompositionStringA(
     WCHAR *CompBuffer = NULL;
     WCHAR *ReadBuffer = NULL;
     BOOL rc;
+    InputContextData *data = (InputContextData*)hIMC;
 
     TRACE("(%p, %d, %p, %d, %p, %d):\n",
             hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen);
 
+    if (!data)
+        return FALSE;
+
+    if (!is_himc_ime_unicode(data))
+        return data->immKbd->pImeSetCompositionString(hIMC, dwIndex, lpComp,
+                        dwCompLen, lpRead, dwReadLen);
+
     comp_len = MultiByteToWideChar(CP_ACP, 0, lpComp, dwCompLen, NULL, 0);
     if (comp_len)
     {
@@ -1507,19 +1515,48 @@ BOOL WINAPI ImmSetCompositionStringW(
        LPCVOID lpComp, DWORD dwCompLen,
        LPCVOID lpRead, DWORD dwReadLen)
 {
-     InputContextData *data = (InputContextData*)hIMC;
+    DWORD comp_len;
+    DWORD read_len;
+    CHAR *CompBuffer = NULL;
+    CHAR *ReadBuffer = NULL;
+    BOOL rc;
+    InputContextData *data = (InputContextData*)hIMC;
 
-     TRACE("(%p, %d, %p, %d, %p, %d):\n",
-             hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen);
+    TRACE("(%p, %d, %p, %d, %p, %d):\n",
+            hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen);
 
-     if (!data)
+    if (!data)
         return FALSE;
 
-     if (is_himc_ime_unicode(data))
+    if (is_himc_ime_unicode(data))
         return data->immKbd->pImeSetCompositionString(hIMC, dwIndex, lpComp,
                         dwCompLen, lpRead, dwReadLen);
-     else
-        return FALSE;
+
+    comp_len = WideCharToMultiByte(CP_ACP, 0, lpComp, dwCompLen, NULL, 0, NULL,
+                                   NULL);
+    if (comp_len)
+    {
+        CompBuffer = HeapAlloc(GetProcessHeap(),0,comp_len);
+        WideCharToMultiByte(CP_ACP, 0, lpComp, dwCompLen, CompBuffer, comp_len,
+                            NULL, NULL);
+    }
+
+    read_len = WideCharToMultiByte(CP_ACP, 0, lpRead, dwReadLen, NULL, 0, NULL,
+                                   NULL);
+    if (read_len)
+    {
+        ReadBuffer = HeapAlloc(GetProcessHeap(),0,read_len);
+        WideCharToMultiByte(CP_ACP, 0, lpRead, dwReadLen, ReadBuffer, read_len,
+                            NULL, NULL);
+    }
+
+    rc =  ImmSetCompositionStringA(hIMC, dwIndex, CompBuffer, comp_len,
+                                   ReadBuffer, read_len);
+
+    HeapFree(GetProcessHeap(), 0, CompBuffer);
+    HeapFree(GetProcessHeap(), 0, ReadBuffer);
+
+    return rc;
 }
 
 /***********************************************************************