Module: wine Branch: master Commit: d8c91f58e23c45344acb3255eaab2f30af909358 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d8c91f58e23c45344acb3255ea...
Author: Aric Stewart aric@codeweavers.com Date: Mon Sep 15 08:49:54 2008 -0500
imm32: Update CopyCompClauseIMEtoClient to handle A->W and W->A conversions.
---
dlls/imm32/imm.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 49 insertions(+), 3 deletions(-)
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index b826163..602aeca 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -1078,10 +1078,56 @@ static INT CopyCompAttrIMEtoClient(InputContextData *data, LPBYTE source, INT sl static INT CopyCompClauseIMEtoClient(InputContextData *data, LPBYTE source, INT slen, LPBYTE ssource, INT sslen, LPBYTE target, INT tlen, BOOL unicode ) { - if ( target && source && tlen >= slen) - memcpy( target , source , slen); + INT rc; + + if (is_himc_ime_unicode(data) && !unicode) + { + if (tlen) + { + int i; + + if (slen < tlen) + tlen = slen; + tlen /= sizeof (DWORD); + for (i = 0; i < tlen; ++i) + { + ((DWORD *)target)[i] = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)ssource, + ((DWORD *)source)[i], + NULL, 0, + NULL, NULL); + } + rc = sizeof (DWORD) * i; + } + else + rc = slen; + } + else if (!is_himc_ime_unicode(data) && unicode) + { + if (tlen) + { + int i; + + if (slen < tlen) + tlen = slen; + tlen /= sizeof (DWORD); + for (i = 0; i < tlen; ++i) + { + ((DWORD *)target)[i] = MultiByteToWideChar(CP_ACP, 0, (LPSTR)ssource, + ((DWORD *)source)[i], + NULL, 0); + } + rc = sizeof (DWORD) * i; + } + else + rc = slen; + } + else + { + memcpy( target, source, min(slen,tlen)); + rc = slen; + }
- return slen; + return rc; }
static INT CopyCompOffsetIMEtoClient(InputContextData *data, DWORD offset, LPBYTE ssource, BOOL unicode)