ReactOS 0.4.16-dev-1264-g92ff994
imm.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS user32.dll
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: User32.dll Imm functions
5 * COPYRIGHT: Copyright Dmitry Chapyshev (dmitry@reactos.org)
6 * Copyright Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
7 */
8
9#include <user32.h>
10#include <strsafe.h>
11#include <immdev.h>
12
14
15#define IMM_INIT_MAGIC 0x19650412
16#define MAX_CANDIDATEFORM 4
17
18/* Is != NULL when we have loaded the IMM ourselves */
20
22
24
26{
28
29 for (; hWnd; hWnd = GetParent(hWnd))
30 {
32 if (!(style & WS_CHILD))
33 break;
34 }
35
36 return hWnd;
37}
38
39/* define stub functions */
40#undef DEFINE_IMM_ENTRY
41#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind) \
42 static type WINAPI IMMSTUB_##name params { IMM_RETURN_##retkind((type)retval); }
43#include "immtable.h"
44
46/* initialize by stubs */
47#undef DEFINE_IMM_ENTRY
48#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind) \
49 IMMSTUB_##name,
50#include "immtable.h"
51};
52
58{
60 if (length && length < cchBuffer)
61 {
64 }
65 DWORD dwError = GetLastError();
66 ERR("GetSystemDirectoryW failed (error %lu)\n", dwError);
68 return HRESULT_FROM_WIN32(dwError);
69}
70
71// @unimplemented
73{
74 WCHAR ImmFile[MAX_PATH];
75 HMODULE imm32 = ghImm32;
76
77 /* Check whether the IMM table has already been initialized */
78 if (IMM_FN(ImmWINNLSEnableIME) != IMMSTUB_ImmWINNLSEnableIME)
79 return TRUE;
80
81 User32GetSystemFilePath(ImmFile, _countof(ImmFile), L"imm32.dll");
82 TRACE("File %s\n", debugstr_w(ImmFile));
83
84 /* If IMM32 is already loaded, use it without increasing reference count. */
85 if (imm32 == NULL)
86 imm32 = GetModuleHandleW(ImmFile);
87
88 /*
89 * Loading imm32.dll will call imm32!DllMain function.
90 * imm32!DllMain calls User32InitializeImmEntryTable.
91 * Thus, if imm32.dll was loaded, the table has been loaded.
92 */
93 if (imm32 == NULL)
94 {
95 imm32 = ghImm32 = LoadLibraryW(ImmFile);
96 if (imm32 == NULL)
97 {
98 ERR("Did not load imm32.dll!\n");
99 return FALSE;
100 }
101 return TRUE;
102 }
103
104/* load imm procedures */
105#undef DEFINE_IMM_ENTRY
106#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind) \
107 do { \
108 FN_##name proc = (FN_##name)GetProcAddress(imm32, #name); \
109 if (!proc) { \
110 ERR("Could not load %s\n", #name); \
111 return FALSE; \
112 } \
113 IMM_FN(name) = proc; \
114 } while (0);
115#include "immtable.h"
116
117 return TRUE;
118}
119
121{
124}
125
127{
128 TRACE("Imm (%x)\n", magic);
129
130 if (magic != IMM_INIT_MAGIC)
131 return FALSE;
132
133 /* Check whether the IMM table has already been initialized */
134 if (IMM_FN(ImmWINNLSEnableIME) != IMMSTUB_ImmWINNLSEnableIME)
135 return TRUE;
136
138
139 if (ghImm32 == NULL && !gbImmInitializing)
140 {
141 WCHAR ImmFile[MAX_PATH];
142 User32GetSystemFilePath(ImmFile, _countof(ImmFile), L"imm32.dll");
143 ghImm32 = LoadLibraryW(ImmFile);
144 if (ghImm32 == NULL)
145 {
146 ERR("Did not load imm32.dll!\n");
147 return FALSE;
148 }
149 }
150
152}
153
155{
157 return pIMC && (!pIMC->hImeWnd || pIMC->hImeWnd == hImeWnd || !ValidateHwnd(pIMC->hImeWnd));
158}
159
161{
163}
164
165/* Sends a message to the IME UI window. */
166static LRESULT
168{
169 LRESULT ret = 0;
170 HWND hwndUI = pimeui->hwndUI;
171 PWND pwnd, pwndUI;
172
173 ASSERT(pimeui->spwnd != NULL);
174
175 pwnd = pimeui->spwnd;
176 pwndUI = ValidateHwnd(hwndUI);
177 if (!pwnd || (pwnd->state & WNDS_DESTROYED) || (pwnd->state2 & WNDS2_INDESTROY) ||
178 !pwndUI || (pwndUI->state & WNDS_DESTROYED) || (pwndUI->state2 & WNDS2_INDESTROY))
179 {
180 return 0;
181 }
182
184
185 if (unicode)
186 ret = SendMessageW(hwndUI, uMsg, wParam, lParam);
187 else
188 ret = SendMessageA(hwndUI, uMsg, wParam, lParam);
189
191
192 return ret;
193}
194
195static VOID User32NotifyOpenStatus(PIMEUI pimeui, HWND hwndIMC, BOOL bOpen)
196{
198
199 ASSERT(pimeui->spwnd != NULL);
200
201 pimeui->fShowStatus = bOpen;
202
203 if (LOWORD(GetWin32ClientInfo()->dwExpWinVer) >= 0x400)
204 SendMessageW(hwndIMC, WM_IME_NOTIFY, wParam, 0);
205 else
207}
208
210{
212 if (!pIMC || pIMC->hImeWnd == hImeWnd)
213 return;
214
216}
217
218static VOID User32UpdateImcOfImeUI(PIMEUI pimeui, HIMC hNewIMC)
219{
220 HWND hImeWnd;
221 HIMC hOldIMC = pimeui->hIMC;
222
223 ASSERT(pimeui->spwnd != NULL);
224 hImeWnd = UserHMGetHandle(pimeui->spwnd);
225
226 if (hNewIMC == hOldIMC)
227 return;
228
229 if (hOldIMC)
231
232 pimeui->hIMC = hNewIMC;
233
234 if (hNewIMC)
235 User32SetImeWindowOfImc(hNewIMC, hImeWnd);
236}
237
238/* Handles WM_IME_NOTIFY message of the default IME window. */
240{
241 LRESULT ret = 0;
242 HIMC hIMC;
243 LPINPUTCONTEXT pIC;
244 HWND hwndUI, hwndIMC, hImeWnd, hwndOwner;
245
246 ASSERT(pimeui->spwnd != NULL);
247
248 switch (wParam)
249 {
252 hIMC = pimeui->hIMC;
253 pIC = IMM_FN(ImmLockIMC)(hIMC);
254 if (pIC)
255 {
256 hwndIMC = pimeui->hwndIMC;
257 if (IsWindow(hwndIMC))
258 {
259 NtUserNotifyIMEStatus(hwndIMC, pIC->fOpen, pIC->fdwConversion);
260 }
261 else if (gfConIme == TRUE && pimeui->spwnd)
262 {
263 hImeWnd = UserHMGetHandle(pimeui->spwnd);
264 hwndOwner = GetWindow(hImeWnd, GW_OWNER);
265 if (hwndOwner)
266 {
267 NtUserNotifyIMEStatus(hwndOwner, pIC->fOpen, pIC->fdwConversion);
268 }
269 }
270
271 IMM_FN(ImmUnlockIMC)(hIMC);
272 }
273 /* FALL THROUGH */
274 default:
276 break;
277
278 case IMN_PRIVATE:
279 hwndUI = pimeui->hwndUI;
280 if (IsWindow(hwndUI))
282 break;
283 }
284
285 return ret;
286}
287
288/* Creates the IME UI window. */
290{
291 IMEINFOEX ImeInfoEx;
292 PIMEDPI pImeDpi;
293 WNDCLASSW wc;
294 HWND hwndUI = NULL;
295 CHAR szUIClass[32];
296 PWND pwnd = pimeui->spwnd;
297
298 ASSERT(pimeui->spwnd != NULL);
299
300 if (!pwnd || !IMM_FN(ImmGetImeInfoEx)(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
301 return NULL;
302
303 pImeDpi = IMM_FN(ImmLockImeDpi)(hKL);
304 if (!pImeDpi)
305 return NULL;
306
307 if (!GetClassInfoW(pImeDpi->hInst, ImeInfoEx.wszUIClass, &wc))
308 goto Quit;
309
310 if (ImeInfoEx.ImeInfo.fdwProperty & IME_PROP_UNICODE)
311 {
312 hwndUI = CreateWindowW(ImeInfoEx.wszUIClass, ImeInfoEx.wszUIClass, WS_POPUP | WS_DISABLED,
313 0, 0, 0, 0, UserHMGetHandle(pwnd), 0, wc.hInstance, NULL);
314 }
315 else
316 {
317 WideCharToMultiByte(CP_ACP, 0, ImeInfoEx.wszUIClass, -1,
318 szUIClass, _countof(szUIClass), NULL, NULL);
319 szUIClass[_countof(szUIClass) - 1] = 0;
320
321 hwndUI = CreateWindowA(szUIClass, szUIClass, WS_POPUP | WS_DISABLED,
322 0, 0, 0, 0, UserHMGetHandle(pwnd), 0, wc.hInstance, NULL);
323 }
324
325 if (hwndUI)
327
328Quit:
329 IMM_FN(ImmUnlockImeDpi)(pImeDpi);
330 return hwndUI;
331}
332
333/* Initializes the default IME window. */
335{
336 PWND pParentWnd, pWnd = pimeui->spwnd;
337 HIMC hIMC = NULL;
338
339 if (!pWnd || (pWnd->style & (WS_DISABLED | WS_POPUP)) != (WS_DISABLED | WS_POPUP))
340 return -1;
341
342 pParentWnd = ValidateHwnd(lpCS->hwndParent);
343 if (pParentWnd)
344 {
345 hIMC = pParentWnd->hImc;
346 if (hIMC && !User32CanSetImeWindowToImc(hIMC, UserHMGetHandle(pWnd)))
347 hIMC = NULL;
348 }
349
350 User32UpdateImcOfImeUI(pimeui, hIMC);
351
352 pimeui->fShowStatus = FALSE;
353 pimeui->nCntInIMEProc = 0;
354 pimeui->fActivate = FALSE;
355 pimeui->fDestroy = FALSE;
356 pimeui->hwndIMC = NULL;
357 pimeui->hKL = GetWin32ClientInfo()->hKL;
358 pimeui->fCtrlShowStatus = TRUE;
359 pimeui->dwLastStatus = 0;
360
361 return 0;
362}
363
364/* Destroys the IME UI window. */
366{
367 HWND hwndUI = pimeui->hwndUI;
368
369 if (IsWindow(hwndUI))
370 {
371 pimeui->fDestroy = TRUE;
372 NtUserDestroyWindow(hwndUI);
373 }
374
375 pimeui->fShowStatus = pimeui->fDestroy = FALSE;
376 pimeui->hwndUI = NULL;
377}
378
379/* Handles WM_IME_SELECT message of the default IME window. */
381{
382 HKL hKL;
383 HWND hwndUI, hwndIMC = pimeui->hwndIMC;
384
385 if (wParam)
386 {
387 pimeui->hKL = hKL = (HKL)lParam;
388
389 if (!pimeui->fActivate)
390 return;
391
392 pimeui->hwndUI = hwndUI = User32CreateImeUIWindow(pimeui, hKL);
393 if (hwndUI)
395
397 {
398 if (!pimeui->fShowStatus && pimeui->fActivate && IsWindow(hwndIMC))
399 User32NotifyOpenStatus(pimeui, hwndIMC, TRUE);
400 }
401 }
402 else
403 {
404 if (pimeui->fShowStatus && pimeui->fActivate && IsWindow(hwndIMC))
405 User32NotifyOpenStatus(pimeui, hwndIMC, FALSE);
406
409 pimeui->hKL = NULL;
410 }
411}
412
413/* Handles WM_IME_CONTROL message of the default IME window. */
414static LRESULT
416{
417 HIMC hIMC = pimeui->hIMC;
418 DWORD dwConversion, dwSentence;
419 POINT pt;
420
421 if (IS_CICERO_MODE())
422 {
424 {
426 pimeui->dwLastStatus = 0;
427 }
428 else if (wParam == IMC_CLOSESTATUSWINDOW)
429 {
431 }
432 }
433
434 if (!hIMC)
435 return 0;
436
437 switch (wParam)
438 {
440 if (!IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence))
441 return 1;
442 return dwConversion;
443
445 if (!IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence))
446 return 1;
447 return dwSentence;
448
450 return IMM_FN(ImmGetOpenStatus)(hIMC);
451
453 if (!IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence) ||
454 !IMM_FN(ImmSetConversionStatus)(hIMC, (DWORD)lParam, dwSentence))
455 {
456 return 1;
457 }
458 break;
459
461 if (!IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence) ||
462 !IMM_FN(ImmSetConversionStatus)(hIMC, dwConversion, (DWORD)lParam))
463 {
464 return 1;
465 }
466 break;
467
469 if (!IMM_FN(ImmSetOpenStatus)(hIMC, (BOOL)lParam))
470 return 1;
471 break;
472
478 return User32SendImeUIMessage(pimeui, WM_IME_CONTROL, wParam, lParam, unicode);
479
482 return 1;
483 break;
484
486 if (unicode)
487 {
489 return 1;
490 }
491 else
492 {
494 return 1;
495 }
496 break;
497
499 if (unicode)
500 {
502 return 1;
503 }
504 else
505 {
507 return 1;
508 }
509 break;
510
513 return 1;
514 break;
515
519 if (!IMM_FN(ImmSetStatusWindowPos)(hIMC, &pt))
520 return 1;
521 break;
522
524 if (pimeui->fShowStatus && User32GetImeShowStatus())
525 {
526 pimeui->fShowStatus = FALSE;
528 }
529 pimeui->fCtrlShowStatus = FALSE;
530 break;
531
533 if (!pimeui->fShowStatus && User32GetImeShowStatus())
534 {
535 pimeui->fShowStatus = TRUE;
537 }
538 pimeui->fCtrlShowStatus = TRUE;
539 break;
540
541 default:
542 break;
543 }
544
545 return 0;
546}
547
548/* Modify the IME activation status. */
550{
551 HIMC hIMC;
552
553 if (!hWnd || !IsWindow(hWnd))
554 {
556 return;
557 }
558
559 hIMC = IMM_FN(ImmGetContext)(hWnd);
560 IMM_FN(ImmSetActiveContext)(hWnd, hIMC, bActive);
562}
563
565{
566 IMM_FN(CtfImmTIMActivate)(pimeui->hKL);
567 pimeui->hKL = GetWin32ClientInfo()->hKL;
568 IMM_FN(ImmLoadIME)(pimeui->hKL);
569 pimeui->hwndUI = NULL;
570}
571
572/* Open the IME help or check the existence of the IME help. */
573static LRESULT FASTCALL
575{
578 size_t cch;
579
580 /* Is there any IME help file? */
581 ret = IMM_FN(ImmEscapeW)(pimeui->hKL, pimeui->hIMC, IME_ESC_QUERY_SUPPORT, &dwEsc);
582 if (!ret || !lParam)
583 return ret;
584
585 /* Get the help filename */
587 {
588 /* Check filename extension */
590 if (cch > 4 && _wcsicmp(&szHelpFile[cch - 4], L".HLP") == 0)
591 {
592 /* Open the old-style help */
593 TRACE("szHelpFile: %s\n", debugstr_w(szHelpFile));
595 }
596 else
597 {
598 /* Open the new-style help */
599 FIXME("(%p, %p, %p): %s\n", pimeui, wParam, lParam, debugstr_w(szHelpFile));
600 ret = FALSE;
601 }
602 }
603
604 return ret;
605}
606
607static BOOL CALLBACK
609{
610 DWORD dwConversion, dwSentence, dwNewConversion;
611
612 IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence);
613
614 if (lParam)
615 dwNewConversion = dwConversion | IME_CMODE_SOFTKBD;
616 else
617 dwNewConversion = dwConversion & ~IME_CMODE_SOFTKBD;
618
619 if (dwNewConversion != dwConversion)
620 IMM_FN(ImmSetConversionStatus)(hIMC, dwNewConversion, dwSentence);
621
622 return TRUE;
623}
624
625// indicdll!12
626typedef VOID (CALLBACK *FN_GetPenMenuData)(PUINT pnID, PDWORD_PTR pdwMenuData);
628#define IFN_GetPenMenuData 12
629
630static BOOL CALLBACK
632{
634 {
636 HMODULE hIndicDll = GetModuleHandleW(L"indicdll.dll");
637 if (!hIndicDll)
638 {
640 hIndicDll = LoadLibraryW(szPath);
641 }
642 if (!hIndicDll)
643 {
644 ERR("indicdll.dll not loaded: %s\n", debugstr_w(szPath));
645 return FALSE;
646 }
647
650 }
651
653 return FALSE;
654
655 s_pGetPenMenuData(pnID, pdwMenuData);
656 return TRUE;
657}
658
659// IMS_IMEMENUITEMSELECTED
660static VOID
662{
663 if (!IsWindow(hwndTarget))
664 return;
665
666 HIMC hIMC = IMM_FN(ImmGetContext)(hwndTarget);
667 if (!hIMC)
668 return;
669
670 UINT nID = 0;
671 DWORD_PTR dwMenuData = 0;
672 if (User32GetPenMenuData(&nID, &dwMenuData))
673 IMM_FN(ImmNotifyIME)(hIMC, NI_IMEMENUSELECTED, nID, dwMenuData);
674
675 IMM_FN(ImmReleaseContext)(hwndTarget, hIMC);
676}
677
678/* Handles WM_IME_SYSTEM message of the default IME window. */
680{
681 LRESULT ret = 0;
683 HIMC hIMC = pimeui->hIMC;
684 LPCANDIDATEFORM pCandForm;
685 LPCOMPOSITIONFORM pCompForm;
686 DWORD dwConversion, dwSentence;
687 HWND hImeWnd;
688 BOOL bCompForm;
689 CANDIDATEFORM CandForm;
690 COMPOSITIONFORM CompForm;
691 UINT iCandForm;
692
693 ASSERT(pimeui->spwnd != NULL);
694
695 switch (wParam)
696 {
699 {
700 hImeWnd = UserHMGetHandle(pimeui->spwnd);
702 }
703 break;
704
705 case IMS_UPDATEIMEUI:
706 if (!hIMC)
707 break;
708
709 bCompForm = TRUE;
710 pIC = IMM_FN(ImmLockIMC)(hIMC);
711 if (pIC)
712 {
713 bCompForm = !(pIC->dwUIFlags & 0x2);
714 IMM_FN(ImmUnlockIMC)(hIMC);
715 }
716
717 if (!IsWindow(pimeui->hwndIMC))
718 break;
719
720 if (bCompForm && IMM_FN(ImmGetCompositionWindow)(hIMC, &CompForm))
721 {
722 if (CompForm.dwStyle)
723 IMM_FN(ImmSetCompositionWindow)(hIMC, &CompForm);
724 }
725
726 for (iCandForm = 0; iCandForm < MAX_CANDIDATEFORM; ++iCandForm)
727 {
728 if (IMM_FN(ImmGetCandidateWindow)(hIMC, iCandForm, &CandForm))
729 {
730 if (CandForm.dwStyle)
731 IMM_FN(ImmSetCandidateWindow)(hIMC, &CandForm);
732 }
733 }
734 break;
735
736 case IMS_SETCANDFORM:
737 pIC = IMM_FN(ImmLockIMC)(hIMC);
738 if (!pIC)
739 break;
740
741 pCandForm = &pIC->cfCandForm[lParam];
742 IMM_FN(ImmSetCandidateWindow)(hIMC, pCandForm);
743 IMM_FN(ImmUnlockIMC)(hIMC);
744 break;
745
746 case IMS_SETCOMPFONT:
747 pIC = IMM_FN(ImmLockIMC)(hIMC);
748 if (!pIC)
749 break;
750
751 IMM_FN(ImmSetCompositionFontW)(hIMC, &pIC->lfFont.W);
752 IMM_FN(ImmUnlockIMC)(hIMC);
753 break;
754
755 case IMS_SETCOMPFORM:
756 pIC = IMM_FN(ImmLockIMC)(hIMC);
757 if (!pIC)
758 break;
759
760 pCompForm = &pIC->cfCompForm;
761 pIC->dwUIFlags |= 0x8;
762 IMM_FN(ImmSetCompositionWindow)(hIMC, pCompForm);
763 IMM_FN(ImmUnlockIMC)(hIMC);
764 break;
765
766 case IMS_CONFIGURE:
768 break;
769
771 if (hIMC)
773 break;
774
775 case IMS_FREELAYOUT:
777 break;
778
779 case IMS_SOFTKBDONOFF:
781 break;
782
784 IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence);
785 ret = dwConversion;
786 break;
787
788 case IMS_IMEHELP:
789 return User32DoImeHelp(pimeui, wParam, lParam);
790
791 case IMS_IMEACTIVATE:
793 break;
794
797 break;
798
801 break;
802
803 case IMS_GETIMEMENU:
805 break;
806
809 break;
810
811 case IMS_GETCONTEXT:
813 break;
814
817 case IMS_SETLANGBAND:
820 break;
821
823 CtfLoadThreadLayout(pimeui);
824 break;
825
826 default:
827 break;
828 }
829
830 return ret;
831}
832
833/* Handles WM_IME_SETCONTEXT message of the default IME window. */
835{
836 LRESULT ret;
837 HIMC hIMC;
839 HWND hwndFocus, hwndOldImc, hwndNewImc, hImeWnd, hwndActive, hwndOwner;
840 PWND pwndFocus, pImeWnd, pwndOwner;
841 COMPOSITIONFORM CompForm;
842
843 pimeui->fActivate = !!wParam;
844 hwndOldImc = pimeui->hwndIMC;
845 ASSERT(pimeui->spwnd != NULL);
846
847 if (wParam)
848 {
849 if (!pimeui->hwndUI)
850 pimeui->hwndUI = User32CreateImeUIWindow(pimeui, pimeui->hKL);
851
852 if (gfConIme == -1)
853 {
855 if (gfConIme)
856 pimeui->fCtrlShowStatus = FALSE;
857 }
858
859 hImeWnd = UserHMGetHandle(pimeui->spwnd);
860
861 if (gfConIme)
862 {
863 hwndOwner = GetWindow(hImeWnd, GW_OWNER);
864 pwndOwner = ValidateHwnd(hwndOwner);
865 if (pwndOwner)
866 {
867 User32UpdateImcOfImeUI(pimeui, pwndOwner->hImc);
868
869 if (pimeui->hwndUI)
870 SetWindowLongPtrW(pimeui->hwndUI, IMMGWLP_IMC, (LONG_PTR)pwndOwner->hImc);
871 }
872
874 }
875
876 hwndFocus = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_FOCUS);
877
878 hIMC = IMM_FN(ImmGetContext)(hwndFocus);
879
880 if (hIMC && !User32CanSetImeWindowToImc(hIMC, hImeWnd))
881 {
883 return 0;
884 }
885
886 User32UpdateImcOfImeUI(pimeui, hIMC);
887
888 if (pimeui->hwndUI)
890
891 if (hIMC)
892 {
893 pIC = IMM_FN(ImmLockIMC)(hIMC);
894 if (!pIC)
895 return 0;
896
897 if (hwndFocus != pIC->hWnd)
898 {
899 IMM_FN(ImmUnlockIMC)(hIMC);
900 return 0;
901 }
902
903 if ((pIC->dwUIFlags & 0x40000) && hwndOldImc != hwndFocus)
904 {
905 RtlZeroMemory(&CompForm, sizeof(CompForm));
906 IMM_FN(ImmSetCompositionWindow)(hIMC, &CompForm);
907
908 pIC->dwUIFlags &= ~0x40000;
909 }
910
911 IMM_FN(ImmUnlockIMC)(hIMC);
912
913 hImeWnd = UserHMGetHandle(pimeui->spwnd);
914 if (NtUserSetImeOwnerWindow(hImeWnd, hwndFocus))
915 pimeui->hwndIMC = hwndFocus;
916 }
917 else
918 {
919 pimeui->hwndIMC = hwndFocus;
920
921 hImeWnd = UserHMGetHandle(pimeui->spwnd);
923 }
924 }
925
927
928 if (!pimeui->spwnd)
929 return 0;
930
931 if (!pimeui->fCtrlShowStatus || !User32GetImeShowStatus())
932 return ret;
933
934 hImeWnd = UserHMGetHandle(pimeui->spwnd);
935 hwndFocus = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_FOCUS);
936 pwndFocus = ValidateHwnd(hwndFocus);
937
938 if (wParam)
939 {
940 pImeWnd = ValidateHwnd(hImeWnd);
941 if (pwndFocus && pImeWnd && pImeWnd->head.pti == pwndFocus->head.pti)
942 {
943 hwndNewImc = pimeui->hwndIMC;
944 if (pimeui->fShowStatus)
945 {
946 if (hwndOldImc && hwndNewImc && hwndOldImc != hwndNewImc &&
947 IntGetTopLevelWindow(hwndOldImc) != IntGetTopLevelWindow(hwndNewImc))
948 {
949 User32NotifyOpenStatus(pimeui, hwndOldImc, FALSE);
950 User32NotifyOpenStatus(pimeui, hwndNewImc, TRUE);
951 }
952 }
953 else
954 {
955 if (ValidateHwnd(hwndNewImc))
956 User32NotifyOpenStatus(pimeui, hwndNewImc, TRUE);
957 }
958 }
959
960 pImeWnd = pimeui->spwnd;
961 hImeWnd = (pImeWnd ? UserHMGetHandle(pImeWnd) : NULL);
962 if (hImeWnd)
964 }
965 else
966 {
967 pImeWnd = pimeui->spwnd;
968 hImeWnd = UserHMGetHandle(pImeWnd);
969 hwndActive = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_ACTIVE);
970 if (!pwndFocus || !hwndActive || pImeWnd->head.pti != pwndFocus->head.pti)
971 {
972 if (IsWindow(hwndOldImc))
973 {
974 User32NotifyOpenStatus(pimeui, hwndOldImc, FALSE);
975 }
976 else
977 {
978 pimeui->fShowStatus = FALSE;
980 }
981 }
982 }
983
984 return ret;
985}
986
987/* The window procedure of the default IME window */
990{
991 PWND pWnd;
992 PIMEUI pimeui;
993 LRESULT ret;
994
995 pWnd = ValidateHwnd(hwnd);
996 if (pWnd == NULL)
997 {
998 ERR("hwnd was %p\n", hwnd);
999 return 0;
1000 }
1001
1002 if (!pWnd->fnid)
1003 {
1005 }
1006 else if (pWnd->fnid != FNID_IME)
1007 {
1008 ERR("fnid was 0x%x\n", pWnd->fnid);
1009 return 0;
1010 }
1011
1012 pimeui = (PIMEUI)GetWindowLongPtrW(hwnd, 0);
1013 if (pimeui == NULL)
1014 {
1015 pimeui = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMEUI));
1016 if (pimeui == NULL)
1017 {
1018 ERR("HeapAlloc failed\n");
1021 return 0;
1022 }
1023
1024 SetWindowLongPtrW(hwnd, 0, (LONG_PTR)pimeui);
1025 pimeui->spwnd = pWnd;
1026 }
1027
1028 if (IS_CICERO_MODE())
1029 {
1031 if (ret)
1032 return ret;
1033 }
1034
1035 if (pimeui->nCntInIMEProc > 0)
1036 {
1037 switch (msg)
1038 {
1039 case WM_IME_CHAR:
1041 case WM_IME_CONTROL:
1042 case WM_IME_REQUEST:
1043 case WM_IME_SELECT:
1044 case WM_IME_SETCONTEXT:
1045 case WM_IME_STARTCOMPOSITION:
1046 case WM_IME_COMPOSITION:
1047 case WM_IME_ENDCOMPOSITION:
1048 return 0;
1049
1050 case WM_IME_NOTIFY:
1051 if (wParam < IMN_PRIVATE || IS_IME_HKL(pimeui->hKL) || !IS_CICERO_MODE())
1052 return 0;
1053 break;
1054
1055 case WM_IME_SYSTEM:
1056 switch (wParam)
1057 {
1058 case 0x03:
1059 case 0x10:
1060 case 0x13:
1061 break;
1062
1063 default:
1064 return 0;
1065 }
1066 break;
1067
1068 default:
1069 goto Finish;
1070 }
1071 }
1072
1073 if ((pWnd->state2 & WNDS2_INDESTROY) || (pWnd->state & WNDS_DESTROYED))
1074 {
1075 switch (msg)
1076 {
1077 case WM_DESTROY:
1078 case WM_NCDESTROY:
1079 case WM_FINALDESTROY:
1080 break;
1081
1082 default:
1083 return 0;
1084 }
1085 }
1086
1087 switch (msg)
1088 {
1089 case WM_CREATE:
1090 return ImeWnd_OnCreate(pimeui, (LPCREATESTRUCT)lParam);
1091
1092 case WM_DESTROY:
1094 return 0;
1095
1096 case WM_NCDESTROY:
1097 case WM_FINALDESTROY:
1098 pimeui->spwnd = NULL;
1099 HeapFree(GetProcessHeap(), 0, pimeui);
1101 break;
1102
1103 case WM_ERASEBKGND:
1104 return TRUE;
1105
1106 case WM_PAINT:
1107 return 0;
1108
1109 case WM_IME_STARTCOMPOSITION:
1110 case WM_IME_COMPOSITION:
1111 case WM_IME_ENDCOMPOSITION:
1112 return User32SendImeUIMessage(pimeui, msg, wParam, lParam, unicode);
1113
1114 case WM_IME_CONTROL:
1115 return ImeWnd_OnImeControl(pimeui, wParam, lParam, unicode);
1116
1117 case WM_IME_NOTIFY:
1118 return ImeWnd_OnImeNotify(pimeui, wParam, lParam);
1119
1120 case WM_IME_REQUEST:
1121 return 0;
1122
1123 case WM_IME_SELECT:
1125 return (LRESULT)pimeui;
1126
1127 case WM_IME_SETCONTEXT:
1128 return ImeWnd_OnImeSetContext(pimeui, wParam, lParam);
1129
1130 case WM_IME_SYSTEM:
1131 return ImeWnd_OnImeSystem(pimeui, wParam, lParam);
1132
1133 default:
1134 break;
1135 }
1136
1137Finish:
1138 if (unicode)
1139 return DefWindowProcW(hwnd, msg, wParam, lParam);
1140 return DefWindowProcA(hwnd, msg, wParam, lParam);
1141}
1142
1144{
1146}
1147
1149{
1151}
1152
1154{
1155 HMODULE imm32;
1156 BOOL ret;
1157
1159 if (!ret || !(gpsi->dwSRVIFlags & SRVINFO_IMM32))
1160 return FALSE;
1161
1162 imm32 = GetModuleHandleW(L"imm32.dll");
1163 if (imm32)
1164 return TRUE;
1165
1166 imm32 = LoadLibraryW(L"imm32.dll");
1167 if (imm32 == NULL)
1168 {
1169 ERR("Imm32 not installed!\n");
1170 ret = FALSE;
1171 }
1172
1173 return ret;
1174}
1175
1176BOOL
1177WINAPI
1179{
1180 ATOM atom;
1181 WNDCLASSEXW WndClass = { sizeof(WndClass) };
1182
1183 WndClass.lpszClassName = L"IME";
1184 WndClass.style = CS_GLOBALCLASS;
1185 WndClass.lpfnWndProc = ImeWndProcW;
1186 WndClass.cbWndExtra = sizeof(LONG_PTR);
1187 WndClass.hCursor = LoadCursorW(NULL, IDC_ARROW);
1188
1189 atom = RegisterClassExWOWW(&WndClass, 0, FNID_IME, 0, FALSE);
1190 if (!atom)
1191 {
1192 ERR("Failed to register IME Class!\n");
1193 return FALSE;
1194 }
1195
1197 TRACE("RegisterIMEClass atom = %u\n", atom);
1198 return TRUE;
1199}
1200
1201/*
1202 * @implemented
1203 */
1204BOOL
1205WINAPI
1207{
1208 return IMM_FN(ImmIMPSetIMEW)(hwnd, ime);
1209}
1210
1211/*
1212 * @implemented
1213 */
1214BOOL
1215WINAPI
1217{
1218 return IMM_FN(ImmIMPQueryIMEW)(ime);
1219}
1220
1221/*
1222 * @implemented
1223 */
1224BOOL
1225WINAPI
1227{
1228 return IMM_FN(ImmIMPGetIMEW)(hwnd, ime);
1229}
1230
1231/*
1232 * @implemented
1233 */
1234BOOL
1235WINAPI
1237{
1238 return IMM_FN(ImmIMPSetIMEA)(hwnd, ime);
1239}
1240
1241/*
1242 * @implemented
1243 */
1244BOOL
1245WINAPI
1247{
1248 return IMM_FN(ImmIMPQueryIMEA)(ime);
1249}
1250
1251/*
1252 * @implemented
1253 */
1254BOOL
1255WINAPI
1257{
1258 return IMM_FN(ImmIMPGetIMEA)(hwnd, ime);
1259}
1260
1261/*
1262 * @implemented
1263 */
1264LRESULT
1265WINAPI
1267{
1269}
1270
1271/*
1272 * @implemented
1273 */
1274LRESULT
1275WINAPI
1277{
1279}
1280
1281/*
1282 * @implemented
1283 */
1284BOOL
1285WINAPI
1287{
1289}
1290
1291/*
1292 * @implemented
1293 */
1294BOOL
1295WINAPI
1297{
1299}
1300
1301/*
1302 * @implemented
1303 */
1304UINT
1305WINAPI
1307{
1308 return FALSE;
1309}
#define VOID
Definition: acefi.h:82
Arabic default style
Definition: afstyles.h:94
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
ULONG_PTR * PDWORD_PTR
Definition: basetsd.h:182
WCHAR WndClass[]
Definition: capicon.c:23
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
WORD ATOM
Definition: dimm.idl:113
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 GetProcessHeap()
Definition: compat.h:736
#define CP_ACP
Definition: compat.h:109
HANDLE HWND
Definition: compat.h:19
#define GetProcAddress(x, y)
Definition: compat.h:753
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CALLBACK
Definition: compat.h:35
#define WideCharToMultiByte
Definition: compat.h:111
#define LoadLibraryW(x)
Definition: compat.h:747
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
static DWORD cchBuffer
Definition: fusion.c:85
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2313
PTHEME_CLASS ValidateHandle(HTHEME hTheme)
Definition: system.c:732
#define pt(x, y)
Definition: drawing.c:79
#define ULONG_PTR
Definition: config.h:101
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLboolean enable
Definition: glext.h:11120
BOOL WINAPI ImmSetCompositionFontA(_In_ HIMC hIMC, _In_ LPLOGFONTA lplf)
Definition: ime.c:1263
BOOL WINAPI ImmGetCompositionFontA(_In_ HIMC hIMC, _Out_ LPLOGFONTA lplf)
Definition: ime.c:1184
BOOL WINAPI ImmGetCompositionFontW(_In_ HIMC hIMC, _Out_ LPLOGFONTW lplf)
Definition: ime.c:1223
BOOL WINAPI ImmSetCompositionFontW(_In_ HIMC hIMC, _In_ LPLOGFONTW lplf)
Definition: ime.c:1322
BOOL WINAPI ImmFreeLayout(_In_ HKL hKL)
Definition: imm.c:124
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
Definition: imm.c:1079
BOOL WINAPI ImmActivateLayout(_In_ HKL hKL)
Definition: imm.c:450
BOOL WINAPI ImmRegisterClient(_Inout_ PSHAREDINFO ptr, _In_ HINSTANCE hMod)
Definition: imm.c:58
HIMC WINAPI ImmGetContext(_In_ HWND hWnd)
Definition: imm.c:1065
BOOL WINAPI ImmEnumInputContext(_In_ DWORD dwThreadId, _In_ IMCENUMPROC lpfn, _In_ LPARAM lParam)
Definition: imm.c:1123
BOOL WINAPI ImmWINNLSGetEnableStatus(_In_opt_ HWND hWnd)
Definition: imm.c:1256
BOOL WINAPI ImmReleaseContext(_In_ HWND hWnd, _In_ HIMC hIMC)
Definition: imm.c:1109
SHAREDINFO gSharedInfo
Definition: imm.c:19
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
Definition: imm.c:1089
PSERVERINFO gpsi
Definition: imm.c:18
BOOL WINAPI ImmSetActiveContext(_In_ HWND hWnd, _In_opt_ HIMC hIMC, _In_ BOOL fActive)
Definition: imm.c:1155
#define IMS_IMEHELP
Definition: imm32_undoc.h:45
BOOL WINAPI ImmIMPQueryIMEA(_Inout_ LPIMEPROA pImePro)
Definition: imepro.c:121
#define IMS_GETIMEMENU
Definition: imm32_undoc.h:49
BOOL WINAPI ImmIMPGetIMEW(_In_opt_ HWND hWnd, _Out_ LPIMEPROW pImePro)
Definition: imepro.c:97
#define IMS_SETOPENSTATUS
Definition: imm32_undoc.h:41
VOID WINAPI CtfImmRestoreToolbarWnd(_In_ LPVOID pUnused, _In_ DWORD dwShowFlags)
Definition: ctf.c:1392
#define IMS_IMEMENUITEMSELECTED
Definition: imm32_undoc.h:50
LRESULT WINAPI CtfImmDispatchDefImeMessage(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam)
Definition: ctf.c:1417
#define IMS_IMEACTIVATE
Definition: imm32_undoc.h:46
BOOL WINAPI ImmIMPGetIMEA(_In_opt_ HWND hWnd, _Out_ LPIMEPROA pImePro)
Definition: imepro.c:68
BOOL WINAPI ImmLoadIME(_In_ HKL hKL)
Definition: ime.c:611
LRESULT WINAPI ImmPutImeMenuItemsIntoMappedFile(_In_ HIMC hIMC)
Definition: imemenu.c:377
#define IMS_UPDATEIMEUI
Definition: imm32_undoc.h:36
BOOL WINAPI ImmIMPQueryIMEW(_Inout_ LPIMEPROW pImePro)
Definition: imepro.c:161
HRESULT WINAPI CtfImmTIMActivate(_In_ HKL hKL)
Definition: ctf.c:1123
#define IMS_GETCONTEXT
Definition: imm32_undoc.h:51
#define IMS_SETCANDFORM
Definition: imm32_undoc.h:37
#define IMS_SETLANGBAND
Definition: imm32_undoc.h:55
#define IMS_COMPLETECOMPSTR
Definition: imm32_undoc.h:53
#define IMS_UNSETLANGBAND
Definition: imm32_undoc.h:56
#define IMS_SETCOMPFONT
Definition: imm32_undoc.h:38
#define IMS_GETCONVSTATUS
Definition: imm32_undoc.h:44
BOOL WINAPI ImmIMPSetIMEW(_In_opt_ HWND hWnd, _Inout_ LPIMEPROW pImePro)
Definition: imepro.c:266
#define IS_IME_HKL(hKL)
Definition: imm32_undoc.h:21
#define IMS_CONFIGURE
Definition: imm32_undoc.h:40
LRESULT WINAPI ImmSystemHandler(_In_ HIMC hIMC, _Inout_opt_ WPARAM wParam, _Inout_opt_ LPARAM lParam)
Definition: keymsg.c:847
#define IMS_NOTIFYIMESHOW
Definition: imm32_undoc.h:35
#define IMS_LOADTHREADLAYOUT
Definition: imm32_undoc.h:54
#define IMS_SOFTKBDONOFF
Definition: imm32_undoc.h:43
DWORD WINAPI CtfImmHideToolbarWnd(VOID)
Definition: ctf.c:1363
#define IMS_FREELAYOUT
Definition: imm32_undoc.h:42
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
Definition: ime.c:531
#define IMS_ACTIVATELAYOUT
Definition: imm32_undoc.h:48
BOOL WINAPI ImmGetImeInfoEx(_Out_ PIMEINFOEX pImeInfoEx, _In_ IMEINFOEXCLASS SearchType, _In_ PVOID pvSearchKey)
#define IMS_IMEDEACTIVATE
Definition: imm32_undoc.h:47
WORD WINAPI ImmSendIMEMessageExA(_In_ HWND hWnd, _In_ LPARAM lParam)
Definition: win3.c:215
#define WM_IME_SYSTEM
Definition: imm32_undoc.h:32
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
Definition: ime.c:561
@ ImeInfoExKeyboardLayout
Definition: imm32_undoc.h:79
WORD WINAPI ImmSendIMEMessageExW(_In_ HWND hWnd, _In_ LPARAM lParam)
Definition: win3.c:227
BOOL WINAPI ImmWINNLSEnableIME(_In_opt_ HWND hWnd, _In_ BOOL enable)
Definition: ime.c:1717
#define IMS_SETCOMPFORM
Definition: imm32_undoc.h:39
#define IMS_SENDNOTIFICATION
Definition: imm32_undoc.h:52
BOOL WINAPI ImmIMPSetIMEA(_In_opt_ HWND hWnd, _Inout_ LPIMEPROA pImePro)
Definition: imepro.c:228
#define IMC_SETCANDIDATEPOS
Definition: imm.h:149
BOOL WINAPI ImmGetConversionStatus(_In_ HIMC hIMC, _Out_opt_ LPDWORD lpfdwConversion, _Out_opt_ LPDWORD lpfdwSentence)
Definition: ime.c:1501
BOOL WINAPI ImmSetConversionStatus(_In_ HIMC hIMC, _In_ DWORD fdwConversion, _In_ DWORD fdwSentence)
Definition: ime.c:1534
#define IME_PROP_UNICODE
Definition: imm.h:249
#define IMC_CLOSESTATUSWINDOW
Definition: imm.h:156
BOOL WINAPI ImmSetCompositionWindow(_In_ HIMC hIMC, _In_ LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1149
BOOL WINAPI ImmSetCandidateWindow(_In_ HIMC hIMC, _In_ LPCANDIDATEFORM lpCandidate)
Definition: candidate.c:433
#define IME_ESC_QUERY_SUPPORT
Definition: imm.h:410
#define IMC_SETSTATUSWINDOWPOS
Definition: imm.h:155
#define IME_CMODE_SOFTKBD
Definition: imm.h:349
#define IMC_GETCOMPOSITIONWINDOW
Definition: imm.h:152
BOOL WINAPI ImmGetCandidateWindow(_In_ HIMC hIMC, _In_ DWORD dwIndex, _Out_ LPCANDIDATEFORM lpCandidate)
Definition: candidate.c:396
#define IMC_SETCOMPOSITIONWINDOW
Definition: imm.h:153
#define IMN_PRIVATE
Definition: imm.h:385
LRESULT WINAPI ImmEscapeW(_In_ HKL hKL, _In_ HIMC hIMC, _In_ UINT uSubFunc, _Inout_opt_ LPVOID lpData)
Definition: ime.c:913
#define IMC_GETCANDIDATEPOS
Definition: imm.h:148
#define IME_ESC_GETHELPFILENAME
Definition: imm.h:424
BOOL WINAPI ImmSetStatusWindowPos(_In_ HIMC hIMC, _In_ LPPOINT lpptPos)
Definition: ime.c:1091
BOOL WINAPI ImmGetOpenStatus(_In_ HIMC hIMC)
Definition: ime.c:996
#define IMN_OPENSTATUSWINDOW
Definition: imm.h:373
#define IMC_GETCOMPOSITIONFONT
Definition: imm.h:150
BOOL WINAPI ImmConfigureIMEW(_In_ HKL hKL, _In_ HWND hWnd, _In_ DWORD dwMode, _Inout_opt_ LPVOID lpData)
Definition: ime.c:1657
#define IMC_SETCOMPOSITIONFONT
Definition: imm.h:151
#define IMN_SETOPENSTATUS
Definition: imm.h:379
BOOL WINAPI ImmGetCompositionWindow(_In_ HIMC hIMC, _Out_ LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1122
#define IMC_OPENSTATUSWINDOW
Definition: imm.h:157
#define IMN_CLOSESTATUSWINDOW
Definition: imm.h:372
BOOL WINAPI ImmSetOpenStatus(_In_ HIMC hIMC, _In_ BOOL fOpen)
Definition: ime.c:1020
#define IMC_GETSTATUSWINDOWPOS
Definition: imm.h:154
#define IMN_SETCONVERSIONMODE
Definition: imm.h:377
BOOL WINAPI ImmNotifyIME(_In_ HIMC hIMC, _In_ DWORD dwAction, _In_ DWORD dwIndex, _In_ DWORD_PTR dwValue)
Definition: ime.c:458
#define IME_CONFIG_GENERAL
Definition: imm.h:405
#define IMC_SETOPENSTATUS
Definition: immdev.h:372
#define IMC_SETCONVERSIONMODE
Definition: immdev.h:370
#define IMC_SETSENTENCEMODE
Definition: immdev.h:371
#define IMC_GETSOFTKBDPOS
Definition: immdev.h:91
#define IMC_GETSENTENCEMODE
Definition: immdev.h:87
#define IMC_GETOPENSTATUS
Definition: immdev.h:88
#define IMMGWLP_IMC
Definition: immdev.h:103
#define IMC_SETSOFTKBDPOS
Definition: immdev.h:92
#define IMC_GETCONVERSIONMODE
Definition: immdev.h:86
#define NI_IMEMENUSELECTED
Definition: immdev.h:384
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define ICLS_IME
Definition: ntuser.h:927
#define ICLASS_TO_MASK(iCls)
Definition: ntuser.h:902
#define QUERY_WINDOW_FOCUS
Definition: ntuser.h:2846
#define FNID_DESTROY
Definition: ntuser.h:898
#define QUERY_WINDOW_ACTIVE
Definition: ntuser.h:2845
struct tagIMEUI * PIMEUI
#define WNDS_DESTROYED
Definition: ntuser.h:636
DWORD NTAPI NtUserNotifyIMEStatus(_In_ HWND hwnd, _In_ BOOL fOpen, _In_ DWORD dwConversion)
Definition: ime.c:848
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
DWORD_PTR NTAPI NtUserCallNoParam(DWORD Routine)
Definition: simplecall.c:59
DWORD NTAPI NtUserCallHwndParamLock(HWND hWnd, DWORD_PTR Param, DWORD Routine)
Definition: simplecall.c:895
BOOL NTAPI NtUserSetImeOwnerWindow(_In_ HWND hImeWnd, _In_opt_ HWND hwndFocus)
Definition: ime.c:1430
#define NtUserSetWindowLongPtr
Definition: ntuser.h:3306
@ THREADSTATE_CHECKCONIME
Definition: ntuser.h:2502
BOOLEAN NTAPI NtUserDestroyWindow(HWND Wnd)
Definition: window.c:3054
@ NOPARAM_ROUTINE_GETIMESHOWSTATUS
Definition: ntuser.h:1525
@ HWNDLOCK_ROUTINE_CHECKIMESHOWSTATUSINTHRD
Definition: ntuser.h:1641
@ NOPARAM_ROUTINE_UPDATEPERUSERIMMENABLING
Definition: ntuser.h:1551
@ TWOPARAM_ROUTINE_IMESHOWSTATUSCHANGE
Definition: ntuser.h:1650
@ TYPE_INPUTCONTEXT
Definition: ntuser.h:57
#define FNID_IME
Definition: ntuser.h:874
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
Definition: window.c:4207
#define IS_CICERO_MODE()
Definition: ntuser.h:1213
BOOL NTAPI NtUserCallHwndLock(HWND hWnd, DWORD Routine)
Definition: simplecall.c:585
#define SRVINFO_IMM32
Definition: ntuser.h:949
BOOL NTAPI NtUserUpdateInputContext(HIMC hIMC, DWORD dwType, DWORD_PTR dwValue)
Definition: ime.c:1846
#define WNDS2_INDESTROY
Definition: ntuser.h:648
#define GetWin32ClientInfo()
Definition: ntuser.h:352
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
Definition: misc.c:240
BOOL NTAPI NtUserSetWindowFNID(HWND hWnd, WORD fnID)
Definition: window.c:4348
#define debugstr_w
Definition: kernel32.h:32
#define ASSERT(a)
Definition: mode.c:44
LPCWSTR szPath
Definition: env.c:37
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
UINT_PTR HKL
Definition: msctf.idl:125
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int * PUINT
Definition: ndis.h:50
unsigned int UINT
Definition: ndis.h:50
#define _Out_writes_(s)
Definition: no_sal2.h:176
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define BOOL
Definition: nt_native.h:43
#define FASTCALL
Definition: nt_native.h:50
#define DWORD
Definition: nt_native.h:44
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define WS_POPUP
Definition: pedump.c:616
#define WS_DISABLED
Definition: pedump.c:621
#define INT
Definition: polytest.cpp:20
DWORD RegisterDefaultClasses
Definition: regcontrol.c:13
ATOM WINAPI RegisterClassExWOWW(WNDCLASSEXW *, LPDWORD, WORD, DWORD, BOOL)
Definition: class.c:1262
TCHAR szHelpFile[]
Definition: scrnsave.c:31
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
DWORD dwStyle
Definition: dimm.idl:80
DWORD dwStyle
Definition: dimm.idl:86
HINSTANCE hInst
Definition: imm32_undoc.h:92
HINSTANCE hInstance
Definition: winuser.h:3256
Definition: ntuser.h:694
THRDESKHEAD head
Definition: ntuser.h:695
DWORD style
Definition: ntuser.h:706
DWORD state2
Definition: ntuser.h:702
DWORD fnid
Definition: ntuser.h:709
HIMC hImc
Definition: ntuser.h:740
DWORD state
Definition: ntuser.h:701
DWORD fdwProperty
Definition: immdev.h:22
DWORD fdwConversion
Definition: immdev.h:111
Definition: ntuser.h:199
HWND hImeWnd
Definition: ntuser.h:203
IMEINFO ImeInfo
Definition: imm32_undoc.h:61
WCHAR wszUIClass[16]
Definition: imm32_undoc.h:62
HKL hKL
Definition: ntuser.h:1223
HIMC hIMC
Definition: ntuser.h:1221
DWORD dwLastStatus
Definition: ntuser.h:1235
PWND spwnd
Definition: ntuser.h:1220
UINT fCtrlShowStatus
Definition: ntuser.h:1232
UINT fActivate
Definition: ntuser.h:1228
HWND hwndIMC
Definition: ntuser.h:1222
UINT fShowStatus
Definition: ntuser.h:1227
HWND hwndUI
Definition: ntuser.h:1224
LONG nCntInIMEProc
Definition: ntuser.h:1225
UINT fDestroy
Definition: ntuser.h:1229
DWORD dwSRVIFlags
Definition: ntuser.h:1051
#define LONG_PTR
Definition: treelist.c:79
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
BOOL WINAPI User32InitializeImmEntryTable(_In_ DWORD)
@ UIC_IMEWINDOW
Definition: undocuser.h:315
#define WM_FINALDESTROY
Definition: undocuser.h:41
static VOID User32SetImeWindowOfImc(HIMC hIMC, HWND hImeWnd)
Definition: imm.c:209
static FN_GetPenMenuData s_pGetPenMenuData
Definition: imm.c:627
BOOL gbImmInitializing
Definition: imm.c:21
BOOL WINAPI IMPSetIMEW(HWND hwnd, LPIMEPROW ime)
Definition: imm.c:1206
static VOID User32DestroyImeUIWindow(PIMEUI pimeui)
Definition: imm.c:365
BOOL WINAPI IMPQueryIMEA(LPIMEPROA ime)
Definition: imm.c:1246
UINT WINAPI WINNLSGetIMEHotkey(HWND hwnd)
Definition: imm.c:1306
Imm32ApiTable gImmApiEntries
Definition: imm.c:45
LRESULT WINAPI ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:989
BOOL WINAPI IMPQueryIMEW(LPIMEPROW ime)
Definition: imm.c:1216
static BOOL User32GetImeShowStatus(VOID)
Definition: imm.c:160
LRESULT ImeWnd_OnImeSetContext(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:834
static INT ImeWnd_OnCreate(PIMEUI pimeui, LPCREATESTRUCT lpCS)
Definition: imm.c:334
static VOID FASTCALL User32SetImeActivenessOfWindow(HWND hWnd, BOOL bActive)
Definition: imm.c:549
static HWND User32CreateImeUIWindow(PIMEUI pimeui, HKL hKL)
Definition: imm.c:289
INT gfConIme
Definition: imm.c:23
LRESULT WINAPI SendIMEMessageExA(HWND hwnd, LPARAM lParam)
Definition: imm.c:1276
static BOOL IntInitializeImmEntryTable(VOID)
Definition: imm.c:72
static LRESULT User32SendImeUIMessage(PIMEUI pimeui, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:167
static VOID User32ImeMenuItemSelected(HWND hwndTarget)
Definition: imm.c:661
LRESULT WINAPI ImeWndProcA(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: imm.c:1143
BOOL WINAPI UpdatePerUserImmEnabling(VOID)
Definition: imm.c:1153
BOOL WINAPI InitializeImmEntryTable(VOID)
Definition: imm.c:120
static LRESULT ImeWnd_OnImeSystem(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:679
VOID FASTCALL CtfLoadThreadLayout(PIMEUI pimeui)
Definition: imm.c:564
VOID(CALLBACK * FN_GetPenMenuData)(PUINT pnID, PDWORD_PTR pdwMenuData)
Definition: imm.c:626
static BOOL CALLBACK User32GetPenMenuData(_Out_ PUINT pnID, _Out_ PDWORD_PTR pdwMenuData)
Definition: imm.c:631
static LRESULT ImeWnd_OnImeControl(PIMEUI pimeui, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:415
BOOL WINAPI IMPGetIMEA(HWND hwnd, LPIMEPROA ime)
Definition: imm.c:1256
static BOOL User32CanSetImeWindowToImc(HIMC hIMC, HWND hImeWnd)
Definition: imm.c:154
BOOL WINAPI IMPSetIMEA(HWND hwnd, LPIMEPROA ime)
Definition: imm.c:1236
HRESULT User32GetSystemFilePath(_Out_writes_(cchBuffer) PWSTR lpBuffer, _In_ SIZE_T cchBuffer, _In_ PCWSTR pszFileName)
Definition: imm.c:54
HINSTANCE ghImm32
Definition: imm.c:19
#define IFN_GetPenMenuData
Definition: imm.c:628
BOOL WINAPI WINNLSEnableIME(HWND hwnd, BOOL enable)
Definition: imm.c:1286
BOOL WINAPI RegisterIMEClass(VOID)
Definition: imm.c:1178
HWND FASTCALL IntGetTopLevelWindow(HWND hWnd)
Definition: imm.c:25
static BOOL CALLBACK ImeWnd_SwitchSoftKbdProc(_In_ HIMC hIMC, _In_ LPARAM lParam)
Definition: imm.c:608
static VOID ImeWnd_OnImeSelect(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:380
BOOL WINAPI IMPGetIMEW(HWND hwnd, LPIMEPROW ime)
Definition: imm.c:1226
static VOID User32UpdateImcOfImeUI(PIMEUI pimeui, HIMC hNewIMC)
Definition: imm.c:218
static LRESULT ImeWnd_OnImeNotify(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:239
static VOID User32NotifyOpenStatus(PIMEUI pimeui, HWND hwndIMC, BOOL bOpen)
Definition: imm.c:195
static LRESULT FASTCALL User32DoImeHelp(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:574
LRESULT WINAPI SendIMEMessageExW(HWND hwnd, LPARAM lParam)
Definition: imm.c:1266
LRESULT WINAPI ImeWndProcW(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: imm.c:1148
BOOL WINAPI WINNLSGetEnableStatus(HWND hwnd)
Definition: imm.c:1296
#define IMM_FN(name)
Definition: user32p.h:56
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
int ret
#define ValidateHwnd(hwnd)
Definition: precomp.h:101
#define IMM_INIT_MAGIC
Definition: precomp.h:75
#define MAX_CANDIDATEFORM
Definition: precomp.h:78
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define WM_PAINT
Definition: winuser.h:1639
#define GW_OWNER
Definition: winuser.h:777
#define WM_ERASEBKGND
Definition: winuser.h:1644
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_IME_REQUEST
Definition: winuser.h:1855
#define GetWindowLongPtrW
Definition: winuser.h:4905
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_IME_NOTIFY
Definition: winuser.h:1849
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4391
#define WM_CREATE
Definition: winuser.h:1627
#define IDC_ARROW
Definition: winuser.h:695
BOOL WINAPI WinHelpW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_ UINT, _In_ ULONG_PTR)
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2442
#define WM_IME_SETCONTEXT
Definition: winuser.h:1848
#define HELP_FINDER
Definition: winuser.h:2438
#define WM_IME_CHAR
Definition: winuser.h:1853
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4392
#define WM_IME_COMPOSITIONFULL
Definition: winuser.h:1851
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
HWND WINAPI GetParent(_In_ HWND)
#define CS_GLOBALCLASS
Definition: winuser.h:660
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
#define WM_NCDESTROY
Definition: winuser.h:1703
#define WM_IME_CONTROL
Definition: winuser.h:1850
#define WM_IME_SELECT
Definition: winuser.h:1852
#define WM_DESTROY
Definition: winuser.h:1628
BOOL WINAPI GetClassInfoW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSW)
#define SetWindowLongPtrW
Definition: winuser.h:5431
#define GWL_STYLE
Definition: winuser.h:863
BOOL WINAPI DestroyWindow(_In_ HWND)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
__wchar_t WCHAR
Definition: xmlstorage.h:180
char CHAR
Definition: xmlstorage.h:175