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