Aric Stewart : imm32: Properly handle unicode and non unicode IMEs with SetCompositionString.

Alexandre Julliard julliard at winehq.org
Mon Apr 7 14:46:53 CDT 2008


Module: wine
Branch: master
Commit: e7c00ca727fe08f5d98171af18df248c6c307340
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e7c00ca727fe08f5d98171af18df248c6c307340

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Apr  7 10:45:22 2008 -0500

imm32: Properly handle unicode and non unicode IMEs with SetCompositionString.

---

 dlls/imm32/imm.c |   51 ++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index beda98f..0995fb6 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -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;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list