ReactOS 0.4.16-dev-2613-g9533ad7
ime.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 IME manipulation of IMM32
5 * COPYRIGHT: Copyright 1998 Patrik Stridvall
6 * Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
7 * Copyright 2017 James Tabor <james.tabor@reactos.org>
8 * Copyright 2018 Amine Khaldi <amine.khaldi@reactos.org>
9 * Copyright 2020-2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
10 */
11
12#include "precomp.h"
13#include <ime.h>
14
16
19
21{
22 PIMEDPI pImeDpi;
23
25 for (pImeDpi = gpImeDpiList; pImeDpi != NULL; pImeDpi = pImeDpi->pNext)
26 {
27 if (pImeDpi->hKL == hKL)
28 break;
29 }
31
32 return pImeDpi;
33}
34
35VOID Imm32FreeIME(PIMEDPI pImeDpi, BOOL bDestroy)
36{
37 if (pImeDpi->hInst == NULL)
38 return;
39 if (bDestroy)
40 pImeDpi->ImeDestroy(0);
41 FreeLibrary(pImeDpi->hInst);
42 pImeDpi->hInst = NULL;
43}
44
46{
47 WCHAR szUIClass[64];
48 WNDCLASSW wcW;
49 DWORD dwSysInfoFlags = 0;
50 LPIMEINFO pImeInfo = &pImeDpi->ImeInfo;
51
53 dwSysInfoFlags |= IME_SYSINFO_WINLOGON;
54
55 if (GetWin32ClientInfo()->dwTIFlags & TIF_16BIT)
56 dwSysInfoFlags |= IME_SYSINFO_WOW16;
57
58 if (IS_IME_HKL(pImeDpi->hKL))
59 {
60 if (!pImeDpi->ImeInquire(pImeInfo, szUIClass, dwSysInfoFlags))
61 {
62 ERR("\n");
63 return FALSE;
64 }
65 }
66 else if (IS_CICERO_MODE() && !IS_16BIT_MODE())
67 {
68 if (pImeDpi->CtfImeInquireExW(pImeInfo, szUIClass, dwSysInfoFlags, pImeDpi->hKL) != S_OK)
69 {
70 ERR("\n");
71 return FALSE;
72 }
73 }
74 else
75 {
76 ERR("\n");
77 return FALSE;
78 }
79
80 szUIClass[_countof(szUIClass) - 1] = UNICODE_NULL; /* Avoid buffer overrun */
81
82 if (pImeInfo->dwPrivateDataSize < sizeof(DWORD))
83 pImeInfo->dwPrivateDataSize = sizeof(DWORD);
84
85#define VALID_IME_PROP (IME_PROP_AT_CARET | \
86 IME_PROP_SPECIAL_UI | \
87 IME_PROP_CANDLIST_START_FROM_1 | \
88 IME_PROP_UNICODE | \
89 IME_PROP_COMPLETE_ON_UNSELECT | \
90 IME_PROP_END_UNLOAD | \
91 IME_PROP_KBD_CHAR_FIRST | \
92 IME_PROP_IGNORE_UPKEYS | \
93 IME_PROP_NEED_ALTKEY | \
94 IME_PROP_NO_KEYS_ON_CLOSE | \
95 IME_PROP_ACCEPT_WIDE_VKEY)
96#define VALID_CMODE_CAPS (IME_CMODE_ALPHANUMERIC | \
97 IME_CMODE_NATIVE | \
98 IME_CMODE_KATAKANA | \
99 IME_CMODE_LANGUAGE | \
100 IME_CMODE_FULLSHAPE | \
101 IME_CMODE_ROMAN | \
102 IME_CMODE_CHARCODE | \
103 IME_CMODE_HANJACONVERT | \
104 IME_CMODE_SOFTKBD | \
105 IME_CMODE_NOCONVERSION | \
106 IME_CMODE_EUDC | \
107 IME_CMODE_SYMBOL | \
108 IME_CMODE_FIXED)
109#define VALID_SMODE_CAPS (IME_SMODE_NONE | \
110 IME_SMODE_PLAURALCLAUSE | \
111 IME_SMODE_SINGLECONVERT | \
112 IME_SMODE_AUTOMATIC | \
113 IME_SMODE_PHRASEPREDICT | \
114 IME_SMODE_CONVERSATION)
115#define VALID_UI_CAPS (UI_CAP_2700 | \
116 UI_CAP_ROT90 | \
117 UI_CAP_ROTANY | \
118 UI_CAP_SOFTKBD)
119#define VALID_SCS_CAPS (SCS_CAP_COMPSTR | \
120 SCS_CAP_MAKEREAD | \
121 SCS_CAP_SETRECONVERTSTRING)
122#define VALID_SELECT_CAPS (SELECT_CAP_CONVERSION | SELECT_CAP_SENTENCE)
123
124 if (pImeInfo->fdwProperty & ~VALID_IME_PROP)
125 {
126 ERR("Bad flags\n");
127 return FALSE;
128 }
129 if (pImeInfo->fdwConversionCaps & ~VALID_CMODE_CAPS)
130 {
131 ERR("Bad flags\n");
132 return FALSE;
133 }
134 if (pImeInfo->fdwSentenceCaps & ~VALID_SMODE_CAPS)
135 {
136 ERR("Bad flags\n");
137 return FALSE;
138 }
139 if (pImeInfo->fdwUICaps & ~VALID_UI_CAPS)
140 {
141 ERR("Bad flags\n");
142 return FALSE;
143 }
144 if (pImeInfo->fdwSCSCaps & ~VALID_SCS_CAPS)
145 {
146 ERR("Bad flags\n");
147 return FALSE;
148 }
149 if (pImeInfo->fdwSelectCaps & ~VALID_SELECT_CAPS)
150 {
151 ERR("Bad flags\n");
152 return FALSE;
153 }
154
155#undef VALID_IME_PROP
156#undef VALID_CMODE_CAPS
157#undef VALID_SMODE_CAPS
158#undef VALID_UI_CAPS
159#undef VALID_SCS_CAPS
160#undef VALID_SELECT_CAPS
161
162 if (pImeInfo->fdwProperty & IME_PROP_UNICODE)
163 {
164 StringCchCopyW(pImeDpi->szUIClass, _countof(pImeDpi->szUIClass), szUIClass);
165 }
166 else
167 {
168 if (pImeDpi->uCodePage != GetACP() && pImeDpi->uCodePage != CP_ACP)
169 return FALSE;
170
172 pImeDpi->szUIClass, _countof(pImeDpi->szUIClass));
173
174 pImeDpi->szUIClass[_countof(pImeDpi->szUIClass) - 1] = UNICODE_NULL;
175 }
176
177 if (!GetClassInfoW(pImeDpi->hInst, pImeDpi->szUIClass, &wcW))
178 {
179 ERR("\n");
180 return FALSE;
181 }
182
183 return TRUE;
184}
185
186/* Define stub IME functions */
187#define DEFINE_IME_ENTRY(type, name, params, optional) \
188 type APIENTRY Stub##name params { \
189 FIXME("%s: Why stub called?\n", #name); \
190 return (type)0; \
191 }
192#include <imetable.h>
193#undef DEFINE_IME_ENTRY
194
195static BOOL
196Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
197{
199 HINSTANCE hIME;
200 FARPROC fn;
201 BOOL ret = FALSE;
202
204 return FALSE;
205
206 pImeDpi->hInst = hIME = LoadLibraryW(szPath);
207 if (hIME == NULL)
208 {
209 ERR("LoadLibraryW(%s) failed\n", debugstr_w(szPath));
210 return FALSE;
211 }
212
213 /* Populate the table by stub IME functions */
214#define DEFINE_IME_ENTRY(type, name, params, optional) pImeDpi->name = Stub##name;
215#include <imetable.h>
216#undef DEFINE_IME_ENTRY
217
218 /* Populate the table by real IME functions */
219#define DEFINE_IME_ENTRY(type, name, params, optional) \
220 do { \
221 fn = GetProcAddress(hIME, #name); \
222 if (fn) pImeDpi->name = (FN_##name)fn; \
223 else if (!(optional)) { \
224 ERR("'%s' not found in IME module %s.\n", #name, debugstr_w(szPath)); \
225 goto Failed; \
226 } \
227 } while (0);
228#include <imetable.h>
229#undef DEFINE_IME_ENTRY
230
231 /* Check for Cicero IMEs */
232 if (!IS_IME_HKL(pImeDpi->hKL) && IS_CICERO_MODE() && !IS_CICERO_COMPAT_DISABLED())
233 {
234#define CHECK_IME_FN(name) do { \
235 if (!pImeDpi->name) { \
236 ERR("'%s' not found in Cicero IME module %s.\n", #name, debugstr_w(szPath)); \
237 goto Failed; \
238 } \
239} while(0)
245#undef CHECK_IME_FN
246 }
247
248 if (Imm32InquireIme(pImeDpi))
249 {
250 ret = TRUE;
251 }
252 else
253 {
254Failed:
255 ret = FALSE;
256 FreeLibrary(pImeDpi->hInst);
257 pImeDpi->hInst = NULL;
258 }
259
260 if (pImeInfoEx->fLoadFlag == 0)
261 {
262 if (ret)
263 {
264 C_ASSERT(sizeof(pImeInfoEx->wszUIClass) == sizeof(pImeDpi->szUIClass));
265 pImeInfoEx->ImeInfo = pImeDpi->ImeInfo;
266 RtlCopyMemory(pImeInfoEx->wszUIClass, pImeDpi->szUIClass,
267 sizeof(pImeInfoEx->wszUIClass));
268 pImeInfoEx->fLoadFlag = 2;
269 }
270 else
271 {
272 pImeInfoEx->fLoadFlag = 1;
273 }
274
275 NtUserSetImeInfoEx(pImeInfoEx);
276 }
277
278 return ret;
279}
280
281static PIMEDPI
283{
284 IMEINFOEX ImeInfoEx;
285 CHARSETINFO ci;
286 PIMEDPI pImeDpiNew, pImeDpiFound;
287 UINT uCodePage;
288 LCID lcid;
289
290 if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
291 {
292 ERR("\n");
293 return NULL;
294 }
295
296 if (ImeInfoEx.fLoadFlag == 1)
297 {
298 ERR("\n");
299 return NULL;
300 }
301
302 pImeDpiNew = ImmLocalAlloc(HEAP_ZERO_MEMORY, sizeof(IMEDPI));
303 if (IS_NULL_UNEXPECTEDLY(pImeDpiNew))
304 return NULL;
305
306 pImeDpiNew->hKL = hKL;
307
308 lcid = LOWORD(hKL);
310 uCodePage = ci.ciACP;
311 else
312 uCodePage = CP_ACP;
313 pImeDpiNew->uCodePage = uCodePage;
314
315 if (!Imm32LoadIME(&ImeInfoEx, pImeDpiNew))
316 {
317 ERR("\n");
318 ImmLocalFree(pImeDpiNew);
319 return FALSE;
320 }
321
323
324 pImeDpiFound = Imm32FindImeDpi(hKL);
325 if (pImeDpiFound)
326 {
327 if (!bLock)
328 pImeDpiFound->dwFlags &= ~IMEDPI_FLAG_LOCKED;
329
331 Imm32FreeIME(pImeDpiNew, FALSE);
332 ImmLocalFree(pImeDpiNew);
333 return pImeDpiFound;
334 }
335 else
336 {
337 if (bLock)
338 {
339 pImeDpiNew->dwFlags |= IMEDPI_FLAG_LOCKED;
340 pImeDpiNew->cLockObj = 1;
341 }
342
343 pImeDpiNew->pNext = gpImeDpiList;
344 gpImeDpiList = pImeDpiNew;
345
347 return pImeDpiNew;
348 }
349}
350
352{
353 PIMEDPI pImeDpi;
354
355 if (!IS_IME_HKL(hKL) && (!IS_CICERO_MODE() || IS_16BIT_MODE()))
356 {
357 TRACE("\n");
358 return NULL;
359 }
360
361 pImeDpi = ImmLockImeDpi(hKL);
362 if (pImeDpi == NULL)
363 pImeDpi = Imm32LoadImeDpi(hKL, TRUE);
364 return pImeDpi;
365}
366
367static LRESULT
368ImeDpi_Escape(PIMEDPI pImeDpi, HIMC hIMC, UINT uSubFunc, LPVOID lpData, HKL hKL)
369{
370 if (IS_IME_HKL(hKL))
371 return pImeDpi->ImeEscape(hIMC, uSubFunc, lpData);
372 if (IS_CICERO_MODE() && !IS_16BIT_MODE())
373 return pImeDpi->CtfImeEscapeEx(hIMC, uSubFunc, lpData, hKL);
374
375 return 0;
376}
377
378BOOL
380{
381 BOOL ret = TRUE;
382 PIMEDPI pImeDpi0, pImeDpi1;
383
385
386 for (pImeDpi0 = gpImeDpiList; pImeDpi0; pImeDpi0 = pImeDpi0->pNext)
387 {
388 if (pImeDpi0->hKL == hKL)
389 break;
390 }
391
392 if (!pImeDpi0)
393 goto Quit;
394
395 if (pImeDpi0->cLockObj)
396 {
397 pImeDpi0->dwFlags |= IMEDPI_FLAG_UNLOADED;
398 ret = FALSE;
399 goto Quit;
400 }
401
402 if (gpImeDpiList == pImeDpi0)
403 {
404 gpImeDpiList = pImeDpi0->pNext;
405 }
406 else if (gpImeDpiList)
407 {
408 for (pImeDpi1 = gpImeDpiList; pImeDpi1; pImeDpi1 = pImeDpi1->pNext)
409 {
410 if (pImeDpi1->pNext == pImeDpi0)
411 {
412 pImeDpi1->pNext = pImeDpi0->pNext;
413 break;
414 }
415 }
416 }
417
418 Imm32FreeIME(pImeDpi0, TRUE);
419 ImmLocalFree(pImeDpi0);
420
421Quit:
423 return ret;
424}
425
426/***********************************************************************
427 * ImmIsIME (IMM32.@)
428 */
431{
433 TRACE("(%p)\n", hKL);
435}
436
437/***********************************************************************
438 * ImmGetDefaultIMEWnd (IMM32.@)
439 */
442{
443 if (!IS_IMM_MODE())
444 {
445 TRACE("\n");
446 return NULL;
447 }
448
449 if (hWnd == NULL)
451
453}
454
455/***********************************************************************
456 * ImmNotifyIME (IMM32.@)
457 */
460 _In_ HIMC hIMC,
461 _In_ DWORD dwAction,
462 _In_ DWORD dwIndex,
463 _In_ DWORD_PTR dwValue)
464{
465 HKL hKL;
466 PIMEDPI pImeDpi;
467 BOOL ret;
468
469 TRACE("(%p, %lu, %lu, %lu)\n", hIMC, dwAction, dwIndex, dwValue);
470
471 if (hIMC && IS_CROSS_THREAD_HIMC(hIMC))
472 return FALSE;
473
474 hKL = GetKeyboardLayout(0);
475 pImeDpi = ImmLockImeDpi(hKL);
476 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
477 return FALSE;
478
479 TRACE("NotifyIME(%p, %lu, %lu, %p)\n", hIMC, dwAction, dwIndex, dwValue);
480 ret = pImeDpi->NotifyIME(hIMC, dwAction, dwIndex, dwValue);
481 if (!ret)
482 WARN("NotifyIME(%p, %lu, %lu, %p) failed\n", hIMC, dwAction, dwIndex, dwValue);
483
484 ImmUnlockImeDpi(pImeDpi);
485 return ret;
486}
487
488/***********************************************************************
489 * ImmGetImeInfoEx (IMM32.@)
490 */
492ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
493{
494 BOOL bTextServiceDisabled = FALSE;
495
496 if (SearchType == ImeInfoExKeyboardLayoutTFS)
497 {
498 SearchType = ImeInfoExKeyboardLayout;
499 bTextServiceDisabled = CtfImmIsTextFrameServiceDisabled();
500 }
501
502 if (SearchType == ImeInfoExKeyboardLayout)
503 {
504 HKL hKL = *(HKL *)pvSearchKey;
505 pImeInfoEx->hkl = hKL;
506
507 if (!IS_IME_HKL(hKL) &&
508 (!IS_CICERO_MODE() || IS_CICERO_COMPAT_DISABLED() || bTextServiceDisabled))
509 {
510 TRACE("IME is disabled\n");
511 return FALSE;
512 }
513
514 return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
515 }
516
517 if (SearchType == ImeInfoExImeFileName)
518 {
519 StringCchCopyW(pImeInfoEx->wszImeFile, _countof(pImeInfoEx->wszImeFile), pvSearchKey);
520 return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
521 }
522
523 /* NOTE: ImeInfoExImeWindow is ignored */
524 ERR("SearchType: %d\n", SearchType);
525 return FALSE;
526}
527
528/***********************************************************************
529 * ImmLockImeDpi (IMM32.@)
530 */
533{
534 PIMEDPI pImeDpi = NULL;
535
536 TRACE("(%p)\n", hKL);
537
539
540 /* Find by hKL */
541 for (pImeDpi = gpImeDpiList; pImeDpi; pImeDpi = pImeDpi->pNext)
542 {
543 if (pImeDpi->hKL == hKL) /* found */
544 {
545 /* lock if possible */
546 if (pImeDpi->dwFlags & IMEDPI_FLAG_UNLOADED)
547 pImeDpi = NULL;
548 else
549 ++(pImeDpi->cLockObj);
550 break;
551 }
552 }
553
555 return pImeDpi;
556}
557
558/***********************************************************************
559 * ImmUnlockImeDpi (IMM32.@)
560 */
563 _Inout_opt_ PIMEDPI pImeDpi)
564{
565 PIMEDPI *ppEntry;
566
567 TRACE("(%p)\n", pImeDpi);
568
569 if (pImeDpi == NULL)
570 return;
571
573
574 /* unlock */
575 --(pImeDpi->cLockObj);
576 if (pImeDpi->cLockObj != 0)
577 {
579 return;
580 }
581
582 if ((pImeDpi->dwFlags & IMEDPI_FLAG_UNLOADED) == 0)
583 {
584 if ((pImeDpi->dwFlags & IMEDPI_FLAG_LOCKED) == 0 ||
585 (pImeDpi->ImeInfo.fdwProperty & IME_PROP_END_UNLOAD) == 0)
586 {
588 return;
589 }
590 }
591
592 /* Remove from list */
593 for (ppEntry = &gpImeDpiList; *ppEntry; ppEntry = &((*ppEntry)->pNext))
594 {
595 if (*ppEntry == pImeDpi) /* found */
596 {
597 *ppEntry = pImeDpi->pNext;
598 break;
599 }
600 }
601
602 Imm32FreeIME(pImeDpi, TRUE);
603 ImmLocalFree(pImeDpi);
604
606}
607
608/***********************************************************************
609 * ImmLoadIME (IMM32.@)
610 */
613{
614 PIMEDPI pImeDpi;
615
616 if (!IS_IME_HKL(hKL) && (!IS_CICERO_MODE() || IS_16BIT_MODE()))
617 {
618 TRACE("\n");
619 return FALSE;
620 }
621
622 pImeDpi = Imm32FindImeDpi(hKL);
623 if (pImeDpi == NULL)
624 pImeDpi = Imm32LoadImeDpi(hKL, FALSE);
625 return (pImeDpi != NULL);
626}
627
628/***********************************************************************
629 * ImmDisableIME (IMM32.@)
630 */
633{
635}
636
637/***********************************************************************
638 * ImmGetDescriptionA (IMM32.@)
639 */
642 _In_ HKL hKL,
643 _Out_writes_opt_(uBufLen) LPSTR lpszDescription,
644 _In_ UINT uBufLen)
645{
647 size_t cch;
648
649 TRACE("(%p,%p,%d)\n", hKL, lpszDescription, uBufLen);
650
652 {
653 ERR("\n");
654 return 0;
655 }
656
657 StringCchLengthW(info.wszImeDescription, _countof(info.wszImeDescription), &cch);
658 cch = WideCharToMultiByte(CP_ACP, 0, info.wszImeDescription, (INT)cch,
659 lpszDescription, uBufLen, NULL, NULL);
660 if (uBufLen)
661 lpszDescription[cch] = ANSI_NULL;
662 return (UINT)cch;
663}
664
665/***********************************************************************
666 * ImmGetDescriptionW (IMM32.@)
667 */
670 _In_ HKL hKL,
671 _Out_writes_opt_(uBufLen) LPWSTR lpszDescription,
672 _In_ UINT uBufLen)
673{
675 size_t cch;
676
677 TRACE("(%p, %p, %d)\n", hKL, lpszDescription, uBufLen);
678
680 {
681 ERR("\n");
682 return 0;
683 }
684
685 if (uBufLen != 0)
686 StringCchCopyW(lpszDescription, uBufLen, info.wszImeDescription);
687
688 StringCchLengthW(info.wszImeDescription, _countof(info.wszImeDescription), &cch);
689 return (UINT)cch;
690}
691
692/***********************************************************************
693 * ImmGetIMEFileNameA (IMM32.@)
694 */
697 _In_ HKL hKL,
698 _Out_writes_opt_(uBufLen) LPSTR lpszFileName,
699 _In_ UINT uBufLen)
700{
701 BOOL bDefUsed;
703 size_t cch;
704
705 TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
706
708 {
709 ERR("\n");
710 if (uBufLen > 0)
711 lpszFileName[0] = ANSI_NULL;
712 return 0;
713 }
714
715 StringCchLengthW(info.wszImeFile, _countof(info.wszImeFile), &cch);
716
717 cch = WideCharToMultiByte(CP_ACP, 0, info.wszImeFile, (INT)cch,
718 lpszFileName, uBufLen, NULL, &bDefUsed);
719 if (uBufLen == 0)
720 return (UINT)cch;
721
722 if (cch > uBufLen - 1)
723 cch = uBufLen - 1;
724
725 lpszFileName[cch] = ANSI_NULL;
726 return (UINT)cch;
727}
728
729/***********************************************************************
730 * ImmGetIMEFileNameW (IMM32.@)
731 */
734 _In_ HKL hKL,
735 _Out_writes_opt_(uBufLen) LPWSTR lpszFileName,
736 _In_ UINT uBufLen)
737{
739 size_t cch;
740
741 TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
742
744 {
745 ERR("\n");
746 if (uBufLen > 0)
747 lpszFileName[0] = UNICODE_NULL;
748 return 0;
749 }
750
751 StringCchLengthW(info.wszImeFile, _countof(info.wszImeFile), &cch);
752 if (uBufLen == 0)
753 return (UINT)cch;
754
755 StringCchCopyNW(lpszFileName, uBufLen, info.wszImeFile, cch);
756
757 if (cch > uBufLen - 1)
758 cch = uBufLen - 1;
759
760 lpszFileName[cch] = UNICODE_NULL;
761 return (UINT)cch;
762}
763
764/***********************************************************************
765 * ImmGetProperty (IMM32.@)
766 */
769 _In_ HKL hKL,
770 _In_ DWORD fdwIndex)
771{
772 IMEINFOEX ImeInfoEx;
773 LPIMEINFO pImeInfo;
774 DWORD dwValue;
775 PIMEDPI pImeDpi = NULL;
776
777 TRACE("(%p, %lu)\n", hKL, fdwIndex);
778
779 if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
780 {
781 ERR("\n");
782 return FALSE;
783 }
784
785 if (fdwIndex == IGP_GETIMEVERSION)
786 return ImeInfoEx.dwImeWinVersion;
787
788 if (ImeInfoEx.fLoadFlag != 2)
789 {
790 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
791 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
792 return FALSE;
793
794 pImeInfo = &pImeDpi->ImeInfo;
795 }
796 else
797 {
798 pImeInfo = &ImeInfoEx.ImeInfo;
799 }
800
801 switch (fdwIndex)
802 {
803 case IGP_PROPERTY: dwValue = pImeInfo->fdwProperty; break;
804 case IGP_CONVERSION: dwValue = pImeInfo->fdwConversionCaps; break;
805 case IGP_SENTENCE: dwValue = pImeInfo->fdwSentenceCaps; break;
806 case IGP_UI: dwValue = pImeInfo->fdwUICaps; break;
807 case IGP_SETCOMPSTR: dwValue = pImeInfo->fdwSCSCaps; break;
808 case IGP_SELECT: dwValue = pImeInfo->fdwSelectCaps; break;
809 default: dwValue = 0; break;
810 }
811
812 if (pImeDpi)
813 ImmUnlockImeDpi(pImeDpi);
814 return dwValue;
815}
816
817/***********************************************************************
818 * ImmEscapeA (IMM32.@)
819 */
822 _In_ HKL hKL,
823 _In_ HIMC hIMC,
824 _In_ UINT uSubFunc,
825 _Inout_opt_ LPVOID lpData)
826{
827 LRESULT ret;
828 PIMEDPI pImeDpi;
829 INT cch;
832
833 TRACE("(%p, %p, %u, %p)\n", hKL, hIMC, uSubFunc, lpData);
834
835 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
836 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
837 return 0;
838
839 if (!ImeDpi_IsUnicode(pImeDpi) || !lpData) /* No conversion needed */
840 {
841 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
842 ImmUnlockImeDpi(pImeDpi);
843 return ret;
844 }
845
846 switch (uSubFunc)
847 {
849 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
850
851 cch = 0;
852 if (HIWORD(ret))
853 szW[cch++] = HIWORD(ret);
854 if (LOWORD(ret))
855 szW[cch++] = LOWORD(ret);
856
857 cch = WideCharToMultiByte(pImeDpi->uCodePage, 0, szW, cch, szA, _countof(szA),
858 NULL, NULL);
859 switch (cch)
860 {
861 case 1:
862 ret = MAKEWORD(szA[0], 0);
863 break;
864 case 2:
865 ret = MAKEWORD(szA[1], szA[0]);
866 break;
867 case 3:
868 ret = MAKELONG(MAKEWORD(szA[2], szA[1]), MAKEWORD(szA[0], 0));
869 break;
870 case 4:
871 ret = MAKELONG(MAKEWORD(szA[3], szA[2]), MAKEWORD(szA[1], szA[0]));
872 break;
873 default:
874 ret = 0;
875 break;
876 }
877 break;
878
880 case IME_ESC_IME_NAME:
882 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, szW, hKL);
883 if (ret)
884 {
885 szW[_countof(szW) - 1] = UNICODE_NULL; /* Avoid buffer overrun */
886 WideCharToMultiByte(pImeDpi->uCodePage, 0, szW, -1,
887 lpData, MAX_IMM_FILENAME, NULL, NULL);
888 ((LPSTR)lpData)[MAX_IMM_FILENAME - 1] = ANSI_NULL; // Avoid buffer overrun
889 }
890 break;
891
895 lpData, -1, szW, _countof(szW));
896 szW[_countof(szW) - 1] = UNICODE_NULL; /* Avoid buffer overrun */
897 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, szW, hKL);
898 break;
899
900 default:
901 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
902 break;
903 }
904
905 ImmUnlockImeDpi(pImeDpi);
906 TRACE("ret: %p\n", ret);
907 return ret;
908}
909
910/***********************************************************************
911 * ImmEscapeW (IMM32.@)
912 */
915 _In_ HKL hKL,
916 _In_ HIMC hIMC,
917 _In_ UINT uSubFunc,
918 _Inout_opt_ LPVOID lpData)
919{
920 LRESULT ret;
921 PIMEDPI pImeDpi;
922 INT cch;
925 WORD word;
926
927 TRACE("(%p, %p, %u, %p)\n", hKL, hIMC, uSubFunc, lpData);
928
929 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
930 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
931 return 0;
932
933 if (ImeDpi_IsUnicode(pImeDpi) || !lpData) /* No conversion needed */
934 {
935 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
936 ImmUnlockImeDpi(pImeDpi);
937 return ret;
938 }
939
940 switch (uSubFunc)
941 {
943 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
944
945 word = LOWORD(ret);
946 cch = 0;
947 if (HIBYTE(word))
948 szA[cch++] = HIBYTE(word);
949 if (LOBYTE(word))
950 szA[cch++] = LOBYTE(word);
951
953 szA, cch, szW, _countof(szW));
954 switch (cch)
955 {
956 case 1: ret = szW[0]; break;
957 case 2: ret = MAKELONG(szW[1], szW[0]); break;
958 default: ret = 0; break;
959 }
960 break;
961
963 case IME_ESC_IME_NAME:
965 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, szA, hKL);
966 if (ret)
967 {
968 szA[_countof(szA) - 1] = ANSI_NULL; // Avoid buffer overrun
970 szA, -1, lpData, MAX_IMM_FILENAME);
971 ((LPWSTR)lpData)[MAX_IMM_FILENAME - 1] = UNICODE_NULL; /* Avoid buffer overrun */
972 }
973 break;
974
977 WideCharToMultiByte(pImeDpi->uCodePage, 0,
978 lpData, -1, szA, _countof(szA), NULL, NULL);
979 szA[_countof(szA) - 1] = ANSI_NULL; // Avoid buffer overrun
980 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, szA, hKL);
981 break;
982
983 default:
984 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
985 break;
986 }
987
988 ImmUnlockImeDpi(pImeDpi);
989 TRACE("ret: %p\n", ret);
990 return ret;
991}
992
993/***********************************************************************
994 * ImmGetOpenStatus (IMM32.@)
995 */
998{
999 BOOL ret;
1000 LPINPUTCONTEXT pIC;
1001
1002 TRACE("(%p)\n", hIMC);
1003
1004 if (IS_NULL_UNEXPECTEDLY(hIMC))
1005 return FALSE;
1006
1007 pIC = ImmLockIMC(hIMC);
1008 if (IS_NULL_UNEXPECTEDLY(pIC))
1009 return FALSE;
1010
1011 ret = pIC->fOpen;
1012 ImmUnlockIMC(hIMC);
1013 TRACE("ret: %d\n", ret);
1014 return ret;
1015}
1016
1017/***********************************************************************
1018 * ImmSetOpenStatus (IMM32.@)
1019 */
1022 _In_ HIMC hIMC,
1023 _In_ BOOL fOpen)
1024{
1025 DWORD dwConversion;
1026 LPINPUTCONTEXT pIC;
1027 HWND hWnd;
1028 BOOL bHasChange = FALSE;
1029
1030 TRACE("(%p, %d)\n", hIMC, fOpen);
1031
1032 if (IS_CROSS_THREAD_HIMC(hIMC))
1033 return FALSE;
1034
1035 pIC = ImmLockIMC(hIMC);
1036 if (IS_NULL_UNEXPECTEDLY(pIC))
1037 return FALSE;
1038
1039 if (pIC->fOpen != fOpen)
1040 {
1041 pIC->fOpen = fOpen;
1042 hWnd = pIC->hWnd;
1043 dwConversion = pIC->fdwConversion;
1044 bHasChange = TRUE;
1045 }
1046
1047 ImmUnlockIMC(hIMC);
1048
1049 if (bHasChange)
1050 {
1053 NtUserNotifyIMEStatus(hWnd, fOpen, dwConversion);
1054 }
1055 else
1056 {
1057 TRACE("No change.\n");
1058 }
1059
1060 return TRUE;
1061}
1062
1063/***********************************************************************
1064 * ImmGetStatusWindowPos (IMM32.@)
1065 */
1068 _In_ HIMC hIMC,
1069 _Out_ LPPOINT lpptPos)
1070{
1071 LPINPUTCONTEXT pIC;
1072 BOOL ret;
1073
1074 TRACE("(%p, %p)\n", hIMC, lpptPos);
1075
1076 pIC = ImmLockIMC(hIMC);
1077 if (IS_NULL_UNEXPECTEDLY(pIC))
1078 return FALSE;
1079
1080 ret = !!(pIC->fdwInit & INIT_STATUSWNDPOS);
1081 if (ret)
1082 *lpptPos = pIC->ptStatusWndPos;
1083
1084 ImmUnlockIMC(hIMC);
1085 return ret;
1086}
1087
1088/***********************************************************************
1089 * ImmSetStatusWindowPos (IMM32.@)
1090 */
1093 _In_ HIMC hIMC,
1094 _In_ LPPOINT lpptPos)
1095{
1096 LPINPUTCONTEXT pIC;
1097 HWND hWnd;
1098
1099 TRACE("(%p, {%ld, %ld})\n", hIMC, lpptPos->x, lpptPos->y);
1100
1101 if (IS_CROSS_THREAD_HIMC(hIMC))
1102 return FALSE;
1103
1104 pIC = ImmLockIMC(hIMC);
1105 if (IS_NULL_UNEXPECTEDLY(pIC))
1106 return FALSE;
1107
1108 hWnd = pIC->hWnd;
1109 pIC->ptStatusWndPos = *lpptPos;
1110 pIC->fdwInit |= INIT_STATUSWNDPOS;
1111
1112 ImmUnlockIMC(hIMC);
1113
1116 return TRUE;
1117}
1118
1119/***********************************************************************
1120 * ImmGetCompositionWindow (IMM32.@)
1121 */
1124 _In_ HIMC hIMC,
1125 _Out_ LPCOMPOSITIONFORM lpCompForm)
1126{
1127 LPINPUTCONTEXT pIC;
1128 BOOL ret = FALSE;
1129
1130 TRACE("(%p, %p)\n", hIMC, lpCompForm);
1131
1132 pIC = ImmLockIMC(hIMC);
1133 if (IS_NULL_UNEXPECTEDLY(pIC))
1134 return FALSE;
1135
1136 if (pIC->fdwInit & INIT_COMPFORM)
1137 {
1138 *lpCompForm = pIC->cfCompForm;
1139 ret = TRUE;
1140 }
1141
1142 ImmUnlockIMC(hIMC);
1143 return ret;
1144}
1145
1146/***********************************************************************
1147 * ImmSetCompositionWindow (IMM32.@)
1148 */
1151 _In_ HIMC hIMC,
1152 _In_ LPCOMPOSITIONFORM lpCompForm)
1153{
1154 LPINPUTCONTEXTDX pIC;
1155 HWND hWnd;
1156
1157 if (Imm32IsCrossThreadAccess(hIMC))
1158 return FALSE;
1159
1160 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
1161 if (IS_NULL_UNEXPECTEDLY(pIC))
1162 return FALSE;
1163
1164 pIC->cfCompForm = *lpCompForm;
1165 pIC->fdwInit |= INIT_COMPFORM;
1166
1167 if (pIC->dwUIFlags & _IME_UI_NO_COMPFORM)
1168 pIC->dwUIFlags &= ~_IME_UI_NO_COMPFORM;
1169 else
1170 pIC->dwUIFlags &= ~_IME_UI_HIDDEN;
1171
1172 hWnd = pIC->hWnd;
1173
1174 ImmUnlockIMC(hIMC);
1175
1178 return TRUE;
1179}
1180
1181/***********************************************************************
1182 * ImmGetCompositionFontA (IMM32.@)
1183 */
1186 _In_ HIMC hIMC,
1187 _Out_ LPLOGFONTA lplf)
1188{
1189 PCLIENTIMC pClientImc;
1190 BOOL ret = FALSE, bWide;
1191 LPINPUTCONTEXT pIC;
1192
1193 TRACE("(%p, %p)\n", hIMC, lplf);
1194
1195 pClientImc = ImmLockClientImc(hIMC);
1196 if (IS_NULL_UNEXPECTEDLY(pClientImc))
1197 return FALSE;
1198
1199 bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
1200 ImmUnlockClientImc(pClientImc);
1201
1202 pIC = ImmLockIMC(hIMC);
1203 if (IS_NULL_UNEXPECTEDLY(pIC))
1204 return FALSE;
1205
1206 if (pIC->fdwInit & INIT_LOGFONT)
1207 {
1208 if (bWide)
1209 LogFontWideToAnsi(&pIC->lfFont.W, lplf);
1210 else
1211 *lplf = pIC->lfFont.A;
1212
1213 ret = TRUE;
1214 }
1215
1216 ImmUnlockIMC(hIMC);
1217 return ret;
1218}
1219
1220/***********************************************************************
1221 * ImmGetCompositionFontW (IMM32.@)
1222 */
1225 _In_ HIMC hIMC,
1226 _Out_ LPLOGFONTW lplf)
1227{
1228 PCLIENTIMC pClientImc;
1229 BOOL bWide;
1230 LPINPUTCONTEXT pIC;
1231 BOOL ret = FALSE;
1232
1233 TRACE("(%p, %p)\n", hIMC, lplf);
1234
1235 pClientImc = ImmLockClientImc(hIMC);
1236 if (IS_NULL_UNEXPECTEDLY(pClientImc))
1237 return FALSE;
1238
1239 bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
1240 ImmUnlockClientImc(pClientImc);
1241
1242 pIC = ImmLockIMC(hIMC);
1243 if (IS_NULL_UNEXPECTEDLY(pIC))
1244 return FALSE;
1245
1246 if (pIC->fdwInit & INIT_LOGFONT)
1247 {
1248 if (bWide)
1249 *lplf = pIC->lfFont.W;
1250 else
1251 LogFontAnsiToWide(&pIC->lfFont.A, lplf);
1252
1253 ret = TRUE;
1254 }
1255
1256 ImmUnlockIMC(hIMC);
1257 return ret;
1258}
1259
1260/***********************************************************************
1261 * ImmSetCompositionFontA (IMM32.@)
1262 */
1265 _In_ HIMC hIMC,
1266 _In_ LPLOGFONTA lplf)
1267{
1268 LOGFONTW lfW;
1269 PCLIENTIMC pClientImc;
1270 BOOL bWide;
1271 LPINPUTCONTEXTDX pIC;
1272 LANGID LangID;
1273 HWND hWnd;
1274
1275 TRACE("(%p, %p)\n", hIMC, lplf);
1276
1277 if (IS_CROSS_THREAD_HIMC(hIMC))
1278 return FALSE;
1279
1280 pClientImc = ImmLockClientImc(hIMC);
1281 if (IS_NULL_UNEXPECTEDLY(pClientImc))
1282 return FALSE;
1283
1284 bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
1285 ImmUnlockClientImc(pClientImc);
1286
1287 if (bWide)
1288 {
1289 LogFontAnsiToWide(lplf, &lfW);
1290 return ImmSetCompositionFontW(hIMC, &lfW);
1291 }
1292
1293 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
1294 if (IS_NULL_UNEXPECTEDLY(pIC))
1295 return FALSE;
1296
1297 if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */
1298 {
1301 !(pIC->dwUIFlags & _IME_UI_HIDDEN) &&
1302 pIC->cfCompForm.dwStyle != CFS_DEFAULT)
1303 {
1305 }
1306 }
1307
1308 pIC->lfFont.A = *lplf;
1309 pIC->fdwInit |= INIT_LOGFONT;
1310 hWnd = pIC->hWnd;
1311
1312 ImmUnlockIMC(hIMC);
1313
1316 return TRUE;
1317}
1318
1319/***********************************************************************
1320 * ImmSetCompositionFontW (IMM32.@)
1321 */
1324 _In_ HIMC hIMC,
1325 _In_ LPLOGFONTW lplf)
1326{
1327 LOGFONTA lfA;
1328 PCLIENTIMC pClientImc;
1329 BOOL bWide;
1330 HWND hWnd;
1331 LPINPUTCONTEXTDX pIC;
1332 LANGID LangID;
1333
1334 TRACE("(%p, %p)\n", hIMC, lplf);
1335
1336 if (IS_CROSS_THREAD_HIMC(hIMC))
1337 return FALSE;
1338
1339 pClientImc = ImmLockClientImc(hIMC);
1340 if (IS_NULL_UNEXPECTEDLY(pClientImc))
1341 return FALSE;
1342
1343 bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
1344 ImmUnlockClientImc(pClientImc);
1345
1346 if (!bWide)
1347 {
1348 LogFontWideToAnsi(lplf, &lfA);
1349 return ImmSetCompositionFontA(hIMC, &lfA);
1350 }
1351
1352 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
1353 if (IS_NULL_UNEXPECTEDLY(pIC))
1354 return FALSE;
1355
1356 if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */
1357 {
1360 !(pIC->dwUIFlags & _IME_UI_HIDDEN) &&
1361 pIC->cfCompForm.dwStyle != CFS_DEFAULT)
1362 {
1364 }
1365 }
1366
1367 pIC->lfFont.W = *lplf;
1368 pIC->fdwInit |= INIT_LOGFONT;
1369 hWnd = pIC->hWnd;
1370
1371 ImmUnlockIMC(hIMC);
1372
1375 return TRUE;
1376}
1377
1378/***********************************************************************
1379 * ImmGetConversionListA (IMM32.@)
1380 */
1383 _In_ HKL hKL,
1384 _In_ HIMC hIMC,
1385 _In_ LPCSTR pSrc,
1386 _Out_writes_bytes_(dwBufLen) LPCANDIDATELIST lpDst,
1387 _In_ DWORD dwBufLen,
1388 _In_ UINT uFlag)
1389{
1390 DWORD ret = 0;
1391 UINT cb;
1392 LPWSTR pszSrcW = NULL;
1393 LPCANDIDATELIST pCL = NULL;
1394 PIMEDPI pImeDpi;
1395
1396 TRACE("(%p, %p, %s, %p, %lu, 0x%lX)\n", hKL, hIMC, debugstr_a(pSrc), lpDst, dwBufLen, uFlag);
1397
1398 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
1399 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1400 return 0;
1401
1402 if (!ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
1403 {
1404 ret = pImeDpi->ImeConversionList(hIMC, pSrc, lpDst, dwBufLen, uFlag);
1405 ImmUnlockImeDpi(pImeDpi);
1406 return ret;
1407 }
1408
1409 if (pSrc)
1410 {
1411 pszSrcW = Imm32WideFromAnsi(pImeDpi->uCodePage, pSrc);
1412 if (IS_NULL_UNEXPECTEDLY(pszSrcW))
1413 goto Quit;
1414 }
1415
1416 cb = pImeDpi->ImeConversionList(hIMC, pszSrcW, NULL, 0, uFlag);
1418 goto Quit;
1419
1420 pCL = ImmLocalAlloc(0, cb);
1421 if (IS_NULL_UNEXPECTEDLY(pCL))
1422 goto Quit;
1423
1424 cb = pImeDpi->ImeConversionList(hIMC, pszSrcW, pCL, cb, uFlag);
1426 goto Quit;
1427
1428 ret = CandidateListWideToAnsi(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
1429
1430Quit:
1431 ImmLocalFree(pszSrcW);
1432 ImmLocalFree(pCL);
1433 ImmUnlockImeDpi(pImeDpi);
1434 TRACE("ret: 0x%X\n", ret);
1435 return ret;
1436}
1437
1438/***********************************************************************
1439 * ImmGetConversionListW (IMM32.@)
1440 */
1443 _In_ HKL hKL,
1444 _In_ HIMC hIMC,
1445 _In_ LPCWSTR pSrc,
1446 _Out_writes_bytes_(dwBufLen) LPCANDIDATELIST lpDst,
1447 _In_ DWORD dwBufLen,
1448 _In_ UINT uFlag)
1449{
1450 DWORD ret = 0;
1451 INT cb;
1452 PIMEDPI pImeDpi;
1453 LPCANDIDATELIST pCL = NULL;
1454 LPSTR pszSrcA = NULL;
1455
1456 TRACE("(%p, %p, %s, %p, %lu, 0x%lX)\n", hKL, hIMC, debugstr_w(pSrc), lpDst, dwBufLen, uFlag);
1457
1458 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
1459 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1460 return 0;
1461
1462 if (ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
1463 {
1464 ret = pImeDpi->ImeConversionList(hIMC, pSrc, lpDst, dwBufLen, uFlag);
1465 ImmUnlockImeDpi(pImeDpi);
1466 return ret;
1467 }
1468
1469 if (pSrc)
1470 {
1471 pszSrcA = Imm32AnsiFromWide(pImeDpi->uCodePage, pSrc);
1472 if (IS_NULL_UNEXPECTEDLY(pszSrcA))
1473 goto Quit;
1474 }
1475
1476 cb = pImeDpi->ImeConversionList(hIMC, pszSrcA, NULL, 0, uFlag);
1478 goto Quit;
1479
1480 pCL = ImmLocalAlloc(0, cb);
1481 if (IS_NULL_UNEXPECTEDLY(pCL))
1482 goto Quit;
1483
1484 cb = pImeDpi->ImeConversionList(hIMC, pszSrcA, pCL, cb, uFlag);
1486 goto Quit;
1487
1488 ret = CandidateListAnsiToWide(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
1489
1490Quit:
1491 ImmLocalFree(pszSrcA);
1492 ImmLocalFree(pCL);
1493 ImmUnlockImeDpi(pImeDpi);
1494 TRACE("ret: 0x%X\n", ret);
1495 return ret;
1496}
1497
1498/***********************************************************************
1499 * ImmGetConversionStatus (IMM32.@)
1500 */
1503 _In_ HIMC hIMC,
1504 _Out_opt_ LPDWORD lpfdwConversion,
1505 _Out_opt_ LPDWORD lpfdwSentence)
1506{
1507 LPINPUTCONTEXT pIC;
1508
1509 TRACE("(%p %p %p)\n", hIMC, lpfdwConversion, lpfdwSentence);
1510
1511 pIC = ImmLockIMC(hIMC);
1512 if (IS_NULL_UNEXPECTEDLY(pIC))
1513 return FALSE;
1514
1515 if (lpfdwConversion)
1516 {
1517 *lpfdwConversion = pIC->fdwConversion;
1518 TRACE("0x%X\n", *lpfdwConversion);
1519 }
1520
1521 if (lpfdwSentence)
1522 {
1523 *lpfdwSentence = pIC->fdwSentence;
1524 TRACE("0x%X\n", *lpfdwSentence);
1525 }
1526
1527 ImmUnlockIMC(hIMC);
1528 return TRUE;
1529}
1530
1531/***********************************************************************
1532 * ImmSetConversionStatus (IMM32.@)
1533 */
1536 _In_ HIMC hIMC,
1537 _In_ DWORD fdwConversion,
1538 _In_ DWORD fdwSentence)
1539{
1540 HKL hKL;
1541 LPINPUTCONTEXT pIC;
1542 DWORD dwOldConversion = fdwConversion, dwOldSentence = fdwSentence;
1543 BOOL fOpen = FALSE, fConversionChange = FALSE, fSentenceChange = FALSE, fUseCicero = FALSE;
1544 HWND hWnd;
1545
1546 TRACE("(%p, 0x%lX, 0x%lX)\n", hIMC, fdwConversion, fdwSentence);
1547
1548 hKL = GetKeyboardLayout(0);
1550 fUseCicero = TRUE;
1551
1552 if (IS_CROSS_THREAD_HIMC(hIMC))
1553 return FALSE;
1554
1555 pIC = ImmLockIMC(hIMC);
1556 if (IS_NULL_UNEXPECTEDLY(pIC))
1557 return FALSE;
1558
1559 if (pIC->fdwConversion != fdwConversion)
1560 {
1561 dwOldConversion = pIC->fdwConversion;
1562 pIC->fdwConversion = fdwConversion;
1563 fConversionChange = TRUE;
1564 }
1565
1566 if (pIC->fdwSentence != fdwSentence)
1567 {
1568 dwOldSentence = pIC->fdwSentence;
1569 pIC->fdwSentence = fdwSentence;
1570 fSentenceChange = TRUE;
1571 }
1572
1573 hWnd = pIC->hWnd;
1574 fOpen = pIC->fOpen;
1575 ImmUnlockIMC(hIMC);
1576
1577 if (fConversionChange || fUseCicero)
1578 {
1579 Imm32MakeIMENotify(hIMC, hWnd, NI_CONTEXTUPDATED, dwOldConversion,
1581 if (fConversionChange)
1582 NtUserNotifyIMEStatus(hWnd, fOpen, fdwConversion);
1583 }
1584
1585 if (fSentenceChange || fUseCicero)
1586 {
1587 Imm32MakeIMENotify(hIMC, hWnd, NI_CONTEXTUPDATED, dwOldSentence,
1589 }
1590
1591 return TRUE;
1592}
1593
1594/***********************************************************************
1595 * ImmConfigureIMEA (IMM32.@)
1596 */
1599 _In_ HKL hKL,
1600 _In_ HWND hWnd,
1601 _In_ DWORD dwMode,
1602 _Inout_opt_ LPVOID lpData)
1603{
1604 BOOL ret = FALSE;
1605 PIMEDPI pImeDpi;
1606 REGISTERWORDW RegWordW;
1607 LPREGISTERWORDA pRegWordA;
1608
1609 TRACE("(%p, %p, 0x%lX, %p)\n", hKL, hWnd, dwMode, lpData);
1610
1612 return FALSE;
1613
1614 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
1615 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1616 return FALSE;
1617
1618 RtlZeroMemory(&RegWordW, sizeof(RegWordW));
1619
1620 if (!ImeDpi_IsUnicode(pImeDpi) || !lpData || dwMode != IME_CONFIG_REGISTERWORD)
1621 goto DoIt; /* No conversion needed */
1622
1623 pRegWordA = lpData;
1624
1625 if (pRegWordA->lpReading)
1626 {
1627 RegWordW.lpReading = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpReading);
1628 if (IS_NULL_UNEXPECTEDLY(RegWordW.lpReading))
1629 goto Quit;
1630 }
1631
1632 if (pRegWordA->lpWord)
1633 {
1634 RegWordW.lpWord = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpWord);
1635 if (IS_NULL_UNEXPECTEDLY(RegWordW.lpWord))
1636 goto Quit;
1637 }
1638
1639 lpData = &RegWordW;
1640
1641DoIt:
1642 SendMessageW(hWnd, WM_IME_SYSTEM, 0x1B, 0);
1643 ret = pImeDpi->ImeConfigure(hKL, hWnd, dwMode, lpData);
1644 SendMessageW(hWnd, WM_IME_SYSTEM, 0x1A, 0);
1645
1646Quit:
1647 ImmLocalFree(RegWordW.lpReading);
1648 ImmLocalFree(RegWordW.lpWord);
1649 ImmUnlockImeDpi(pImeDpi);
1650 TRACE("ret: %d\n", ret);
1651 return ret;
1652}
1653
1654/***********************************************************************
1655 * ImmConfigureIMEW (IMM32.@)
1656 */
1659 _In_ HKL hKL,
1660 _In_ HWND hWnd,
1661 _In_ DWORD dwMode,
1662 _Inout_opt_ LPVOID lpData)
1663{
1664 BOOL ret = FALSE;
1665 PIMEDPI pImeDpi;
1666 REGISTERWORDA RegWordA;
1667 LPREGISTERWORDW pRegWordW;
1668
1669 TRACE("(%p, %p, 0x%lX, %p)\n", hKL, hWnd, dwMode, lpData);
1670
1672 return FALSE;
1673
1674 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
1675 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1676 return FALSE;
1677
1678 RtlZeroMemory(&RegWordA, sizeof(RegWordA));
1679
1680 if (ImeDpi_IsUnicode(pImeDpi) || !lpData || dwMode != IME_CONFIG_REGISTERWORD)
1681 goto DoIt; /* No conversion needed */
1682
1683 pRegWordW = lpData;
1684
1685 if (pRegWordW->lpReading)
1686 {
1687 RegWordA.lpReading = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpReading);
1688 if (IS_NULL_UNEXPECTEDLY(RegWordA.lpReading))
1689 goto Quit;
1690 }
1691
1692 if (pRegWordW->lpWord)
1693 {
1694 RegWordA.lpWord = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpWord);
1695 if (IS_NULL_UNEXPECTEDLY(RegWordA.lpWord))
1696 goto Quit;
1697 }
1698
1699 lpData = &RegWordA;
1700
1701DoIt:
1702 SendMessageW(hWnd, WM_IME_SYSTEM, 0x1B, 0);
1703 ret = pImeDpi->ImeConfigure(hKL, hWnd, dwMode, lpData);
1704 SendMessageW(hWnd, WM_IME_SYSTEM, 0x1A, 0);
1705
1706Quit:
1707 ImmLocalFree(RegWordA.lpReading);
1708 ImmLocalFree(RegWordA.lpWord);
1709 ImmUnlockImeDpi(pImeDpi);
1710 TRACE("ret: %d\n", ret);
1711 return ret;
1712}
1713
1714/***********************************************************************
1715 * ImmWINNLSEnableIME (IMM32.@)
1716 */
1721{
1722 HIMC hIMC;
1723 PCLIENTIMC pClientImc;
1724 HWND hImeWnd;
1725 BOOL bImeWnd, ret;
1726
1727 TRACE("(%p, %d)\n", hWnd, enable);
1728
1730 {
1732 return FALSE;
1733 }
1734
1736 if (IS_NULL_UNEXPECTEDLY(hIMC))
1737 return FALSE;
1738
1739 pClientImc = ImmLockClientImc(hIMC);
1740 if (IS_NULL_UNEXPECTEDLY(pClientImc))
1741 return FALSE;
1742
1743 ret = !(pClientImc->dwFlags & CLIENTIMC_DISABLEIME);
1744 if (!!enable == ret)
1745 {
1746 TRACE("Same\n");
1747 ImmUnlockClientImc(pClientImc);
1748 return ret;
1749 }
1750
1751 if (!IsWindow(hWnd))
1752 hWnd = GetFocus();
1753
1754 hImeWnd = ImmGetDefaultIMEWnd(hWnd);
1755 bImeWnd = IsWindow(hImeWnd);
1756 if (bImeWnd)
1758
1759 if (enable)
1760 pClientImc->dwFlags &= ~CLIENTIMC_DISABLEIME;
1761 else
1762 pClientImc->dwFlags |= CLIENTIMC_DISABLEIME;
1763
1764 ImmUnlockClientImc(pClientImc);
1765
1766 if (bImeWnd)
1767 ImmSetActiveContext(hWnd, (enable ? hIMC : NULL), TRUE);
1768
1769 return ret;
1770}
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
DWORD CandidateListAnsiToWide(const CANDIDATELIST *pAnsiCL, LPCANDIDATELIST pWideCL, DWORD dwBufLen, UINT uCodePage)
Definition: candidate.c:84
DWORD CandidateListWideToAnsi(const CANDIDATELIST *pWideCL, LPCANDIDATELIST pAnsiCL, DWORD dwBufLen, UINT uCodePage)
Definition: candidate.c:15
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 ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
int(* FARPROC)()
Definition: compat.h:36
#define CP_ACP
Definition: compat.h:109
#define SetLastError(x)
Definition: compat.h:752
#define FreeLibrary(x)
Definition: compat.h:748
#define MAX_PATH
Definition: compat.h:34
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define LoadLibraryW(x)
Definition: compat.h:747
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
UINT WINAPI GetACP(void)
Definition: locale.c:2023
LCID WINAPI GetSystemDefaultLCID(void)
Definition: locale.c:1235
LCID lcid
Definition: locale.c:5656
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
return ret
Definition: mutex.c:146
#define UlongToPtr(u)
Definition: config.h:106
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
GLboolean enable
Definition: glext.h:11120
#define WM_IME_REPORT
Definition: ime.h:122
#define IR_CHANGECONVERT
Definition: ime.h:127
BOOL WINAPI ImmGetConversionStatus(_In_ HIMC hIMC, _Out_opt_ LPDWORD lpfdwConversion, _Out_opt_ LPDWORD lpfdwSentence)
Definition: ime.c:1502
LRESULT WINAPI ImmEscapeA(_In_ HKL hKL, _In_ HIMC hIMC, _In_ UINT uSubFunc, _Inout_opt_ LPVOID lpData)
Definition: ime.c:821
#define VALID_IME_PROP
BOOL WINAPI ImmSetConversionStatus(_In_ HIMC hIMC, _In_ DWORD fdwConversion, _In_ DWORD fdwSentence)
Definition: ime.c:1535
BOOL WINAPI ImmDisableIME(_In_ DWORD dwThreadId)
Definition: ime.c:632
static BOOL Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
Definition: ime.c:196
static LRESULT ImeDpi_Escape(PIMEDPI pImeDpi, HIMC hIMC, UINT uSubFunc, LPVOID lpData, HKL hKL)
Definition: ime.c:368
#define VALID_SELECT_CAPS
DWORD WINAPI ImmGetConversionListW(_In_ HKL hKL, _In_ HIMC hIMC, _In_ LPCWSTR pSrc, _Out_writes_bytes_(dwBufLen) LPCANDIDATELIST lpDst, _In_ DWORD dwBufLen, _In_ UINT uFlag)
Definition: ime.c:1442
BOOL WINAPI ImmSetCompositionFontA(_In_ HIMC hIMC, _In_ LPLOGFONTA lplf)
Definition: ime.c:1264
BOOL WINAPI ImmLoadIME(_In_ HKL hKL)
Definition: ime.c:612
RTL_CRITICAL_SECTION gcsImeDpi
Definition: ime.c:17
UINT WINAPI ImmGetIMEFileNameW(_In_ HKL hKL, _Out_writes_opt_(uBufLen) LPWSTR lpszFileName, _In_ UINT uBufLen)
Definition: ime.c:733
BOOL WINAPI ImmSetCompositionWindow(_In_ HIMC hIMC, _In_ LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1150
PIMEDPI gpImeDpiList
Definition: ime.c:18
#define VALID_SCS_CAPS
UINT WINAPI ImmGetDescriptionW(_In_ HKL hKL, _Out_writes_opt_(uBufLen) LPWSTR lpszDescription, _In_ UINT uBufLen)
Definition: ime.c:669
BOOL WINAPI ImmGetCompositionFontA(_In_ HIMC hIMC, _Out_ LPLOGFONTA lplf)
Definition: ime.c:1185
BOOL WINAPI ImmGetCompositionFontW(_In_ HIMC hIMC, _Out_ LPLOGFONTW lplf)
Definition: ime.c:1224
static PIMEDPI Imm32LoadImeDpi(HKL hKL, BOOL bLock)
Definition: ime.c:282
#define CHECK_IME_FN(name)
PIMEDPI Imm32FindImeDpi(HKL hKL)
Definition: ime.c:20
BOOL WINAPI ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
Definition: ime.c:492
LRESULT WINAPI ImmEscapeW(_In_ HKL hKL, _In_ HIMC hIMC, _In_ UINT uSubFunc, _Inout_opt_ LPVOID lpData)
Definition: ime.c:914
UINT WINAPI ImmGetIMEFileNameA(_In_ HKL hKL, _Out_writes_opt_(uBufLen) LPSTR lpszFileName, _In_ UINT uBufLen)
Definition: ime.c:696
BOOL Imm32ReleaseIME(_In_ HKL hKL)
Definition: ime.c:379
BOOL WINAPI ImmSetStatusWindowPos(_In_ HIMC hIMC, _In_ LPPOINT lpptPos)
Definition: ime.c:1092
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
Definition: ime.c:532
DWORD WINAPI ImmGetProperty(_In_ HKL hKL, _In_ DWORD fdwIndex)
Definition: ime.c:768
BOOL WINAPI ImmGetOpenStatus(_In_ HIMC hIMC)
Definition: ime.c:997
BOOL WINAPI ImmSetCompositionFontW(_In_ HIMC hIMC, _In_ LPLOGFONTW lplf)
Definition: ime.c:1323
BOOL WINAPI ImmConfigureIMEA(_In_ HKL hKL, _In_ HWND hWnd, _In_ DWORD dwMode, _Inout_opt_ LPVOID lpData)
Definition: ime.c:1598
DWORD WINAPI ImmGetConversionListA(_In_ HKL hKL, _In_ HIMC hIMC, _In_ LPCSTR pSrc, _Out_writes_bytes_(dwBufLen) LPCANDIDATELIST lpDst, _In_ DWORD dwBufLen, _In_ UINT uFlag)
Definition: ime.c:1382
#define VALID_SMODE_CAPS
VOID Imm32FreeIME(PIMEDPI pImeDpi, BOOL bDestroy)
Definition: ime.c:35
HWND WINAPI ImmGetDefaultIMEWnd(_In_opt_ HWND hWnd)
Definition: ime.c:441
PIMEDPI Imm32FindOrLoadImeDpi(HKL hKL)
Definition: ime.c:351
#define VALID_UI_CAPS
BOOL WINAPI ImmGetStatusWindowPos(_In_ HIMC hIMC, _Out_ LPPOINT lpptPos)
Definition: ime.c:1067
BOOL WINAPI ImmConfigureIMEW(_In_ HKL hKL, _In_ HWND hWnd, _In_ DWORD dwMode, _Inout_opt_ LPVOID lpData)
Definition: ime.c:1658
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
Definition: ime.c:562
BOOL WINAPI ImmIsIME(_In_ HKL hKL)
Definition: ime.c:430
UINT WINAPI ImmGetDescriptionA(_In_ HKL hKL, _Out_writes_opt_(uBufLen) LPSTR lpszDescription, _In_ UINT uBufLen)
Definition: ime.c:641
BOOL WINAPI ImmWINNLSEnableIME(_In_opt_ HWND hWnd, _In_ BOOL enable)
Definition: ime.c:1718
BOOL Imm32InquireIme(PIMEDPI pImeDpi)
Definition: ime.c:45
#define VALID_CMODE_CAPS
BOOL WINAPI ImmGetCompositionWindow(_In_ HIMC hIMC, _Out_ LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1123
BOOL WINAPI ImmSetOpenStatus(_In_ HIMC hIMC, _In_ BOOL fOpen)
Definition: ime.c:1021
BOOL WINAPI ImmNotifyIME(_In_ HIMC hIMC, _In_ DWORD dwAction, _In_ DWORD dwIndex, _In_ DWORD_PTR dwValue)
Definition: ime.c:459
#define IMEDPI_FLAG_LOCKED
Definition: imm32_undoc.h:153
#define _IME_UI_HIDDEN
Definition: imm32_undoc.h:214
PCLIENTIMC WINAPI ImmLockClientImc(_In_ HIMC hImc)
Definition: imm.c:955
#define CLIENTIMC_DISABLEIME
Definition: imm32_undoc.h:186
struct INPUTCONTEXTDX * LPINPUTCONTEXTDX
#define IS_IME_HKL(hKL)
Definition: imm32_undoc.h:21
BOOL WINAPI CtfImmIsTextFrameServiceDisabled(VOID)
Definition: ctf.c:1079
#define WM_IME_SYSTEM
Definition: imm32_undoc.h:32
IMEINFOEXCLASS
Definition: imm32_undoc.h:92
@ ImeInfoExImeFileName
Definition: imm32_undoc.h:96
@ ImeInfoExKeyboardLayoutTFS
Definition: imm32_undoc.h:94
@ ImeInfoExKeyboardLayout
Definition: imm32_undoc.h:93
BOOL WINAPI ImmSetActiveContext(_In_ HWND hwnd, _In_opt_ HIMC hIMC, _In_ BOOL fFlag)
Definition: imm.c:1165
#define _IME_UI_NO_COMPFORM
Definition: imm32_undoc.h:216
VOID WINAPI ImmUnlockClientImc(_Inout_ PCLIENTIMC pClientImc)
Definition: imm.c:1002
#define CLIENTIMC_WIDE
Definition: imm32_undoc.h:183
#define IMEDPI_FLAG_UNLOADED
Definition: imm32_undoc.h:152
#define IME_ESC_SET_EUDC_DICTIONARY
Definition: imm.h:417
#define IMN_SETSTATUSWINDOWPOS
Definition: imm.h:383
#define IME_PROP_UNICODE
Definition: imm.h:249
#define IME_CONFIG_REGISTERWORD
Definition: imm.h:406
#define IGP_SELECT
Definition: imm.h:305
#define IMN_SETCOMPOSITIONFONT
Definition: imm.h:381
#define CFS_DEFAULT
Definition: imm.h:323
#define IMC_SETSTATUSWINDOWPOS
Definition: imm.h:155
#define IGP_SETCOMPSTR
Definition: imm.h:304
#define IMN_SETSENTENCEMODE
Definition: imm.h:378
#define IGP_GETIMEVERSION
Definition: imm.h:299
#define IMC_SETCOMPOSITIONWINDOW
Definition: imm.h:153
#define IGP_PROPERTY
Definition: imm.h:300
#define IME_ESC_HANJA_MODE
Definition: imm.h:421
#define IME_ESC_GETHELPFILENAME
Definition: imm.h:424
#define IGP_SENTENCE
Definition: imm.h:302
#define IMN_SETCOMPOSITIONWINDOW
Definition: imm.h:382
#define IGP_CONVERSION
Definition: imm.h:301
#define IME_ESC_GET_EUDC_DICTIONARY
Definition: imm.h:416
#define IME_ESC_IME_NAME
Definition: imm.h:419
#define IME_ESC_SEQUENCE_TO_INTERNAL
Definition: imm.h:415
#define IGP_UI
Definition: imm.h:303
#define IMC_SETCOMPOSITIONFONT
Definition: imm.h:151
#define IMN_SETOPENSTATUS
Definition: imm.h:379
#define IMN_SETCONVERSIONMODE
Definition: imm.h:377
#define IMC_SETOPENSTATUS
Definition: immdev.h:354
#define IME_SYSINFO_WINLOGON
Definition: immdev.h:369
#define IMC_SETCONVERSIONMODE
Definition: immdev.h:352
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
Definition: imm.c:1080
#define IMC_SETSENTENCEMODE
Definition: immdev.h:353
#define INIT_LOGFONT
Definition: immdev.h:154
#define NI_CONTEXTUPDATED
Definition: immdev.h:357
#define IME_SYSINFO_WOW16
Definition: immdev.h:370
#define INIT_COMPFORM
Definition: immdev.h:155
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
Definition: imm.c:1090
#define IME_PROP_END_UNLOAD
Definition: immdev.h:344
#define INIT_STATUSWNDPOS
Definition: immdev.h:151
#define IS_CICERO_COMPAT_DISABLED()
Definition: ntuser.h:1215
DWORD NTAPI NtUserNotifyIMEStatus(_In_ HWND hwnd, _In_ BOOL fOpen, _In_ DWORD dwConversion)
Definition: ime.c:850
BOOL NTAPI NtUserDisableThreadIme(_In_ DWORD dwThreadID)
Definition: ime.c:905
BOOL NTAPI NtUserGetImeInfoEx(_Inout_ PIMEINFOEX pImeInfoEx, _In_ IMEINFOEXCLASS SearchType)
Definition: ime.c:1069
@ THREADSTATE_DEFAULTIMEWINDOW
Definition: ntuser.h:2492
@ THREADSTATE_DEFAULTINPUTCONTEXT
Definition: ntuser.h:2493
@ THREADSTATE_ISWINLOGON
Definition: ntuser.h:2504
BOOL NTAPI NtUserSetImeInfoEx(_In_ const IMEINFOEX *pImeInfoEx)
Definition: ime.c:1210
#define IS_IMM_MODE()
Definition: ntuser.h:1212
#define TIF_16BIT
Definition: ntuser.h:264
#define IS_16BIT_MODE()
Definition: ntuser.h:1214
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
Definition: window.c:4210
#define IS_CICERO_MODE()
Definition: ntuser.h:1213
#define GetWin32ClientInfo()
Definition: ntuser.h:352
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
Definition: misc.c:240
#define QUERY_WINDOW_DEFAULT_IME
Definition: ntuser.h:2854
#define S_OK
Definition: intsafe.h:52
#define C_ASSERT(e)
Definition: intsafe.h:73
#define LOBYTE(W)
Definition: jmemdos.c:487
#define HIBYTE(W)
Definition: jmemdos.c:486
const WCHAR * word
Definition: lex.c:36
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
USHORT LANGID
Definition: mui.h:9
LONG_PTR LRESULT
Definition: minwindef.h:176
LPCWSTR szPath
Definition: env.c:37
UINT_PTR HKL
Definition: msctf.idl:125
EXTERN_C HRESULT WINAPI CtfImeInquireExW(_Out_ LPIMEINFO lpIMEInfo, _Out_ LPWSTR lpszWndClass, _In_ DWORD dwSystemInfoFlags, _In_ HKL hKL)
Definition: msctfime.cpp:542
EXTERN_C BOOL WINAPI CtfImeIsGuidMapEnable(_In_ HIMC hIMC)
Definition: msctfime.cpp:647
EXTERN_C BOOL WINAPI CtfImeSelectEx(_In_ HIMC hIMC, _In_ BOOL fSelect, _In_ HKL hKL)
Definition: msctfime.cpp:571
EXTERN_C LRESULT WINAPI CtfImeEscapeEx(_In_ HIMC hIMC, _In_ UINT uSubFunc, _Inout_opt_ LPVOID lpData, _In_ HKL hKL)
Definition: msctfime.cpp:596
EXTERN_C HRESULT WINAPI CtfImeGetGuidAtom(_In_ HIMC hIMC, _In_ DWORD dwUnknown, _Out_opt_ LPDWORD pdwGuidAtom)
Definition: msctfime.cpp:620
unsigned int UINT
Definition: ndis.h:50
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define _Out_opt_
Definition: no_sal2.h:214
#define _Out_writes_opt_(s)
Definition: no_sal2.h:226
#define _Inout_opt_
Definition: no_sal2.h:216
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define _Out_writes_bytes_(s)
Definition: no_sal2.h:178
#define DWORD
Definition: nt_native.h:44
#define UNICODE_NULL
#define ANSI_NULL
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
char CHAR
Definition: pedump.c:57
#define LANGIDFROMLCID(l)
Definition: nls.h:18
DWORD LCID
Definition: nls.h:13
#define LANG_JAPANESE
Definition: nls.h:76
#define PRIMARYLANGID(l)
Definition: nls.h:16
@ Failed
Definition: arc.h:88
#define _WIN32_WINNT_NT4
Definition: sdkddkver.h:20
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
STRSAFEAPI StringCchCopyNW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, size_t cchToCopy)
Definition: strsafe.h:236
STRSAFEAPI StringCchLengthW(STRSAFE_LPCWSTR psz, size_t cchMax, size_t *pcchLength)
Definition: strsafe.h:842
IMEINFO ImeInfo
Definition: imm32_undoc.h:108
DWORD dwFlags
Definition: imm32_undoc.h:112
HINSTANCE hInst
Definition: imm32_undoc.h:106
HKL hKL
Definition: imm32_undoc.h:107
struct IMEDPI * pNext
Definition: imm32_undoc.h:105
WCHAR szUIClass[16]
Definition: imm32_undoc.h:110
UINT uCodePage
Definition: imm32_undoc.h:109
DWORD cLockObj
Definition: imm32_undoc.h:111
LPSTR lpReading
Definition: dimm.idl:30
LPSTR lpWord
Definition: dimm.idl:31
LPWSTR lpWord
Definition: dimm.idl:36
LPWSTR lpReading
Definition: dimm.idl:35
DWORD fdwSelectCaps
Definition: immdev.h:27
DWORD fdwSentenceCaps
Definition: immdev.h:24
DWORD fdwConversionCaps
Definition: immdev.h:23
DWORD fdwSCSCaps
Definition: immdev.h:26
DWORD fdwProperty
Definition: immdev.h:22
DWORD dwPrivateDataSize
Definition: immdev.h:21
DWORD fdwUICaps
Definition: immdev.h:25
POINT ptStatusWndPos
Definition: immdev.h:109
COMPOSITIONFORM cfCompForm
Definition: immdev.h:117
DWORD fdwInit
Definition: immdev.h:125
DWORD fdwConversion
Definition: immdev.h:111
LOGFONTA A
Definition: immdev.h:114
DWORD fdwSentence
Definition: immdev.h:112
union _tagINPUTCONTEXT::@2217 lfFont
LOGFONTW W
Definition: immdev.h:115
IMEINFO ImeInfo
Definition: imm32_undoc.h:75
WCHAR wszImeFile[80]
Definition: imm32_undoc.h:83
WCHAR wszUIClass[16]
Definition: imm32_undoc.h:76
DWORD dwImeWinVersion
Definition: imm32_undoc.h:81
LPSTR lpReading
Definition: imm.h:28
LPSTR lpWord
Definition: imm.h:29
LPWSTR lpReading
Definition: imm.h:33
LPWSTR lpWord
Definition: imm.h:34
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define MAKEWORD(a, b)
Definition: typedefs.h:248
uint16_t * LPWSTR
Definition: typedefs.h:56
uint32_t * LPDWORD
Definition: typedefs.h:59
char * LPSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define MAKELONG(a, b)
Definition: typedefs.h:249
#define HIWORD(l)
Definition: typedefs.h:247
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_writes_opt_ NumCharacters PUSHORT _Inout_ PUSHORT _In_ UCHAR _In_opt_ USHORT LangID
Definition: wdfusb.h:1083
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
BOOL Imm32IsCrossThreadAccess(HIMC hIMC)
Definition: utils.c:25
#define IS_ZERO_UNEXPECTEDLY(p)
Definition: precomp.h:68
#define ValidateHwnd(hwnd)
Definition: precomp.h:98
#define ImmLocalFree(lpData)
Definition: precomp.h:102
LPWSTR Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA)
Definition: utils.c:96
#define IS_CROSS_THREAD_HIMC(hIMC)
Definition: precomp.h:73
#define MAX_IMM_FILENAME
Definition: precomp.h:80
BOOL Imm32MakeIMENotify(_In_ HIMC hIMC, _In_ HWND hwnd, _In_ DWORD dwAction, _In_ DWORD dwIndex, _Inout_opt_ DWORD_PTR dwValue, _In_ DWORD dwCommand, _Inout_opt_ DWORD_PTR dwData)
Definition: utils.c:287
VOID LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW)
Definition: utils.c:164
BOOL Imm32GetSystemLibraryPath(LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName)
Definition: utils.c:152
#define IS_NULL_UNEXPECTEDLY(p)
Definition: precomp.h:67
LPSTR Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW)
Definition: utils.c:107
#define IS_CROSS_PROCESS_HWND(hWnd)
Definition: precomp.h:74
BOOL Imm32IsSystemJapaneseOrKorean(VOID)
Definition: utils.c:72
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: utils.c:275
VOID LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA)
Definition: utils.c:176
#define ImeDpi_IsUnicode(pImeDpi)
Definition: precomp.h:117
#define WINAPI
Definition: msvc.h:6
#define TCI_SRCLOCALE
Definition: wingdi.h:964
BOOL WINAPI TranslateCharsetInfo(_Inout_ PDWORD, _Out_ LPCHARSETINFO, _In_ DWORD)
#define MB_PRECOMPOSED
Definition: winnls.h:299
HWND WINAPI GetFocus(void)
Definition: window.c:1863
BOOL WINAPI IsWindow(_In_opt_ HWND)
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetClassInfoW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSW)
BOOL WINAPI PostMessageA(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)