13#ifdef IMM_WIN3_SUPPORT
15#define ALIGN_DWORD(len) (((len) + 3) & ~3)
16#define ALIGN_ASTR_SIZE(len) ALIGN_DWORD(2 * (len) + sizeof(ANSI_NULL))
17#define ALIGN_WSTR_SIZE(len) ALIGN_DWORD((len) * sizeof(WCHAR) + sizeof(UNICODE_NULL))
20#define KOR_LEAD_BYTE_FIRST ((BYTE)0xB0)
21#define KOR_LEAD_BYTE_LAST ((BYTE)0xC8)
22#define KOR_IS_LEAD_BYTE(ch) \
23 (KOR_LEAD_BYTE_FIRST <= (BYTE)(ch) && (BYTE)(ch) <= KOR_LEAD_BYTE_LAST)
25#define KOR_SCAN_CODE_SBCS 0xFFF10001
26#define KOR_SCAN_CODE_DBCS 0xFFF20001
27#define KOR_KEYDOWN_FLAGS 0xE0001
28#define KOR_INTERIM_FLAGS 0xF00001
30static inline INT Imm32WideToAnsi(
PCWCH pchWide,
INT cchWide,
PSTR pszAnsi,
INT cchAnsi)
34 NULL, &usedDefaultChar);
35 if (pszAnsi &&
len >= 0 &&
len < cchAnsi)
40static inline INT Imm32AnsiToWide(
PCCH pchAnsi,
INT cchAnsi,
PWSTR pszWide,
INT cchWide)
43 if (pszWide &&
len >= 0 &&
len < cchWide)
71 return (dwResultStrLen + 1) *
sizeof(
WCHAR);
81 const DWORD cbRequired =
100 const BYTE* pbCS = (
const BYTE*)pCS;
170Imm32CompStrWToUndetA(
176 const DWORD cbRequired =
191 pDet->
dwSize = cbRequired;
195 const BYTE* pbCS = (
const BYTE*)pCS;
203 INT cchAnsi = Imm32WideToAnsi(pCompStrW, pCS->
dwCompStrLen, pchA, cbRequired - ib);
215 PBYTE pDestAttr = pbDet + ib;
222 pDestAttr[ibIndex++] = pSrcAttr[
i];
223 pDestAttr[ibIndex++] = pSrcAttr[
i];
227 pDestAttr[ibIndex++] = pSrcAttr[
i];
254 (
PSTR)(pbDet + ib), cbRequired - ib);
267 for (
DWORD i = 0;
i < nClauses; ++
i)
277 (
PSTR)(pbDet + ib), cbRequired - ib);
290 for (
DWORD i = 0;
i < nClauses; ++
i)
301Imm32CompStrWToStringExW(
307 const DWORD cbRequired =
324 const BYTE* pbCS = (
const BYTE*)pCS;
365Imm32CompStrWToStringExA(
371 const DWORD cbRequired =
388 const BYTE* pbCS = (
const BYTE*)pCS;
397 if (nAnsiResultLen <= 0)
410 for (
DWORD i = 0;
i < nClauses; ++
i)
422 if (nAnsiReadLen <= 0)
435 for (
DWORD i = 0;
i < nClauses; ++
i)
446Imm32CompStrAToUndetA(
452 const DWORD cbRequired =
540Imm32CompStrAToUndetW(
546 const DWORD cbRequired =
565 const BYTE* pbCS = (
const BYTE*)pCS;
586 PBYTE pDestAttr = pbUndet + ib;
591 pDestAttr[
i] = *pSrcAttr;
593 ULONG cbMultiByte = 0;
595 pSrcAttr += (cbMultiByte == 2) ? 2 : 1;
636 for (
DWORD i = 0;
i < nClauses; ++
i)
662 for (
DWORD i = 0;
i < nClauses; ++
i)
674Imm32CompStrAToStringExA(
697 const BYTE* pbCS = (
const BYTE*)pCS;
735Imm32CompStrAToStringExW(
741 const DWORD cbRequired =
758 const BYTE* pbCS = (
const BYTE*)pCS;
767 if (nWideResultLen <= 0)
779 for (
DWORD i = 0;
i < nClauses; ++
i)
794 if (nWideReadLen <= 0)
805 for (
DWORD i = 0;
i < nClauses; ++
i)
819 return dwResultStrLen + 1;
820 if (
dwSize < dwResultStrLen + 1)
824 return dwResultStrLen + 1;
831 DWORD dwResultStrLen = (cchWide + 1) *
sizeof(
WCHAR);
833 return dwResultStrLen;
834 if (
dwSize < dwResultStrLen)
896 BYTE bTestChar = *pCurrent;
905 nConverted = Imm32AnsiToWide(pCurrent, 2, szWide,
_countof(szWide));
907 nConverted = Imm32AnsiToWide(pCurrent, 1, szWide,
_countof(szWide));
927 for (; *pCurrent; pCurrent = pNext)
933 CHAR szAnsi[3] = {0};
934 if (!Imm32WideToAnsi(pCurrent, 1, szAnsi,
_countof(szAnsi)))
943 if (bSupportDBCSReport)
963 for (; *pCurrent; pCurrent = pNext)
975Imm32JTransCompositionA(
997 cbUndet = Imm32CompStrAToUndetA(dwGCS, pCS,
NULL, 0);
1006 cbUndet = Imm32CompStrAToUndetA(dwGCS, pCS, pUndet, cbUndet);
1013 bUndeterminedProcessed =
TRUE;
1022 cbUndet = Imm32CompStrAToUndetW(dwGCS, pCS,
NULL, 0);
1031 cbUndet = Imm32CompStrAToUndetW(dwGCS, pCS, pUndet, cbUndet);
1038 bUndeterminedProcessed =
TRUE;
1048 if (bUndeterminedProcessed)
1056 DWORD exSize, strSize;
1062 exSize = bIsUnicodeWnd ? Imm32CompStrAToStringExW(dwGCS, pCS,
NULL, 0)
1063 : Imm32CompStrAToStringExA(dwGCS, pCS,
NULL, 0);
1072 bExSuccess = bIsUnicodeWnd
1073 ? Imm32CompStrAToStringExW(dwGCS, pCS, pEx, exSize)
1074 : Imm32CompStrAToStringExA(dwGCS, pCS, pEx, exSize);
1084 bResultProcessed =
TRUE;
1094 strSize = bIsUnicodeWnd ? Imm32CompStrAToStringW(pCS,
NULL, 0) : (pCS->dwResultStrLen + 1);
1095 if (strSize && strSize != (
DWORD)-1)
1103 bStrSuccess = bIsUnicodeWnd
1104 ? Imm32CompStrAToStringW(pCS, pStr, strSize)
1105 : Imm32CompStrAToStringA(pCS, pStr, strSize);
1115 bResultProcessed =
TRUE;
1125 Imm32CompStrAToCharW(
hWnd, pCS);
1127 Imm32CompStrAToCharA(
hWnd, pCS);
1129 bResultProcessed =
TRUE;
1133 if (!bUndeterminedProcessed)
1135 if (bResultProcessed)
1149 *pEntries = *pCurrent;
1158Imm32JTransCompositionW(
1181 cbUndet = Imm32CompStrWToUndetA(dwGCS, pCS,
NULL, 0);
1190 cbUndet = Imm32CompStrWToUndetA(dwGCS, pCS, pUndet, cbUndet);
1197 bUndeterminedProcessed =
TRUE;
1206 cbUndet = Imm32CompStrWToUndetW(dwGCS, pCS,
NULL, 0);
1215 cbUndet = Imm32CompStrWToUndetW(dwGCS, pCS, pUndet, cbUndet);
1222 bUndeterminedProcessed =
TRUE;
1232 if (bUndeterminedProcessed)
1240 DWORD exSize, strSize;
1246 exSize = bIsUnicodeWnd
1247 ? Imm32CompStrWToStringExW(dwGCS, pCS,
NULL, 0)
1248 : Imm32CompStrWToStringExA(dwGCS, pCS,
NULL, 0);
1257 bExSuccess = bIsUnicodeWnd
1258 ? Imm32CompStrWToStringExW(dwGCS, pCS, pEx, exSize)
1259 : Imm32CompStrWToStringExA(dwGCS, pCS, pEx, exSize);
1269 bResultProcessed =
TRUE;
1279 strSize = bIsUnicodeWnd
1280 ? Imm32CompStrWToStringW(pCS,
NULL)
1281 : Imm32CompStrWToStringA(pCS,
NULL);
1282 if (strSize && strSize != (
DWORD)-1)
1290 bStrSuccess = bIsUnicodeWnd ? Imm32CompStrWToStringW(pCS, pStr)
1291 : Imm32CompStrWToStringA(pCS, pStr);
1301 bResultProcessed =
TRUE;
1311 Imm32CompStrWToCharW(
hWnd, pCS);
1313 Imm32CompStrWToCharA(
hWnd, pCS);
1315 bResultProcessed =
TRUE;
1319 if (!bUndeterminedProcessed)
1321 if (bResultProcessed)
1335 *pEntries = *pCurrent;
1345WINNLSTranslateMessageJ(
1369 if (pBuf[
i].
message == WM_IME_ENDCOMPOSITION)
1371 pEndComp = &pBuf[
i];
1379 PTRANSMSG pSrc = pEndComp + 1, pDest = pEndComp;
1383 pDest->
message = WM_IME_ENDCOMPOSITION;
1384 pDest->wParam = pDest->lParam = 0;
1395 case WM_IME_STARTCOMPOSITION:
1399 if (pIC->cfCompForm.dwStyle)
1402 *pEntries++ = *pCurrent;
1407 case WM_IME_ENDCOMPOSITION:
1411 if (pIC->cfCompForm.dwStyle)
1414 *pEntries++ = *pCurrent;
1432 case WM_IME_COMPOSITION:
1436 cMessages = Imm32JTransCompositionA(pIC, pCS, pCurrent, pEntries);
1438 cMessages = Imm32JTransCompositionW(pIC, pCS, pCurrent, pEntries);
1440 dwResult += cMessages;
1441 pEntries += cMessages;
1459 if (!(
lParam & (1 << iCandForm)))
1465 CandForm.
rcArea = pIC->cfCompForm.rcArea;
1474 *pEntries++ = *pCurrent;
1484 *pEntries++ = *pCurrent;
1499WINNLSTranslateMessageK(
1511 static WORD s_chKorean = 0;
1524 case WM_IME_COMPOSITION:
1531 DWORD dwProcessedLen = 0;
1532 while (dwProcessedLen < pCS->dwResultStrLen)
1535 WCHAR szWide[2] = {0};
1536 CHAR szMBStr[4] = {0};
1541 BYTE bChar = pResStr[dwProcessedLen];
1551 szMBStr[1] = pResStr[dwProcessedLen + 1];
1555 Imm32AnsiToWide(szMBStr, cbMB, szWide,
_countof(szWide));
1562 if (KOR_IS_LEAD_BYTE(bChar))
1563 lKeyData = KOR_SCAN_CODE_DBCS;
1565 lKeyData = KOR_SCAN_CODE_SBCS;
1569 bChar = pResStr[dwProcessedLen];
1577 szWide[0] = pResStrW[dwProcessedLen];
1585 Imm32WideToAnsi(szWide, 1, szMBStr,
_countof(szMBStr));
1586 BYTE bLead = (
BYTE)szMBStr[0], bChar;
1589 if (KOR_IS_LEAD_BYTE(bLead))
1590 lKeyData = KOR_SCAN_CODE_DBCS;
1592 lKeyData = KOR_SCAN_CODE_SBCS;
1616 s_chKorean =
MAKEWORD(bFirst, bSecond);
1654 pSendMessage(hwndIme, WM_IME_ENDCOMPOSITION, 0, 0);
1730#ifdef IMM_WIN3_SUPPORT
1744 ret = WINNLSTranslateMessageK(
cEntries, pEntries, pIC, pCompStr, bAnsi);
1746 ret = WINNLSTranslateMessageJ(
cEntries, pEntries, pIC, pCompStr, bAnsi);
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define WideCharToMultiByte
#define MultiByteToWideChar
BOOL WINAPI IsDBCSLeadByte(BYTE testchar)
LPSTR WINAPI CharNextA(const char *ptr)
LPWSTR WINAPI CharNextW(const WCHAR *x)
#define ALIGN_DWORD(size)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
struct tagUNDETERMINESTRUCT UNDETERMINESTRUCT
struct tagSTRINGEXSTRUCT STRINGEXSTRUCT
struct INPUTCONTEXTDX * PINPUTCONTEXTDX
#define IMC_SETCANDIDATEPOS
#define GCS_RESULTREADSTR
#define IMN_OPENCANDIDATE
HWND WINAPI ImmGetDefaultIMEWnd(_In_opt_ HWND hWnd)
#define GCS_RESULTREADCLAUSE
BOOL WINAPI ImmUnlockIMCC(_In_ HIMCC imcc)
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
LPVOID WINAPI ImmLockIMCC(_In_ HIMCC imcc)
#define GetWin32ClientInfo()
static ERESOURCE GlobalLock
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
_Use_decl_annotations_ NTSTATUS NTAPI RtlUnicodeToMultiByteSize(_Out_ PULONG MbSize, _In_ PCWCH UnicodeString, _In_ ULONG UnicodeSize)
DWORD dwResultReadStrOffset
DWORD dwResultClauseOffset
DWORD dwResultReadClauseLen
DWORD dwResultReadClauseOffset
#define RtlCopyMemory(Destination, Source, Length)
LONG IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
#define ImmLocalFree(lpData)
LONG IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
#define MAX_CANDIDATEFORM
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
DWORD WINNLSTranslateMessage(_In_ INT cEntries, _Inout_ PTRANSMSG pEntries, _In_ HIMC hIMC, _In_ BOOL bAnsi, _In_ WORD wLang)
_In_ UINT _In_ UINT cEntries
BOOL WINAPI IsWindow(_In_opt_ HWND)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI IsWindowUnicode(_In_ HWND)
BOOL WINAPI PostMessageA(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)