Module: wine Branch: master Commit: e7c00ca727fe08f5d98171af18df248c6c307340 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e7c00ca727fe08f5d98171af18...
Author: Aric Stewart aric@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; }
/***********************************************************************