ReactOS 0.4.16-dev-2610-ge2c92c0
win3send.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS IMM32
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Implementing ImmSendIMEMessageExA/W
5 * COPYRIGHT: Copyright 2020-2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "precomp.h"
9#include <ime.h>
10
12
13#ifdef IMM_WIN3_SUPPORT /* 3.x support */
14
15static BOOL Imm32IsForegroundThread(HWND hWnd)
16{
17 HWND hwndFore = GetForegroundWindow();
19 DWORD dwTID2 = GetWindowThreadProcessId(hwndFore, NULL);
20 return dwTID1 == dwTID2;
21}
22
23static BOOL Imm32PostImsMessage(HWND hWnd, WPARAM wParam, LPARAM lParam)
24{
25 HWND hwndIme = ImmGetDefaultIMEWnd(hWnd);
26 if (!hwndIme)
27 return FALSE;
28 return PostMessageW(hwndIme, WM_IME_SYSTEM, wParam, lParam);
29}
30
31static BOOL Imm32SetCandidateWindow(HWND hWnd, HIMC hIMC, PCANDIDATEFORM lpCandidate)
32{
33 PINPUTCONTEXT pIC = ImmLockIMC(hIMC);
34 if (!pIC)
35 return FALSE;
36
37 BOOL ret;
38 DWORD dwCompatFlags = ImmGetAppCompatFlags(hIMC);
39 if (dwCompatFlags & _IME_APP_COMPAT_DIRECT_IME_SYSTEM)
40 {
41 RtlCopyMemory(&pIC->cfCandForm[lpCandidate->dwIndex], lpCandidate, sizeof(CANDIDATEFORM));
42 ret = Imm32PostImsMessage(hWnd, IMS_SETCANDFORM, lpCandidate->dwIndex);
43 }
44 else
45 {
46 ret = ImmSetCandidateWindow(hIMC, lpCandidate);
47 }
48
49 ImmUnlockIMC(hIMC);
50 return ret;
51}
52
53static BOOL Imm32SetCompWindow(HWND hWnd, HIMC hIMC, PCOMPOSITIONFORM lpCompForm)
54{
56 if (!pIC)
57 return FALSE;
58
59 BOOL ret;
60 DWORD dwCompatFlags = ImmGetAppCompatFlags(hIMC);
61 if (dwCompatFlags & _IME_APP_COMPAT_DIRECT_IME_SYSTEM)
62 {
63 RtlCopyMemory(&pIC->cfCompForm, lpCompForm, sizeof(COMPOSITIONFORM));
64 if (dwCompatFlags & _IME_APP_COMPAT_SPECIAL_IME)
66 else
67 ret = Imm32PostImsMessage(hWnd, IMS_SETCOMPFORM, 0);
68 }
69 else
70 {
72 ret = ImmSetCompositionWindow(hIMC, lpCompForm);
73 }
74
75 ImmUnlockIMC(hIMC);
76 return ret;
77}
78
79/* NOTE: K stands for Korean. J stands for Japanese. */
80static DWORD Imm32Get31ModeFrom40ModeK(DWORD fdwConversion)
81{
82 DWORD flags = 0;
83 if (!(fdwConversion & IME_CMODE_NATIVE))
85 if (!(fdwConversion & IME_CMODE_FULLSHAPE))
87 if (fdwConversion & IME_CMODE_HANJACONVERT)
89 return flags;
90}
91
92static DWORD Imm32Get31ModeFrom40ModeJ(DWORD fdwConversion)
93{
94 DWORD flags = 0;
95 if (fdwConversion & IME_CMODE_NATIVE)
96 {
97 if ((fdwConversion & IME_CMODE_KATAKANA))
99 else
101 }
102 else
103 {
105 }
106 if (fdwConversion & IME_CMODE_FULLSHAPE)
108 else
110 if (fdwConversion & IME_CMODE_ROMAN)
112 else
114 if (fdwConversion & IME_CMODE_CHARCODE)
116 else
118 return flags;
119}
120
121static LRESULT Imm32TransGetMode(HIMC hIMC)
122{
123 DWORD fdwConversion = 0, fdwSentence;
124 ImmGetConversionStatus(hIMC, &fdwConversion, &fdwSentence);
125 return Imm32Get31ModeFrom40ModeK(fdwConversion) | _IME_CMODE_EXTENDED;
126}
127
128static DWORD Imm32TransSetMode(HIMC hIMC, PIMESTRUCT pIme)
129{
130 DWORD fdwConversion = 0, fdwSentence;
131 ImmGetConversionStatus(hIMC, &fdwConversion, &fdwSentence);
132
133 DWORD dw31Mode = Imm32Get31ModeFrom40ModeK(fdwConversion);
134 WPARAM wParam = pIme->wParam;
136 fdwConversion |= IME_CMODE_FULLSHAPE;
137
138 DWORD dwNewFlags = fdwConversion;
142 dwNewFlags &= ~targetMask;
143 else
144 dwNewFlags |= targetMask;
145
146 if (!ImmSetConversionStatus(hIMC, dwNewFlags, fdwSentence))
147 return 0;
148 return dw31Mode;
149}
150
151static BOOL Imm32TransCodeConvert(HIMC hIMC, PIMESTRUCT pIme)
152{
153 HKL hKL = GetKeyboardLayout(0);
154 UINT uSubFunc = HIWORD(pIme->wParam);
155 switch (uSubFunc)
156 {
157 case IME_BANJAtoJUNJA:
158 case IME_JUNJAtoBANJA:
159 case IME_JOHABtoKS:
160 case IME_KStoJOHAB:
161 return (BOOL)ImmEscapeW(hKL, hIMC, uSubFunc, pIme);
162 default:
163 return FALSE;
164 }
165}
166
167static LRESULT Imm32TransGetOpenK(HWND hWnd, HIMC hIMC, PIMESTRUCT pIme, BOOL bAnsi)
168{
169 RECT rc;
170 GetWindowRect(hWnd, &rc);
171 LPARAM OldlParam2 = pIme->lParam2;
172 pIme->lParam2 = MAKELONG(rc.top, rc.left); /* Correct! */
173 HKL hKL = GetKeyboardLayout(0);
174 LRESULT result = ImmEscapeW(hKL, hIMC, IME_GETOPEN, pIme);
175 pIme->lParam2 = OldlParam2;
176 return result;
177}
178
179static BOOL Imm32TransGetOpenJ(HWND hWnd, HIMC hIMC, PIMESTRUCT pIme, BOOL bAnsi)
180{
181 BOOL fOpen = ImmGetOpenStatus(hIMC);
182
183 LONG cbCompStr;
184 if (bAnsi)
185 cbCompStr = ImmGetCompositionStringA(hIMC, GCS_COMPSTR, NULL, 0);
186 else
187 cbCompStr = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, NULL, 0);
188
189 pIme->wCount = (cbCompStr > 0) ? cbCompStr : 0;
190 return fOpen;
191}
192
193static LRESULT Imm32TransSetOpenK(HWND hWnd, HIMC hIMC, PIMESTRUCT pIme)
194{
195 HKL hKL = GetKeyboardLayout(0);
196 return ImmEscapeW(hKL, hIMC, IME_SETOPEN, pIme);
197}
198
199static BOOL Imm32TransSetOpenJ(HWND hWnd, HIMC hIMC, PIMESTRUCT pIme)
200{
201 LRESULT fOldOpen = ImmGetOpenStatus(hIMC);
202
203 if (Imm32IsForegroundThread(NULL) || GetFocus())
204 {
205 ImmSetOpenStatus(hIMC, (BOOL)pIme->wParam);
206 return fOldOpen;
207 }
208
209 PINPUTCONTEXT pIC = ImmLockIMC(hIMC);
210 if (!pIC)
211 return fOldOpen;
212
213 BOOL bRequestOpen = !!pIme->wParam;
214 if (pIC->fOpen != bRequestOpen)
215 {
216 pIC->fOpen = bRequestOpen;
218 }
219
220 ImmUnlockIMC(hIMC);
221 return fOldOpen;
222}
223
224static UINT Imm32TransConvertList(HIMC hIMC, PIMESTRUCT pIme)
225{
226 /* SECURITY: Check memory block size */
227 const SIZE_T cbIme = GlobalSize(GlobalHandle(pIme));
228 if (pIme->dchDest >= cbIme)
229 return 0;
230
231 /* Get conversion list size */
232 HKL hKL = GetKeyboardLayout(0);
233 const CHAR *pszSource = (const CHAR *)pIme + pIme->dchSource;
234 const UINT uBufLen = ImmGetConversionListA(hKL, hIMC, pszSource, NULL, 0, GCL_CONVERSION);
235 if (!uBufLen)
236 return 0;
237
238 /* Allocate */
239 HGLOBAL hCandList = GlobalAlloc(GHND, uBufLen);
240 if (!hCandList)
241 return 0;
242
243 /* Lock */
244 PCANDIDATELIST pCL = (PCANDIDATELIST)GlobalLock(hCandList);
245 if (!pCL)
246 {
247 GlobalFree(hCandList);
248 return 0;
249 }
250
251 /* Get the conversion list */
252 UINT ret = ImmGetConversionListA(hKL, hIMC, pszSource, pCL, uBufLen, GCL_CONVERSION);
253
254 /* Store the conversion list into pIme */
255 UINT wCount = 0;
256 PCHAR pszDest = (PCHAR)pIme + pIme->dchDest;
257 SIZE_T cbDestRemaining = cbIme - pIme->dchDest;
258 for (DWORD i = 0; i < pCL->dwCount && (cbDestRemaining > 2); ++i)
259 {
260 const CHAR *pCandidate = (const CHAR *)pCL + pCL->dwOffset[i];
261 *pszDest++ = pCandidate[0];
262 *pszDest++ = pCandidate[1];
263
264 cbDestRemaining -= 2;
265 wCount += 2;
266 }
267 pIme->wCount = wCount;
268
269 /* Add terminator safely */
270 if (cbDestRemaining > 0)
271 *pszDest = ANSI_NULL;
272
273 /* Clean up */
274 GlobalUnlock(hCandList);
275 GlobalFree(hCandList);
276 return ret;
277}
278
279static LRESULT Imm32TransHanjaMode(HWND hWnd, HIMC hIMC, PIMESTRUCT pIme)
280{
282 if (!dwThreadId)
283 return 0;
284
286 PIMEDPI pImeDpi = ImmLockImeDpi(hKL);
287 if (!pImeDpi)
288 return 0;
289
290 if (ImeDpi_IsUnicode(pImeDpi))
291 {
292 BYTE offset = HIBYTE(HIWORD(pIme->wParam));
293 SIZE_T cbIme = sizeof(*pIme) + (SIZE_T)pIme->wCount;
294 PCHAR pMbcsCh;
295 WORD MbcsCh;
296
297 /* SECURITY: Check boundary */
298 if ((SIZE_T)offset > cbIme || cbIme - (SIZE_T)offset < sizeof(MbcsCh))
299 {
300 ImmUnlockImeDpi(pImeDpi);
301 return 0;
302 }
303
304 pMbcsCh = (PCHAR)pIme + offset;
305 RtlCopyMemory(&MbcsCh, pMbcsCh, sizeof(MbcsCh));
306 pIme->wParam = MAKELONG(MbcsCh, HIWORD(pIme->wParam));
307
308 WCHAR wch = UNICODE_NULL;
309 if (!MultiByteToWideChar(CP_ACP, 0, pMbcsCh, 2, &wch, 1))
310 {
311 ImmUnlockImeDpi(pImeDpi);
312 return 0;
313 }
314
315 RtlCopyMemory(pMbcsCh, &wch, sizeof(wch));
316 }
317
318 ImmUnlockImeDpi(pImeDpi);
319
320 hKL = GetKeyboardLayout(0);
321 LRESULT ret = ImmEscapeW(hKL, hIMC, IME_ESC_HANJA_MODE, pIme);
322 if (ret)
324
325 return ret;
326}
327
328static DWORD Imm32TransGetLevel(HWND hWnd)
329{
331 return result ? result : IME_RS_ERROR;
332}
333
334static BOOL Imm32TransSetLevel(HWND hWnd, PIMESTRUCT pIme)
335{
336 WPARAM wParam = pIme->wParam;
337 return wParam && wParam <= 5 && NtUserSetAppImeLevel(hWnd, (DWORD)wParam);
338}
339
340static BOOL Imm32TransGetMNTable(HIMC hIMC, PIMESTRUCT pIme)
341{
342#define INPUT_METHOD_BASE 100
343 static const WORD g_MNTable[3][96] =
344 {
345 /* InputMethod = 100 (Wansung standard) */
346 {
347 0xA1A1, 0xA3A1, 0xA1A8, 0xA3A3, 0xA3A4, 0xA3A5, 0xA3A6, 0xA1AE,
348 0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3A7, 0xA3AD, 0xA3AE, 0xA3AF,
349 0xA3B0, 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7,
350 0xA3B8, 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE, 0xA3BF,
351 0xA3C0, 0xA4B1, 0xA4D0, 0xA4BA, 0xA4B7, 0xA4A8, 0xA4A9, 0xA4BE,
352 0xA4C7, 0xA4C1, 0xA4C3, 0xA4BF, 0xA4D3, 0xA4D1, 0xA4CC, 0xA4C2,
353 0xA4C6, 0xA4B3, 0xA4A2, 0xA4A4, 0xA4B6, 0xA4C5, 0xA4BD, 0xA4B9,
354 0xA4BC, 0xA4CB, 0xA4BB, 0xA3DB, 0xA1AC, 0xA3DD, 0xA3DE, 0xA3DF,
355 0xA1A2, 0xA4B1, 0xA4D0, 0xA4BA, 0xA4B7, 0xA4A7, 0xA4A9, 0xA4BE,
356 0xA4C7, 0xA4C1, 0xA4C3, 0xA4BF, 0xA4D3, 0xA4D1, 0xA4CC, 0xA4C0,
357 0xA4C4, 0xA4B2, 0xA4A1, 0xA4A4, 0xA4B5, 0xA4C5, 0xA4BD, 0xA4B8,
358 0xA4BC, 0xA4CB, 0xA4BB, 0xA3FB, 0xA3FC, 0xA3FD, 0xA1AD, 0x0000
359 },
360 /* InputMethod = 101 (Old Johab compatible) */
361 {
362 0xA1A1, 0xA4B8, 0xA1A8, 0xA3A3, 0xA3A4, 0xA3A5, 0xA3A6, 0xA1AE,
363 0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA4BC, 0xA3AD, 0xA3AE, 0xA4C7,
364 0xA4BB, 0xA4BE, 0xA4B6, 0xA4B2, 0xA4CB, 0xA4D0, 0xA4C1, 0xA4C6,
365 0xA4D2, 0xA4CC, 0xA3BA, 0xA4B2, 0xA3B2, 0xA3BD, 0xA3B3, 0xA3BF,
366 0xA3C0, 0xA4A7, 0xA3A1, 0xA4AB, 0xA4AA, 0xA4BB, 0xA4A2, 0xA3AF,
367 0xA1AF, 0xA3B8, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B1, 0xA3B0, 0xA3B9,
368 0xA3BE, 0xA4BD, 0xA4C2, 0xA4A6, 0xA4C3, 0xA3B7, 0xA4B0, 0xA4BC,
369 0xA4B4, 0xA3BC, 0xA4BA, 0xA3DB, 0xA3DC, 0xA3DD, 0xA3DE, 0xA3DF,
370 0xA1AE, 0xA4B7, 0xA4CC, 0xA4C4, 0xA4D3, 0xA4C5, 0xA4BF, 0xA4D1,
371 0xA4A4, 0xA4B1, 0xA4B7, 0xA4A1, 0xA4B8, 0xA4BE, 0xA4B5, 0xA4BA,
372 0xA4BD, 0xA4B5, 0xA4C0, 0xA4A4, 0xA4C3, 0xA4A7, 0xA4C7, 0xA4A9,
373 0xA4A1, 0xA4A9, 0xA4B1, 0xA3FB, 0xA3FC, 0xA3FD, 0xA1AD, 0x0000
374 },
375 /* InputMethod = 102 (Extended array) */
376 {
377 0xA1A1, 0xA4A2, 0xA3AE, 0xA4B8, 0xA4AF, 0xA4AE, 0xA1B0, 0xA3AA,
378 0xA1A2, 0xA1AD, 0xA1B1, 0xA3AB, 0xA4BC, 0xA3A9, 0xA3AE, 0xA4C7,
379 0xA4BB, 0xA4BE, 0xA4B6, 0xA4B2, 0xA4CB, 0xA4D0, 0xA4C1, 0xA4C6,
380 0xA4D2, 0xA4CC, 0xA3B4, 0xA4B2, 0xA3A7, 0xA1B5, 0xA3AE, 0xA3A1,
381 0xA4AA, 0xA4A7, 0xA3BF, 0xA4BC, 0xA4AC, 0xA4A5, 0xA4AB, 0xA4C2,
382 0xA3B0, 0xA3B7, 0xA3B1, 0xA3B2, 0xA3B3, 0xA1A8, 0xA3AD, 0xA3B8,
383 0xA3B9, 0xA4BD, 0xA4B0, 0xA4A6, 0xA4AD, 0xA3B6, 0xA4A3, 0xA4BC,
384 0xA4B4, 0xA3B5, 0xA4BA, 0xA3A8, 0xA3BA, 0xA1B4, 0xA3BD, 0xA3BB,
385 0xA3AA, 0xA4B7, 0xA4CC, 0xA4C4, 0xA4D3, 0xA4C5, 0xA4BF, 0xA4D1,
386 0xA4A4, 0xA4B1, 0xA4B7, 0xA4A1, 0xA4B8, 0xA4BE, 0xA4B5, 0xA4BA,
387 0xA4BD, 0xA4B5, 0xA4C0, 0xA4A4, 0xA4C3, 0xA4A7, 0xA4C7, 0xA4A9,
388 0xA4A1, 0xA4B1, 0xA4B1, 0xA3A5, 0xA3CC, 0xA3AF, 0xA1AD, 0x0000
389 }
390 };
391
392 UINT nInputMethod = GetProfileIntW(L"WANSUNG", L"InputMethod", INPUT_METHOD_BASE);
393 UINT index = nInputMethod - INPUT_METHOD_BASE;
394 if (index >= _countof(g_MNTable))
395 index = 0;
396
397 PWORD pDst = (PWORD)pIme->lParam1;
398 RtlCopyMemory(pDst, g_MNTable[index], sizeof(g_MNTable[0]));
399 return TRUE;
400}
401
402static LRESULT Imm32TransMoveImeWindow(HWND hWnd, HIMC hIMC, PIMESTRUCT pIme)
403{
404 if (pIme->wParam == 2)
405 {
406 POINT pt = { (SHORT)LOWORD(pIme->lParam1), (SHORT)HIWORD(pIme->lParam1) };
408 pIme->lParam1 = MAKELONG(pt.x, pt.y);
409 }
410 HKL hKL = GetKeyboardLayout(0);
411 return ImmEscapeW(hKL, hIMC, IME_SETCONVERSIONWINDOW, pIme);
412}
413
414static BOOL Imm32SetCompFont(HWND hWnd, HIMC hIMC, PLOGFONTW plfW)
415{
416 PINPUTCONTEXT pIMC = ImmLockIMC(hIMC);
417 if (!pIMC)
418 return FALSE;
419
420 DWORD dwCompatFlags = ImmGetAppCompatFlags(hIMC);
421 PCLIENTIMC pClientImc = ImmLockClientImc(hIMC);
422 if (!pClientImc)
423 {
424 ImmUnlockIMC(hIMC);
425 return FALSE;
426 }
427
428 BOOL bIsUnicode = (pClientImc->dwFlags & CLIENTIMC_WIDE);
429 ImmUnlockClientImc(pClientImc);
430
431 const LOGFONTW* pCurrentFontW;
432 LOGFONTW currentLF;
433 if (bIsUnicode)
434 {
435 pCurrentFontW = &pIMC->lfFont.W;
436 }
437 else
438 {
439 LogFontAnsiToWide(&pIMC->lfFont.A, &currentLF);
440 pCurrentFontW = &currentLF;
441 }
442
443 BOOL ret;
444 if (memcmp(pCurrentFontW, plfW, offsetof(LOGFONTW, lfFaceName)) != 0 ||
445 lstrcmpW(pCurrentFontW->lfFaceName, plfW->lfFaceName) != 0)
446 {
447 if (dwCompatFlags & _IME_APP_COMPAT_DIRECT_IME_SYSTEM)
448 {
449 pIMC->lfFont.W = *plfW;
450
451 if (dwCompatFlags & _IME_APP_COMPAT_DIRECT_IME_FONT)
452 ret = Imm32PostImsMessage(hWnd, IMC_SETCOMPOSITIONFONT, 0);
453 else
455 }
456 else
457 {
458 ret = ImmSetCompositionFontW(hIMC, plfW);
459 }
460 }
461 else
462 {
463 ret = TRUE;
464 }
465
466 ImmUnlockIMC(hIMC);
467 return ret;
468}
469
470static BOOL Imm32FixLogFont(PLOGFONTW plfW, BOOL bVertical)
471{
472 if (!plfW)
473 return FALSE;
474
475 /* SECURITY: Avoid buffer overrun */
476 plfW->lfFaceName[_countof(plfW->lfFaceName) - 1] = UNICODE_NULL;
477
478 if (bVertical)
479 {
480 plfW->lfEscapement = plfW->lfOrientation = 2700;
481
482 if (plfW->lfCharSet == SHIFTJIS_CHARSET && plfW->lfFaceName[0] != L'@')
483 {
484 size_t len = wcslen(plfW->lfFaceName);
485 if (len >= (_countof(plfW->lfFaceName) - 1))
486 return FALSE;
487
488 RtlMoveMemory(&plfW->lfFaceName[1], &plfW->lfFaceName[0], (len + 1) * sizeof(WCHAR));
489 plfW->lfFaceName[0] = L'@';
490 }
491 }
492 else
493 {
494 plfW->lfEscapement = plfW->lfOrientation = 0;
495
496 if (plfW->lfCharSet == SHIFTJIS_CHARSET && plfW->lfFaceName[0] == L'@')
497 {
498 size_t len = wcslen(plfW->lfFaceName);
499 RtlMoveMemory(&plfW->lfFaceName[0], &plfW->lfFaceName[1], len * sizeof(WCHAR));
500 }
501 }
502
503 return TRUE;
504}
505
506static BOOL
507Imm32SetFontForVertical(HWND hWnd, HIMC hIMC, PINPUTCONTEXTDX pIC, BOOL bVertical)
508{
509 LOGFONTW lfW;
510 if (pIC->fdwInit & INIT_LOGFONT)
511 {
512 PCLIENTIMC pClientImc = ImmLockClientImc(hIMC);
513 if (!pClientImc)
514 return FALSE;
515 BOOL bWide = !!(pClientImc->dwFlags & CLIENTIMC_WIDE);
516 ImmUnlockClientImc(pClientImc);
517
518 if (bWide)
519 lfW = pIC->lfFont.W;
520 else
521 LogFontAnsiToWide(&pIC->lfFont.A, &lfW);
522 }
523 else
524 {
525 GetObjectW(GetStockObject(SYSTEM_FONT), sizeof(lfW), &lfW);
526 }
527
528 if (!Imm32FixLogFont(&lfW, bVertical))
529 return FALSE;
530
531 return Imm32SetCompFont(hWnd, hIMC, &lfW);
532}
533
534static BOOL Imm32TransSetConversionWindow(HWND hWnd, HIMC hIMC, PIMESTRUCT pIme)
535{
536 if (!Imm32IsForegroundThread(NULL) && !GetFocus())
537 return TRUE; /* Ignore as success */
538
540 if (!pIC)
541 return FALSE;
542
543 COMPOSITIONFORM cfComp;
544 cfComp.dwStyle = 0;
545
546 POINT pt = { (SHORT)LOWORD(pIme->lParam1), (SHORT)HIWORD(pIme->lParam1) };
547 RECT rcArea = { (SHORT)LOWORD(pIme->lParam2), (SHORT)HIWORD(pIme->lParam2),
548 (SHORT)LOWORD(pIme->lParam3), (SHORT)HIWORD(pIme->lParam3) };
549
550 WPARAM wParam = pIme->wParam;
551 HWND hwndIC = pIC->hWnd;
552
553 if (wParam & MCW_HIDDEN)
554 {
556 ScreenToClient(hwndIC, &pt);
557 MapWindowPoints(NULL, hwndIC, (PPOINT)&rcArea, 2);
558 }
559 else
560 {
561 pIC->dwUIFlags &= ~_IME_UI_HIDDEN;
562 }
563
564 if (wParam & MCW_WINDOW)
565 {
566 BOOL bUseCrossWindowLogic = TRUE;
567
568 if (LOWORD(hWnd) == LOWORD(hwndIC))
569 {
570 PVOID pWndEntry = (hWnd && gpsi) ? ValidateHwnd(hWnd) : NULL;
571 PVOID pWndICEntry = (hwndIC && gpsi) ? ValidateHwnd(hwndIC) : NULL;
572
573 if (pWndEntry == pWndICEntry)
574 bUseCrossWindowLogic = FALSE;
575 }
576
577 if (bUseCrossWindowLogic)
578 {
580 ScreenToClient(hwndIC, &pt);
581
582 if (wParam & MCW_RECT)
583 {
584 cfComp.dwStyle = CFS_RECT;
585 MapWindowPoints(hWnd, NULL, (PPOINT)&rcArea, 2);
586 MapWindowPoints(NULL, hwndIC, (PPOINT)&rcArea, 2);
587 }
588 else
589 {
590 cfComp.dwStyle = CFS_POINT;
591 }
592 }
593 else
594 {
595 if (wParam & MCW_SCREEN)
596 {
597 ScreenToClient(hwndIC, &pt);
598 cfComp.dwStyle = (wParam & MCW_RECT) ? CFS_RECT : CFS_POINT;
599 if (wParam & MCW_RECT)
600 {
601 MapWindowPoints(NULL, hwndIC, (PPOINT)&rcArea, 2);
602 }
603 }
604 else
605 {
606 cfComp.dwStyle = (wParam & MCW_RECT) ? CFS_RECT : CFS_POINT;
607 }
608 }
609 }
610
611 if (wParam & MCW_VERTICAL)
612 {
613 if (!(pIC->dwUIFlags & _IME_UI_VERTICAL))
614 {
616 Imm32SetFontForVertical(hWnd, hIMC, pIC, TRUE);
617 }
618 }
619 else
620 {
621 if (pIC->dwUIFlags & _IME_UI_VERTICAL)
622 {
623 pIC->dwUIFlags &= ~_IME_UI_VERTICAL;
624 Imm32SetFontForVertical(hWnd, hIMC, pIC, FALSE);
625 }
626 }
627
628 cfComp.ptCurrentPos = pt;
629 cfComp.rcArea = rcArea;
630
631 if (pIC->dwUIFlags & _IME_UI_HIDDEN)
632 {
633 pIC->cfCompForm.ptCurrentPos = pt;
634 pIC->cfCompForm.rcArea = rcArea;
635
636 for (DWORD i = 0; i < MAX_CANDIDATEFORM; i++)
637 {
638 PCANDIDATEFORM pCF = &pIC->cfCandForm[i];
639 if (pCF->dwIndex == (DWORD)-1)
640 continue;
641
643 cf.dwIndex = i;
644 cf.dwStyle = CFS_EXCLUDE;
645 cf.ptCurrentPos = pt;
646 cf.rcArea = rcArea;
647 Imm32SetCandidateWindow(hWnd, hIMC, &cf);
648 }
649 }
650 else
651 {
652 Imm32SetCompWindow(hWnd, hIMC, &cfComp);
653 }
654
655 ImmUnlockIMC(hIMC);
656 return TRUE;
657}
658
659static DWORD Imm32TransGetConversionMode(HIMC hIMC)
660{
661 DWORD fdwConversion = 0, fdwSentence;
662 ImmGetConversionStatus(hIMC, &fdwConversion, &fdwSentence);
663 return Imm32Get31ModeFrom40ModeJ(fdwConversion);
664}
665
666static BOOL Imm32TransVKDBEMode(HIMC hIMC, UINT vKey)
667{
668 DWORD fdwConversion, fdwSentence;
669 BOOL ret = ImmGetConversionStatus(hIMC, &fdwConversion, &fdwSentence);
670 if (!ret)
671 return FALSE;
672
673 switch (vKey)
674 {
676 fdwConversion &= ~IME_CMODE_LANGUAGE;
677 break;
678 case VK_DBE_KATAKANA:
679 fdwConversion |= IME_CMODE_LANGUAGE;
680 break;
681 case VK_DBE_HIRAGANA:
682 fdwConversion = (fdwConversion & ~IME_CMODE_LANGUAGE) | IME_CMODE_NATIVE;
683 break;
684 case VK_DBE_SBCSCHAR:
685 fdwConversion &= ~IME_CMODE_FULLSHAPE;
686 break;
687 case VK_DBE_DBCSCHAR:
688 fdwConversion |= IME_CMODE_FULLSHAPE;
689 break;
690 case VK_DBE_ROMAN:
691 fdwConversion |= IME_CMODE_ROMAN;
692 break;
693 case VK_DBE_NOROMAN:
694 fdwConversion &= ~IME_CMODE_ROMAN;
695 break;
696 case VK_DBE_CODEINPUT:
697 fdwConversion |= IME_CMODE_CHARCODE;
698 break;
700 fdwConversion &= ~IME_CMODE_CHARCODE;
701 break;
702 default:
703 break;
704 }
705
706 return ImmSetConversionStatus(hIMC, fdwConversion, fdwSentence);
707}
708
709static BOOL Imm32TransSendVKey(HWND hWnd, HIMC hIMC, PIMESTRUCT pIme, BOOL bAnsi)
710{
711 WPARAM wParam = pIme->wParam;
712
714 {
716 {
717 HIMC hContext = ImmGetContext(hWnd);
719 ImmReleaseContext(hWnd, hContext);
720 return ret;
721 }
722
723 if (wParam > VK_DBE_ENTERDLGCONVERSIONMODE && (wParam == 0xFFFF || (LONG)wParam == -1))
724 {
725 UINT wCount = pIme->wCount;
726 if (wCount == 28 || (240 <= wCount && wCount <= 253))
727 return TRUE;
728 }
729
730 return FALSE;
731 }
732
734 return Imm32TransVKDBEMode(hIMC, (UINT)wParam);
735
736 if (wParam == VK_CONVERT)
738
740 return FALSE;
741
742 if (wParam <= VK_DBE_NOROMAN)
743 return Imm32TransVKDBEMode(hIMC, (UINT)wParam);
744
745 HKL hKL;
746 UINT nImeConfig;
748 {
749 hKL = GetKeyboardLayout(0);
750 nImeConfig = IME_CONFIG_REGISTERWORD;
751 }
753 {
754 hKL = GetKeyboardLayout(0);
755 nImeConfig = IME_CONFIG_GENERAL;
756 }
757 else
758 {
759 return ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
760 }
761
762 if (bAnsi)
763 return ImmConfigureIMEA(hKL, hWnd, nImeConfig, NULL);
764 return ImmConfigureIMEW(hKL, hWnd, nImeConfig, NULL);
765}
766
767static DWORD Imm32TransSetConversionMode(HIMC hIMC, PIMESTRUCT pIme)
768{
769 DWORD fdwOldConversion = 0, fdwSentence;
770 if (!ImmGetConversionStatus(hIMC, &fdwOldConversion, &fdwSentence))
771 return 0;
772
773 const DWORD mode31 = Imm32Get31ModeFrom40ModeJ(fdwOldConversion);
774 const WPARAM wParam = pIme->wParam;
775 DWORD dwNewValues = 0, dwMask = 0;
776
778 if (wParam & langFlags)
779 {
780 dwMask |= IME_CMODE_LANGUAGE;
782 dwNewValues |= IME_CMODE_LANGUAGE;
783 else if (wParam & IME_MODE_HIRAGANA)
784 dwNewValues |= IME_CMODE_NATIVE;
785 else
786 dwNewValues |= IME_CMODE_ALPHANUMERIC;
787 }
788
790 {
791 dwMask |= IME_CMODE_FULLSHAPE;
793 dwNewValues |= IME_CMODE_FULLSHAPE;
794 }
795
797 {
798 dwMask |= IME_CMODE_ROMAN;
800 dwNewValues |= IME_CMODE_ROMAN;
801 }
802
804 {
805 dwMask |= IME_CMODE_CHARCODE;
807 dwNewValues |= IME_CMODE_CHARCODE;
808 }
809
810 DWORD fdwNewConversion = (fdwOldConversion & ~dwMask) | (dwNewValues & dwMask);
811
812 if (!ImmSetConversionStatus(hIMC, fdwNewConversion, fdwSentence))
813 return 0;
814
815 return mode31;
816}
817
818static BOOL Imm32TransEnterWordRegisterMode(HWND hWnd, PIMESTRUCT pIme, BOOL bAnsi)
819{
820 HKL hKL = GetKeyboardLayout(0);
821 if (!ImmIsIME(hKL))
822 return FALSE;
823
824 HGLOBAL hReading = (HGLOBAL)pIme->lParam1, hWord = (HGLOBAL)pIme->lParam2;
825 REGISTERWORDW rwInfo = { NULL };
826 if (hReading)
827 rwInfo.lpReading = GlobalLock(hReading);
828 if (hWord)
829 rwInfo.lpWord = GlobalLock(hWord);
830
831 BOOL ret;
832 if (bAnsi)
834 else
836
837 if (rwInfo.lpReading)
838 GlobalUnlock(hReading);
839 if (rwInfo.lpWord)
840 GlobalUnlock(hWord);
841
842 return ret;
843}
844
845static BOOL Imm32TransSetConversionFontEx(HWND hWnd, HIMC hIMC, PIMESTRUCT pIme, BOOL bAnsi)
846{
848 if (!pIC)
849 return FALSE;
850
851 PVOID pLogFont = GlobalLock((HGLOBAL)pIme->lParam1);
852 if (!pLogFont)
853 {
854 ImmUnlockIMC(hIMC);
855 return FALSE;
856 }
857
858 LOGFONTW lfW;
859 if (bAnsi)
860 LogFontAnsiToWide(pLogFont, &lfW);
861 else
862 RtlCopyMemory(&lfW, pLogFont, sizeof(LOGFONTW));
863
865
866 BOOL bFixed = Imm32FixLogFont(&lfW, !!(pIC->dwUIFlags & _IME_UI_VERTICAL));
867 ImmUnlockIMC(hIMC);
868
869 if (!bFixed)
870 return FALSE;
871 return Imm32SetCompFont(hWnd, hIMC, &lfW);
872}
873
874static LRESULT Imm32TranslateIMESubFunctions(HWND hWnd, PIMESTRUCT pIme, BOOL bAnsi)
875{
876 HIMC hImc = ImmGetSaveContext(hWnd, 1);
877 if (!hImc)
878 return 0;
879
881 const BOOL bKorean = (wLang == LANG_KOREAN), bJapanese = (wLang == LANG_JAPANESE);
882 const UINT fnc = pIme->fnc;
883 switch (fnc)
884 {
885 case 3:
886 return 1;
887 case 4:
888 if (bKorean)
889 return Imm32TransSetOpenK(hWnd, hImc, pIme);
890 return Imm32TransSetOpenJ(hWnd, hImc, pIme);
891 case 5:
892 if (bKorean)
893 return Imm32TransGetOpenK(hWnd, hImc, pIme, bAnsi);
894 return Imm32TransGetOpenJ(hWnd, hImc, pIme, bAnsi);
895 case 6:
896 return 0;
897 case 7:
898 return 0xA03;
899 case 8:
900 if (bKorean)
901 return Imm32TransMoveImeWindow(hWnd, hImc, pIme);
902 return Imm32TransSetConversionWindow(hWnd, hImc, pIme);
903 case 16:
904 if (bJapanese)
905 return Imm32TransSetConversionMode(hImc, pIme);
906 break;
907 case 17:
908 if (bKorean)
909 return Imm32TransGetMode(hImc);
910 if (bJapanese)
911 return Imm32TransGetConversionMode(hImc);
912 break;
913 case 18:
914 if (bKorean)
915 return Imm32TransSetMode(hImc, pIme);
916 break;
917 case 19:
918 if (bJapanese)
919 return Imm32TransSendVKey(hWnd, hImc, pIme, bAnsi);
920 break;
921 case 24:
922 if (bJapanese)
923 return Imm32TransEnterWordRegisterMode(hWnd, pIme, bAnsi);
924 break;
925 case 25:
926 if (bJapanese)
927 return Imm32TransSetConversionFontEx(hWnd, hImc, pIme, bAnsi);
928 break;
929 case 32:
930 if (bKorean)
931 return Imm32TransCodeConvert(hImc, pIme) ? pIme->wParam : 0;
932 break;
933 case 34:
934 if (bKorean)
935 return Imm32TransConvertList(hImc, pIme);
936 break;
937 case 48:
938 if (bKorean)
939 return ImmEscapeW(GetKeyboardLayout(0), hImc, 0x30, pIme);
940 break;
941 case 49:
942 if (bKorean)
943 return Imm32TransHanjaMode(hWnd, hImc, pIme);
944 break;
945 case 64:
946 if (bKorean)
947 return Imm32TransGetLevel(hWnd);
948 break;
949 case 65:
950 if (bKorean)
951 return Imm32TransSetLevel(hWnd, pIme);
952 break;
953 case 66:
954 if (bKorean)
955 return Imm32TransGetMNTable(hImc, pIme);
956 break;
957 default:
958 ERR("Unknown fnc %d\n", fnc);
959 break;
960 }
961
962 return 0;
963}
964
965static LRESULT Imm32SendIMEMessageExAW(HWND hWnd, HGLOBAL hIME, BOOL bAnsi)
966{
967 PIMESTRUCT pIme = GlobalLock(hIME);
968 if (!pIme)
969 return 0;
970
971 LRESULT ret;
972 HKL hKL = GetKeyboardLayout(0);
974 {
975 HWND hwndIme = ImmGetDefaultIMEWnd(hWnd);
976 if (IsWindow(hwndIme))
977 {
978 HWND hTargetWnd = IsWindow(hWnd) ? hWnd : GetFocus();
979 ret = Imm32TranslateIMESubFunctions(hTargetWnd, pIme, bAnsi);
980 }
981 else
982 {
984 }
985 }
986 else
987 {
988 pIme->wParam = IME_RS_INVALID;
989 ret = 0;
990 }
991
992 GlobalUnlock(hIME);
993 return ret;
994}
995
996#endif /* def IMM_WIN3_SUPPORT */
997
998/***********************************************************************
999 * ImmSendIMEMessageExA(IMM32.@)
1000 */
1003 _In_ HWND hWnd,
1005{
1006#ifdef IMM_WIN3_SUPPORT
1007 return Imm32SendIMEMessageExAW(hWnd, (HGLOBAL)lParam, TRUE);
1008#else
1009 return 0;
1010#endif
1011}
1012
1013/***********************************************************************
1014 * ImmSendIMEMessageExW(IMM32.@)
1015 */
1018 _In_ HWND hWnd,
1020{
1021#ifdef IMM_WIN3_SUPPORT
1022 return Imm32SendIMEMessageExAW(hWnd, (HGLOBAL)lParam, FALSE);
1023#else
1024 return 0;
1025#endif
1026}
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ERR(fmt,...)
Definition: precomp.h:57
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
DWORD HIMC
Definition: dimm.idl:75
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
UINT WINAPI GetProfileIntW(LPCWSTR section, LPCWSTR entry, INT def_val)
Definition: profile.c:1129
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
LCID WINAPI GetSystemDefaultLCID(void)
Definition: locale.c:1235
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
#define pt(x, y)
Definition: drawing.c:79
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
DWORD dwThreadId
Definition: fdebug.c:31
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
for(i=0;i< ARRAY_SIZE(offsets);i++)
GLintptr offset
Definition: glext.h:5920
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLsizei len
Definition: glext.h:6722
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
Definition: glfuncs.h:248
HGLOBAL NTAPI GlobalHandle(LPCVOID pMem)
Definition: heapmem.c:705
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
#define VK_DBE_ROMAN
Definition: ime.h:46
#define MCW_VERTICAL
Definition: ime.h:61
#define VK_DBE_DBCSCHAR
Definition: ime.h:45
#define IME_MODE_CODEINPUT
Definition: ime.h:78
#define VK_DBE_ALPHANUMERIC
Definition: ime.h:41
#define VK_DBE_HIRAGANA
Definition: ime.h:43
#define VK_DBE_CODEINPUT
Definition: ime.h:51
#define IME_MODE_NOCODEINPUT
Definition: ime.h:79
#define VK_DBE_NOROMAN
Definition: ime.h:47
#define IME_SETCONVERSIONWINDOW
Definition: ime.h:85
#define VK_DBE_SBCSCHAR
Definition: ime.h:44
#define IME_MODE_KATAKANA
Definition: ime.h:72
#define IME_MODE_HANJACONVERT
Definition: ime.h:74
#define VK_DBE_KATAKANA
Definition: ime.h:42
#define IME_BANJAtoJUNJA
Definition: ime.h:95
#define VK_DBE_ENTERDLGCONVERSIONMODE
Definition: ime.h:54
#define VK_DBE_ENTERWORDREGISTERMODE
Definition: ime.h:48
#define MCW_WINDOW
Definition: ime.h:59
#define IME_RS_ERROR
Definition: ime.h:111
#define MCW_RECT
Definition: ime.h:58
#define VK_DBE_ENTERIMECONFIGMODE
Definition: ime.h:49
#define IME_GETOPEN
Definition: ime.h:83
#define IME_SETOPEN
Definition: ime.h:82
#define IME_MODE_ROMAN
Definition: ime.h:76
#define VK_DBE_DETERMINESTRING
Definition: ime.h:53
#define IME_GETVERSION
Definition: ime.h:84
#define IME_MODE_HIRAGANA
Definition: ime.h:73
#define VK_DBE_NOCODEINPUT
Definition: ime.h:52
#define IME_JUNJAtoBANJA
Definition: ime.h:96
#define IME_MODE_DBCSCHAR
Definition: ime.h:75
#define MCW_SCREEN
Definition: ime.h:60
#define MCW_HIDDEN
Definition: ime.h:62
#define IME_MODE_ALPHANUMERIC
Definition: ime.h:64
#define IME_JOHABtoKS
Definition: ime.h:97
#define IME_RS_INVALID
Definition: ime.h:118
#define IME_KStoJOHAB
Definition: ime.h:98
#define IME_MODE_NOROMAN
Definition: ime.h:77
BOOL WINAPI ImmSetCompositionFontW(_In_ HIMC hIMC, _In_ LPLOGFONTW lplf)
Definition: ime.c:1323
HIMC ImmGetSaveContext(_In_opt_ HWND hWnd, _In_ DWORD dwContextFlags)
Definition: imm.c:1022
PSERVERINFO gpsi
Definition: imm.c:18
#define _IME_APP_COMPAT_DIRECT_IME_SYSTEM
Definition: imm32_undoc.h:219
#define _IME_UI_HIDDEN
Definition: imm32_undoc.h:214
#define _IME_MODE_KOR_SBCSCHAR
Definition: imm32_undoc.h:228
#define _IME_MODE_JPN_SBCSCHAR
Definition: imm32_undoc.h:229
DWORD WINAPI ImmGetAppCompatFlags(_In_ HIMC hIMC)
Definition: keymsg.c:722
#define _IME_APP_COMPAT_SPECIAL_IME
Definition: imm32_undoc.h:222
PCLIENTIMC WINAPI ImmLockClientImc(_In_ HIMC hImc)
Definition: imm.c:955
#define _IME_APP_COMPAT_DIRECT_IME_FONT
Definition: imm32_undoc.h:220
#define IMS_SETCANDFORM
Definition: imm32_undoc.h:49
#define _IME_UI_VERTICAL
Definition: imm32_undoc.h:215
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
Definition: ime.c:532
#define _IME_CMODE_EXTENDED
Definition: imm32_undoc.h:225
#define WM_IME_SYSTEM
Definition: imm32_undoc.h:32
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
Definition: ime.c:562
#define _IME_UI_NO_COMPFORM
Definition: imm32_undoc.h:216
#define IMS_SETCOMPFORM
Definition: imm32_undoc.h:51
VOID WINAPI ImmUnlockClientImc(_Inout_ PCLIENTIMC pClientImc)
Definition: imm.c:1002
#define CLIENTIMC_WIDE
Definition: imm32_undoc.h:183
struct INPUTCONTEXTDX * PINPUTCONTEXTDX
#define IME_CMODE_KATAKANA
Definition: imm.h:343
#define IME_CMODE_ROMAN
Definition: imm.h:346
#define CFS_RECT
Definition: imm.h:324
struct tagCANDIDATELIST * PCANDIDATELIST
#define CPS_CANCEL
Definition: imm.h:181
BOOL WINAPI ImmGetConversionStatus(_In_ HIMC hIMC, _Out_opt_ LPDWORD lpfdwConversion, _Out_opt_ LPDWORD lpfdwSentence)
Definition: ime.c:1502
BOOL WINAPI ImmSetConversionStatus(_In_ HIMC hIMC, _In_ DWORD fdwConversion, _In_ DWORD fdwSentence)
Definition: ime.c:1535
#define IME_CMODE_NATIVE
Definition: imm.h:337
#define IME_CMODE_LANGUAGE
Definition: imm.h:344
#define IME_CMODE_HANJACONVERT
Definition: imm.h:348
#define IME_CONFIG_REGISTERWORD
Definition: imm.h:406
#define CPS_CONVERT
Definition: imm.h:179
LONG WINAPI ImmGetCompositionStringA(_In_ HIMC hIMC, _In_ DWORD dwIndex, _Out_writes_bytes_opt_(dwBufLen) LPVOID lpBuf, _In_ DWORD dwBufLen)
Definition: compstr.c:901
BOOL WINAPI ImmSetCompositionWindow(_In_ HIMC hIMC, _In_ LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1150
HIMC WINAPI ImmGetContext(_In_ HWND hWnd)
Definition: imm.c:1066
BOOL WINAPI ImmSetCandidateWindow(_In_ HIMC hIMC, _In_ LPCANDIDATEFORM lpCandidate)
Definition: candidate.c:433
#define CPS_COMPLETE
Definition: imm.h:178
#define IME_ESC_HANJA_MODE
Definition: imm.h:421
#define CFS_POINT
Definition: imm.h:325
LRESULT WINAPI ImmEscapeW(_In_ HKL hKL, _In_ HIMC hIMC, _In_ UINT uSubFunc, _Inout_opt_ LPVOID lpData)
Definition: ime.c:914
#define GCL_CONVERSION
Definition: imm.h:331
#define IMN_OPENCANDIDATE
Definition: imm.h:376
BOOL WINAPI ImmReleaseContext(_In_ HWND hWnd, _In_ HIMC hIMC)
Definition: imm.c:1110
BOOL WINAPI ImmGetOpenStatus(_In_ HIMC hIMC)
Definition: ime.c:997
#define GCS_COMPSTR
Definition: imm.h:227
BOOL WINAPI ImmConfigureIMEA(_In_ HKL hKL, _In_ HWND hWnd, _In_ DWORD dwMode, _Inout_opt_ LPVOID lpData)
Definition: ime.c:1598
#define IME_CMODE_CHARCODE
Definition: imm.h:347
#define IME_CMODE_ALPHANUMERIC
Definition: imm.h:336
#define CFS_EXCLUDE
Definition: imm.h:328
HWND WINAPI ImmGetDefaultIMEWnd(_In_opt_ HWND hWnd)
Definition: ime.c:441
BOOL WINAPI ImmConfigureIMEW(_In_ HKL hKL, _In_ HWND hWnd, _In_ DWORD dwMode, _Inout_opt_ LPVOID lpData)
Definition: ime.c:1658
#define IMC_SETCOMPOSITIONFONT
Definition: imm.h:151
LONG WINAPI ImmGetCompositionStringW(_In_ HIMC hIMC, _In_ DWORD dwIndex, _Out_writes_bytes_opt_(dwBufLen) LPVOID lpBuf, _In_ DWORD dwBufLen)
Definition: compstr.c:949
BOOL WINAPI ImmIsIME(_In_ HKL hKL)
Definition: ime.c:430
BOOL WINAPI ImmSetOpenStatus(_In_ HIMC hIMC, _In_ BOOL fOpen)
Definition: ime.c:1021
#define IME_CMODE_FULLSHAPE
Definition: imm.h:345
DWORD WINAPI ImmGetConversionListA(_In_ HKL hKL, _In_ HIMC hIMC, _In_ LPCSTR lpSrc, _Out_writes_bytes_(dwBufLen) LPCANDIDATELIST lpDst, _In_ DWORD dwBufLen, _In_ UINT uFlag)
Definition: ime.c:1382
BOOL WINAPI ImmNotifyIME(_In_ HIMC hIMC, _In_ DWORD dwAction, _In_ DWORD dwIndex, _In_ DWORD_PTR dwValue)
Definition: ime.c:459
#define IME_CONFIG_GENERAL
Definition: imm.h:405
#define IMC_SETOPENSTATUS
Definition: immdev.h:354
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
Definition: imm.c:1080
#define INIT_LOGFONT
Definition: immdev.h:154
#define NI_CONTEXTUPDATED
Definition: immdev.h:357
#define NI_COMPOSITIONSTR
Definition: immdev.h:363
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
Definition: imm.c:1090
BOOL NTAPI NtUserSetAppImeLevel(HWND hWnd, DWORD dwLevel)
DWORD_PTR NTAPI NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
Definition: ime.c:1894
DWORD NTAPI NtUserGetAppImeLevel(_In_ HWND hWnd)
Definition: ime.c:973
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
#define HIBYTE(W)
Definition: jmemdos.c:486
if(dx< 0)
Definition: linetemp.h:194
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
#define PCHAR
Definition: match.c:90
UINT_PTR HKL
Definition: msctf.idl:125
unsigned int UINT
Definition: ndis.h:50
#define _In_
Definition: no_sal2.h:158
#define BOOL
Definition: nt_native.h:43
#define DWORD
Definition: nt_native.h:44
#define UNICODE_NULL
#define ANSI_NULL
#define HGLOBAL
Definition: ole.h:15
#define LOWORD(l)
Definition: pedump.c:82
WORD * PWORD
Definition: pedump.c:67
short WCHAR
Definition: pedump.c:58
short SHORT
Definition: pedump.c:59
long LONG
Definition: pedump.c:60
char CHAR
Definition: pedump.c:57
#define offsetof(TYPE, MEMBER)
#define LANGIDFROMLCID(l)
Definition: nls.h:18
#define LANG_JAPANESE
Definition: nls.h:76
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define LANG_KOREAN
Definition: nls.h:84
#define _countof(array)
Definition: sndvol32.h:70
RECT rcArea
Definition: dimm.idl:88
DWORD dwStyle
Definition: dimm.idl:86
POINT ptCurrentPos
Definition: dimm.idl:87
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
LPWSTR lpWord
Definition: dimm.idl:36
LPWSTR lpReading
Definition: dimm.idl:35
CANDIDATEFORM cfCandForm[4]
Definition: immdev.h:118
LOGFONTA A
Definition: immdev.h:114
union _tagINPUTCONTEXT::@2217 lfFont
LOGFONTW W
Definition: immdev.h:115
DWORD dwIndex
Definition: imm.h:50
DWORD dwCount
Definition: imm.h:59
DWORD dwOffset[ANYSIZE_ARRAY]
Definition: imm.h:63
UINT fnc
Definition: ime.h:25
LPARAM lParam2
Definition: ime.h:31
UINT dchDest
Definition: ime.h:29
UINT wCount
Definition: ime.h:27
WPARAM wParam
Definition: ime.h:26
LPARAM lParam3
Definition: ime.h:32
LPARAM lParam1
Definition: ime.h:30
UINT dchSource
Definition: ime.h:28
BYTE lfCharSet
Definition: wingdi.h:2351
WCHAR lfFaceName[LF_FACESIZE]
Definition: wingdi.h:2356
LONG lfOrientation
Definition: wingdi.h:2346
LONG lfEscapement
Definition: wingdi.h:2345
LONG top
Definition: windef.h:107
LONG left
Definition: windef.h:106
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define MAKELONG(a, b)
Definition: typedefs.h:249
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
#define HIWORD(l)
Definition: typedefs.h:247
char * PCHAR
Definition: typedefs.h:51
@ QIC_INPUTTHREADID
Definition: undocuser.h:413
#define ValidateHwnd(hwnd)
Definition: precomp.h:98
VOID LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW)
Definition: utils.c:164
#define MAX_CANDIDATEFORM
Definition: precomp.h:79
BOOL Imm32IsSystemJapaneseOrKorean(VOID)
Definition: utils.c:72
#define ImeDpi_IsUnicode(pImeDpi)
Definition: precomp.h:117
LRESULT WINAPI ImmSendIMEMessageExW(_In_ HWND hWnd, _In_ LPARAM lParam)
Definition: win3send.c:1017
LRESULT WINAPI ImmSendIMEMessageExA(_In_ HWND hWnd, _In_ LPARAM lParam)
Definition: win3send.c:1002
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define GHND
Definition: winbase.h:321
#define WINAPI
Definition: msvc.h:6
HGDIOBJ WINAPI GetStockObject(_In_ int)
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
#define SYSTEM_FONT
Definition: wingdi.h:911
#define SHIFTJIS_CHARSET
Definition: wingdi.h:386
HWND WINAPI GetFocus(void)
Definition: window.c:1863
BOOL WINAPI IsWindow(_In_opt_ HWND)
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
#define VK_CONVERT
Definition: winuser.h:2251
HWND WINAPI GetForegroundWindow(void)
Definition: ntwrapper.h:392
#define WM_IME_NOTIFY
Definition: winuser.h:1858
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
unsigned char BYTE
Definition: xxhash.c:193