ReactOS 0.4.16-dev-1170-ge326b06
imm.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS user32.dll
4 * FILE: win32ss/user/user32/misc/imm.c
5 * PURPOSE: User32.dll Imm functions
6 * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
7 * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
8 */
9
10#include <user32.h>
11#include <strsafe.h>
12#include <immdev.h>
13
15
16#define IMM_INIT_MAGIC 0x19650412
17#define MAX_CANDIDATEFORM 4
18
19/* Is != NULL when we have loaded the IMM ourselves */
20HINSTANCE ghImm32 = NULL; // Win: ghImm32
21
22BOOL gbImmInitializing = FALSE; // Win: bImmInitializing
23
24INT gfConIme = -1; // Win: gfConIme
25
27{
29
30 for (; hWnd; hWnd = GetParent(hWnd))
31 {
33 if (!(style & WS_CHILD))
34 break;
35 }
36
37 return hWnd;
38}
39
40/* define stub functions */
41#undef DEFINE_IMM_ENTRY
42#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind) \
43 static type WINAPI IMMSTUB_##name params { IMM_RETURN_##retkind((type)retval); }
44#include "immtable.h"
45
46// Win: gImmApiEntries
48/* initialize by stubs */
49#undef DEFINE_IMM_ENTRY
50#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind) \
51 IMMSTUB_##name,
52#include "immtable.h"
53};
54
55// Win: GetImmFileName
58{
60 if (length && length < cchBuffer)
61 {
63 return StringCchCatW(lpBuffer, cchBuffer, L"imm32.dll");
64 }
65 return StringCchCopyW(lpBuffer, cchBuffer, L"imm32.dll");
66}
67
68// @unimplemented
69// Win: _InitializeImmEntryTable
71{
72 WCHAR ImmFile[MAX_PATH];
73 HMODULE imm32 = ghImm32;
74
75 /* Check whether the IMM table has already been initialized */
76 if (IMM_FN(ImmWINNLSEnableIME) != IMMSTUB_ImmWINNLSEnableIME)
77 return TRUE;
78
79 User32GetImmFileName(ImmFile, _countof(ImmFile));
80 TRACE("File %S\n", ImmFile);
81
82 /* If IMM32 is already loaded, use it without increasing reference count. */
83 if (imm32 == NULL)
84 imm32 = GetModuleHandleW(ImmFile);
85
86 /*
87 * Loading imm32.dll will call imm32!DllMain function.
88 * imm32!DllMain calls User32InitializeImmEntryTable.
89 * Thus, if imm32.dll was loaded, the table has been loaded.
90 */
91 if (imm32 == NULL)
92 {
93 imm32 = ghImm32 = LoadLibraryW(ImmFile);
94 if (imm32 == NULL)
95 {
96 ERR("Did not load imm32.dll!\n");
97 return FALSE;
98 }
99 return TRUE;
100 }
101
102/* load imm procedures */
103#undef DEFINE_IMM_ENTRY
104#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind) \
105 do { \
106 FN_##name proc = (FN_##name)GetProcAddress(imm32, #name); \
107 if (!proc) { \
108 ERR("Could not load %s\n", #name); \
109 return FALSE; \
110 } \
111 IMM_FN(name) = proc; \
112 } while (0);
113#include "immtable.h"
114
115 return TRUE;
116}
117
118// Win: InitializeImmEntryTable
120{
123}
124
125// Win: User32InitializeImmEntryTable
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 User32GetImmFileName(ImmFile, _countof(ImmFile));
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
154// Win: ImeIsUsableContext
156{
158 return pIMC && (!pIMC->hImeWnd || pIMC->hImeWnd == hImeWnd || !ValidateHwnd(pIMC->hImeWnd));
159}
160
161// Win: GetIMEShowStatus
163{
165}
166
167/* Sends a message to the IME UI window. */
168/* Win: SendMessageToUI(pimeui, uMsg, wParam, lParam, !unicode) */
169static LRESULT
171{
172 LRESULT ret = 0;
173 HWND hwndUI = pimeui->hwndUI;
174 PWND pwnd, pwndUI;
175
176 ASSERT(pimeui->spwnd != NULL);
177
178 pwnd = pimeui->spwnd;
179 pwndUI = ValidateHwnd(hwndUI);
180 if (!pwnd || (pwnd->state & WNDS_DESTROYED) || (pwnd->state2 & WNDS2_INDESTROY) ||
181 !pwndUI || (pwndUI->state & WNDS_DESTROYED) || (pwndUI->state2 & WNDS2_INDESTROY))
182 {
183 return 0;
184 }
185
187
188 if (unicode)
189 ret = SendMessageW(hwndUI, uMsg, wParam, lParam);
190 else
191 ret = SendMessageA(hwndUI, uMsg, wParam, lParam);
192
194
195 return ret;
196}
197
198// Win: SendOpenStatusNotify
199static VOID User32NotifyOpenStatus(PIMEUI pimeui, HWND hwndIMC, BOOL bOpen)
200{
202
203 ASSERT(pimeui->spwnd != NULL);
204
205 pimeui->fShowStatus = bOpen;
206
207 if (LOWORD(GetWin32ClientInfo()->dwExpWinVer) >= 0x400)
208 SendMessageW(hwndIMC, WM_IME_NOTIFY, wParam, 0);
209 else
211}
212
213// Win: ImeMarkUsedContext
215{
217 if (!pIMC || pIMC->hImeWnd == hImeWnd)
218 return;
219
221}
222
223// Win: ImeSetImc
224static VOID User32UpdateImcOfImeUI(PIMEUI pimeui, HIMC hNewIMC)
225{
226 HWND hImeWnd;
227 HIMC hOldIMC = pimeui->hIMC;
228
229 ASSERT(pimeui->spwnd != NULL);
230 hImeWnd = UserHMGetHandle(pimeui->spwnd);
231
232 if (hNewIMC == hOldIMC)
233 return;
234
235 if (hOldIMC)
237
238 pimeui->hIMC = hNewIMC;
239
240 if (hNewIMC)
241 User32SetImeWindowOfImc(hNewIMC, hImeWnd);
242}
243
244/* Handles WM_IME_NOTIFY message of the default IME window. */
245/* Win: ImeNotifyHandler */
247{
248 LRESULT ret = 0;
249 HIMC hIMC;
250 LPINPUTCONTEXT pIC;
251 HWND hwndUI, hwndIMC, hImeWnd, hwndOwner;
252
253 ASSERT(pimeui->spwnd != NULL);
254
255 switch (wParam)
256 {
259 hIMC = pimeui->hIMC;
260 pIC = IMM_FN(ImmLockIMC)(hIMC);
261 if (pIC)
262 {
263 hwndIMC = pimeui->hwndIMC;
264 if (IsWindow(hwndIMC))
265 {
266 NtUserNotifyIMEStatus(hwndIMC, pIC->fOpen, pIC->fdwConversion);
267 }
268 else if (gfConIme == TRUE && pimeui->spwnd)
269 {
270 hImeWnd = UserHMGetHandle(pimeui->spwnd);
271 hwndOwner = GetWindow(hImeWnd, GW_OWNER);
272 if (hwndOwner)
273 {
274 NtUserNotifyIMEStatus(hwndOwner, pIC->fOpen, pIC->fdwConversion);
275 }
276 }
277
278 IMM_FN(ImmUnlockIMC)(hIMC);
279 }
280 /* FALL THROUGH */
281 default:
283 break;
284
285 case IMN_PRIVATE:
286 hwndUI = pimeui->hwndUI;
287 if (IsWindow(hwndUI))
289 break;
290 }
291
292 return ret;
293}
294
295/* Creates the IME UI window. */
296/* Win: CreateIMEUI */
298{
299 IMEINFOEX ImeInfoEx;
300 PIMEDPI pImeDpi;
301 WNDCLASSW wc;
302 HWND hwndUI = NULL;
303 CHAR szUIClass[32];
304 PWND pwnd = pimeui->spwnd;
305
306 ASSERT(pimeui->spwnd != NULL);
307
308 if (!pwnd || !IMM_FN(ImmGetImeInfoEx)(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
309 return NULL;
310
311 pImeDpi = IMM_FN(ImmLockImeDpi)(hKL);
312 if (!pImeDpi)
313 return NULL;
314
315 if (!GetClassInfoW(pImeDpi->hInst, ImeInfoEx.wszUIClass, &wc))
316 goto Quit;
317
318 if (ImeInfoEx.ImeInfo.fdwProperty & IME_PROP_UNICODE)
319 {
320 hwndUI = CreateWindowW(ImeInfoEx.wszUIClass, ImeInfoEx.wszUIClass, WS_POPUP | WS_DISABLED,
321 0, 0, 0, 0, UserHMGetHandle(pwnd), 0, wc.hInstance, NULL);
322 }
323 else
324 {
325 WideCharToMultiByte(CP_ACP, 0, ImeInfoEx.wszUIClass, -1,
326 szUIClass, _countof(szUIClass), NULL, NULL);
327 szUIClass[_countof(szUIClass) - 1] = 0;
328
329 hwndUI = CreateWindowA(szUIClass, szUIClass, WS_POPUP | WS_DISABLED,
330 0, 0, 0, 0, UserHMGetHandle(pwnd), 0, wc.hInstance, NULL);
331 }
332
333 if (hwndUI)
335
336Quit:
337 IMM_FN(ImmUnlockImeDpi)(pImeDpi);
338 return hwndUI;
339}
340
341/* Initializes the default IME window. */
342/* Win: ImeWndCreateHandler */
344{
345 PWND pParentWnd, pWnd = pimeui->spwnd;
346 HIMC hIMC = NULL;
347
348 if (!pWnd || (pWnd->style & (WS_DISABLED | WS_POPUP)) != (WS_DISABLED | WS_POPUP))
349 return -1;
350
351 pParentWnd = ValidateHwnd(lpCS->hwndParent);
352 if (pParentWnd)
353 {
354 hIMC = pParentWnd->hImc;
355 if (hIMC && !User32CanSetImeWindowToImc(hIMC, UserHMGetHandle(pWnd)))
356 hIMC = NULL;
357 }
358
359 User32UpdateImcOfImeUI(pimeui, hIMC);
360
361 pimeui->fShowStatus = FALSE;
362 pimeui->nCntInIMEProc = 0;
363 pimeui->fActivate = FALSE;
364 pimeui->fDestroy = FALSE;
365 pimeui->hwndIMC = NULL;
366 pimeui->hKL = GetWin32ClientInfo()->hKL;
367 pimeui->fCtrlShowStatus = TRUE;
368 pimeui->dwLastStatus = 0;
369
370 return 0;
371}
372
373/* Destroys the IME UI window. */
374/* Win: DestroyIMEUI */
376{
377 HWND hwndUI = pimeui->hwndUI;
378
379 if (IsWindow(hwndUI))
380 {
381 pimeui->fDestroy = TRUE;
382 NtUserDestroyWindow(hwndUI);
383 }
384
385 pimeui->fShowStatus = pimeui->fDestroy = FALSE;
386 pimeui->hwndUI = NULL;
387}
388
389/* Handles WM_IME_SELECT message of the default IME window. */
390/* Win: ImeSelectHandler */
392{
393 HKL hKL;
394 HWND hwndUI, hwndIMC = pimeui->hwndIMC;
395
396 if (wParam)
397 {
398 pimeui->hKL = hKL = (HKL)lParam;
399
400 if (!pimeui->fActivate)
401 return;
402
403 pimeui->hwndUI = hwndUI = User32CreateImeUIWindow(pimeui, hKL);
404 if (hwndUI)
406
408 {
409 if (!pimeui->fShowStatus && pimeui->fActivate && IsWindow(hwndIMC))
410 User32NotifyOpenStatus(pimeui, hwndIMC, TRUE);
411 }
412 }
413 else
414 {
415 if (pimeui->fShowStatus && pimeui->fActivate && IsWindow(hwndIMC))
416 User32NotifyOpenStatus(pimeui, hwndIMC, FALSE);
417
420 pimeui->hKL = NULL;
421 }
422}
423
424/* Handles WM_IME_CONTROL message of the default IME window. */
425/* Win: ImeControlHandler(pimeui, wParam, lParam, !unicode) */
426static LRESULT
428{
429 HIMC hIMC = pimeui->hIMC;
430 DWORD dwConversion, dwSentence;
431 POINT pt;
432
433 if (IS_CICERO_MODE())
434 {
436 {
438 pimeui->dwLastStatus = 0;
439 }
440 else if (wParam == IMC_CLOSESTATUSWINDOW)
441 {
443 }
444 }
445
446 if (!hIMC)
447 return 0;
448
449 switch (wParam)
450 {
452 if (!IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence))
453 return 1;
454 return dwConversion;
455
457 if (!IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence))
458 return 1;
459 return dwSentence;
460
462 return IMM_FN(ImmGetOpenStatus)(hIMC);
463
465 if (!IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence) ||
466 !IMM_FN(ImmSetConversionStatus)(hIMC, (DWORD)lParam, dwSentence))
467 {
468 return 1;
469 }
470 break;
471
473 if (!IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence) ||
474 !IMM_FN(ImmSetConversionStatus)(hIMC, dwConversion, (DWORD)lParam))
475 {
476 return 1;
477 }
478 break;
479
481 if (!IMM_FN(ImmSetOpenStatus)(hIMC, (BOOL)lParam))
482 return 1;
483 break;
484
490 return User32SendImeUIMessage(pimeui, WM_IME_CONTROL, wParam, lParam, unicode);
491
494 return 1;
495 break;
496
498 if (unicode)
499 {
501 return 1;
502 }
503 else
504 {
506 return 1;
507 }
508 break;
509
511 if (unicode)
512 {
514 return 1;
515 }
516 else
517 {
519 return 1;
520 }
521 break;
522
525 return 1;
526 break;
527
531 if (!IMM_FN(ImmSetStatusWindowPos)(hIMC, &pt))
532 return 1;
533 break;
534
536 if (pimeui->fShowStatus && User32GetImeShowStatus())
537 {
538 pimeui->fShowStatus = FALSE;
540 }
541 pimeui->fCtrlShowStatus = FALSE;
542 break;
543
545 if (!pimeui->fShowStatus && User32GetImeShowStatus())
546 {
547 pimeui->fShowStatus = TRUE;
549 }
550 pimeui->fCtrlShowStatus = TRUE;
551 break;
552
553 default:
554 break;
555 }
556
557 return 0;
558}
559
560/* Modify the IME activation status. */
561/* Win: FocusSetIMCContext */
563{
564 HIMC hIMC;
565
566 if (!hWnd || !IsWindow(hWnd))
567 {
569 return;
570 }
571
572 hIMC = IMM_FN(ImmGetContext)(hWnd);
573 IMM_FN(ImmSetActiveContext)(hWnd, hIMC, bActive);
575}
576
577/* Win: CtfLoadThreadLayout */
579{
580 IMM_FN(CtfImmTIMActivate)(pimeui->hKL);
581 pimeui->hKL = GetWin32ClientInfo()->hKL;
582 IMM_FN(ImmLoadIME)(pimeui->hKL);
583 pimeui->hwndUI = NULL;
584}
585
586/* Open the IME help or check the existence of the IME help. */
587static LRESULT FASTCALL
589{
592 size_t cch;
593
594 /* Is there any IME help file? */
595 ret = IMM_FN(ImmEscapeW)(pimeui->hKL, pimeui->hIMC, IME_ESC_QUERY_SUPPORT, &dwEsc);
596 if (!ret || !lParam)
597 return ret;
598
599 /* Get the help filename */
601 {
602 /* Check filename extension */
604 if (cch > 4 && _wcsicmp(&szHelpFile[cch - 4], L".HLP") == 0)
605 {
606 /* Open the old-style help */
607 TRACE("szHelpFile: %s\n", debugstr_w(szHelpFile));
609 }
610 else
611 {
612 /* Open the new-style help */
613 FIXME("(%p, %p, %p): %s\n", pimeui, wParam, lParam, debugstr_w(szHelpFile));
614 ret = FALSE;
615 }
616 }
617
618 return ret;
619}
620
621static BOOL CALLBACK
623{
624 DWORD dwConversion, dwSentence, dwNewConversion;
625
626 IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence);
627
628 if (lParam)
629 dwNewConversion = dwConversion | IME_CMODE_SOFTKBD;
630 else
631 dwNewConversion = dwConversion & ~IME_CMODE_SOFTKBD;
632
633 if (dwNewConversion != dwConversion)
634 IMM_FN(ImmSetConversionStatus)(hIMC, dwNewConversion, dwSentence);
635
636 return TRUE;
637}
638
639/* Handles WM_IME_SYSTEM message of the default IME window. */
641{
642 LRESULT ret = 0;
644 HIMC hIMC = pimeui->hIMC;
645 LPCANDIDATEFORM pCandForm;
646 LPCOMPOSITIONFORM pCompForm;
647 DWORD dwConversion, dwSentence;
648 HWND hImeWnd;
649 BOOL bCompForm;
650 CANDIDATEFORM CandForm;
651 COMPOSITIONFORM CompForm;
652 UINT iCandForm;
653
654 ASSERT(pimeui->spwnd != NULL);
655
656 switch (wParam)
657 {
660 {
661 hImeWnd = UserHMGetHandle(pimeui->spwnd);
663 }
664 break;
665
666 case IMS_UPDATEIMEUI:
667 if (!hIMC)
668 break;
669
670 bCompForm = TRUE;
671 pIC = IMM_FN(ImmLockIMC)(hIMC);
672 if (pIC)
673 {
674 bCompForm = !(pIC->dwUIFlags & 0x2);
675 IMM_FN(ImmUnlockIMC)(hIMC);
676 }
677
678 if (!IsWindow(pimeui->hwndIMC))
679 break;
680
681 if (bCompForm && IMM_FN(ImmGetCompositionWindow)(hIMC, &CompForm))
682 {
683 if (CompForm.dwStyle)
684 IMM_FN(ImmSetCompositionWindow)(hIMC, &CompForm);
685 }
686
687 for (iCandForm = 0; iCandForm < MAX_CANDIDATEFORM; ++iCandForm)
688 {
689 if (IMM_FN(ImmGetCandidateWindow)(hIMC, iCandForm, &CandForm))
690 {
691 if (CandForm.dwStyle)
692 IMM_FN(ImmSetCandidateWindow)(hIMC, &CandForm);
693 }
694 }
695 break;
696
697 case IMS_SETCANDFORM:
698 pIC = IMM_FN(ImmLockIMC)(hIMC);
699 if (!pIC)
700 break;
701
702 pCandForm = &pIC->cfCandForm[lParam];
703 IMM_FN(ImmSetCandidateWindow)(hIMC, pCandForm);
704 IMM_FN(ImmUnlockIMC)(hIMC);
705 break;
706
707 case IMS_SETCOMPFONT:
708 pIC = IMM_FN(ImmLockIMC)(hIMC);
709 if (!pIC)
710 break;
711
712 IMM_FN(ImmSetCompositionFontW)(hIMC, &pIC->lfFont.W);
713 IMM_FN(ImmUnlockIMC)(hIMC);
714 break;
715
716 case IMS_SETCOMPFORM:
717 pIC = IMM_FN(ImmLockIMC)(hIMC);
718 if (!pIC)
719 break;
720
721 pCompForm = &pIC->cfCompForm;
722 pIC->dwUIFlags |= 0x8;
723 IMM_FN(ImmSetCompositionWindow)(hIMC, pCompForm);
724 IMM_FN(ImmUnlockIMC)(hIMC);
725 break;
726
727 case IMS_CONFIGURE:
729 break;
730
732 if (hIMC)
734 break;
735
736 case IMS_FREELAYOUT:
738 break;
739
740 case IMS_SOFTKBDONOFF:
742 break;
743
745 IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence);
746 ret = dwConversion;
747 break;
748
749 case IMS_IMEHELP:
750 return User32DoImeHelp(pimeui, wParam, lParam);
751
752 case IMS_IMEACTIVATE:
754 break;
755
758 break;
759
762 break;
763
764 case IMS_GETIMEMENU:
766 break;
767
768 case 0x1D:
769 FIXME("\n");
770 break;
771
772 case IMS_GETCONTEXT:
774 break;
775
778 case IMS_SETLANGBAND:
781 break;
782
784 CtfLoadThreadLayout(pimeui);
785 break;
786
787 default:
788 break;
789 }
790
791 return ret;
792}
793
794/* Handles WM_IME_SETCONTEXT message of the default IME window. */
795/* Win: ImeSetContextHandler */
797{
798 LRESULT ret;
799 HIMC hIMC;
801 HWND hwndFocus, hwndOldImc, hwndNewImc, hImeWnd, hwndActive, hwndOwner;
802 PWND pwndFocus, pImeWnd, pwndOwner;
803 COMPOSITIONFORM CompForm;
804
805 pimeui->fActivate = !!wParam;
806 hwndOldImc = pimeui->hwndIMC;
807 ASSERT(pimeui->spwnd != NULL);
808
809 if (wParam)
810 {
811 if (!pimeui->hwndUI)
812 pimeui->hwndUI = User32CreateImeUIWindow(pimeui, pimeui->hKL);
813
814 if (gfConIme == -1)
815 {
817 if (gfConIme)
818 pimeui->fCtrlShowStatus = FALSE;
819 }
820
821 hImeWnd = UserHMGetHandle(pimeui->spwnd);
822
823 if (gfConIme)
824 {
825 hwndOwner = GetWindow(hImeWnd, GW_OWNER);
826 pwndOwner = ValidateHwnd(hwndOwner);
827 if (pwndOwner)
828 {
829 User32UpdateImcOfImeUI(pimeui, pwndOwner->hImc);
830
831 if (pimeui->hwndUI)
832 SetWindowLongPtrW(pimeui->hwndUI, IMMGWLP_IMC, (LONG_PTR)pwndOwner->hImc);
833 }
834
836 }
837
838 hwndFocus = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_FOCUS);
839
840 hIMC = IMM_FN(ImmGetContext)(hwndFocus);
841
842 if (hIMC && !User32CanSetImeWindowToImc(hIMC, hImeWnd))
843 {
845 return 0;
846 }
847
848 User32UpdateImcOfImeUI(pimeui, hIMC);
849
850 if (pimeui->hwndUI)
852
853 if (hIMC)
854 {
855 pIC = IMM_FN(ImmLockIMC)(hIMC);
856 if (!pIC)
857 return 0;
858
859 if (hwndFocus != pIC->hWnd)
860 {
861 IMM_FN(ImmUnlockIMC)(hIMC);
862 return 0;
863 }
864
865 if ((pIC->dwUIFlags & 0x40000) && hwndOldImc != hwndFocus)
866 {
867 RtlZeroMemory(&CompForm, sizeof(CompForm));
868 IMM_FN(ImmSetCompositionWindow)(hIMC, &CompForm);
869
870 pIC->dwUIFlags &= ~0x40000;
871 }
872
873 IMM_FN(ImmUnlockIMC)(hIMC);
874
875 hImeWnd = UserHMGetHandle(pimeui->spwnd);
876 if (NtUserSetImeOwnerWindow(hImeWnd, hwndFocus))
877 pimeui->hwndIMC = hwndFocus;
878 }
879 else
880 {
881 pimeui->hwndIMC = hwndFocus;
882
883 hImeWnd = UserHMGetHandle(pimeui->spwnd);
885 }
886 }
887
889
890 if (!pimeui->spwnd)
891 return 0;
892
893 if (!pimeui->fCtrlShowStatus || !User32GetImeShowStatus())
894 return ret;
895
896 hImeWnd = UserHMGetHandle(pimeui->spwnd);
897 hwndFocus = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_FOCUS);
898 pwndFocus = ValidateHwnd(hwndFocus);
899
900 if (wParam)
901 {
902 pImeWnd = ValidateHwnd(hImeWnd);
903 if (pwndFocus && pImeWnd && pImeWnd->head.pti == pwndFocus->head.pti)
904 {
905 hwndNewImc = pimeui->hwndIMC;
906 if (pimeui->fShowStatus)
907 {
908 if (hwndOldImc && hwndNewImc && hwndOldImc != hwndNewImc &&
909 IntGetTopLevelWindow(hwndOldImc) != IntGetTopLevelWindow(hwndNewImc))
910 {
911 User32NotifyOpenStatus(pimeui, hwndOldImc, FALSE);
912 User32NotifyOpenStatus(pimeui, hwndNewImc, TRUE);
913 }
914 }
915 else
916 {
917 if (ValidateHwnd(hwndNewImc))
918 User32NotifyOpenStatus(pimeui, hwndNewImc, TRUE);
919 }
920 }
921
922 pImeWnd = pimeui->spwnd;
923 hImeWnd = (pImeWnd ? UserHMGetHandle(pImeWnd) : NULL);
924 if (hImeWnd)
926 }
927 else
928 {
929 pImeWnd = pimeui->spwnd;
930 hImeWnd = UserHMGetHandle(pImeWnd);
931 hwndActive = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_ACTIVE);
932 if (!pwndFocus || !hwndActive || pImeWnd->head.pti != pwndFocus->head.pti)
933 {
934 if (IsWindow(hwndOldImc))
935 {
936 User32NotifyOpenStatus(pimeui, hwndOldImc, FALSE);
937 }
938 else
939 {
940 pimeui->fShowStatus = FALSE;
942 }
943 }
944 }
945
946 return ret;
947}
948
949/* The window procedure of the default IME window */
950/* Win: ImeWndProcWorker(pWnd, msg, wParam, lParam, !unicode) */
953{
954 PWND pWnd;
955 PIMEUI pimeui;
956 LRESULT ret;
957
958 pWnd = ValidateHwnd(hwnd);
959 if (pWnd == NULL)
960 {
961 ERR("hwnd was %p\n", hwnd);
962 return 0;
963 }
964
965 if (!pWnd->fnid)
966 {
968 }
969 else if (pWnd->fnid != FNID_IME)
970 {
971 ERR("fnid was 0x%x\n", pWnd->fnid);
972 return 0;
973 }
974
975 pimeui = (PIMEUI)GetWindowLongPtrW(hwnd, 0);
976 if (pimeui == NULL)
977 {
978 pimeui = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMEUI));
979 if (pimeui == NULL)
980 {
981 ERR("HeapAlloc failed\n");
984 return 0;
985 }
986
987 SetWindowLongPtrW(hwnd, 0, (LONG_PTR)pimeui);
988 pimeui->spwnd = pWnd;
989 }
990
991 if (IS_CICERO_MODE())
992 {
994 if (ret)
995 return ret;
996 }
997
998 if (pimeui->nCntInIMEProc > 0)
999 {
1000 switch (msg)
1001 {
1002 case WM_IME_CHAR:
1004 case WM_IME_CONTROL:
1005 case WM_IME_REQUEST:
1006 case WM_IME_SELECT:
1007 case WM_IME_SETCONTEXT:
1008 case WM_IME_STARTCOMPOSITION:
1009 case WM_IME_COMPOSITION:
1010 case WM_IME_ENDCOMPOSITION:
1011 return 0;
1012
1013 case WM_IME_NOTIFY:
1014 if (wParam < IMN_PRIVATE || IS_IME_HKL(pimeui->hKL) || !IS_CICERO_MODE())
1015 return 0;
1016 break;
1017
1018 case WM_IME_SYSTEM:
1019 switch (wParam)
1020 {
1021 case 0x03:
1022 case 0x10:
1023 case 0x13:
1024 break;
1025
1026 default:
1027 return 0;
1028 }
1029 break;
1030
1031 default:
1032 goto Finish;
1033 }
1034 }
1035
1036 if ((pWnd->state2 & WNDS2_INDESTROY) || (pWnd->state & WNDS_DESTROYED))
1037 {
1038 switch (msg)
1039 {
1040 case WM_DESTROY:
1041 case WM_NCDESTROY:
1042 case WM_FINALDESTROY:
1043 break;
1044
1045 default:
1046 return 0;
1047 }
1048 }
1049
1050 switch (msg)
1051 {
1052 case WM_CREATE:
1053 return ImeWnd_OnCreate(pimeui, (LPCREATESTRUCT)lParam);
1054
1055 case WM_DESTROY:
1057 return 0;
1058
1059 case WM_NCDESTROY:
1060 case WM_FINALDESTROY:
1061 pimeui->spwnd = NULL;
1062 HeapFree(GetProcessHeap(), 0, pimeui);
1064 break;
1065
1066 case WM_ERASEBKGND:
1067 return TRUE;
1068
1069 case WM_PAINT:
1070 return 0;
1071
1072 case WM_IME_STARTCOMPOSITION:
1073 case WM_IME_COMPOSITION:
1074 case WM_IME_ENDCOMPOSITION:
1075 return User32SendImeUIMessage(pimeui, msg, wParam, lParam, unicode);
1076
1077 case WM_IME_CONTROL:
1078 return ImeWnd_OnImeControl(pimeui, wParam, lParam, unicode);
1079
1080 case WM_IME_NOTIFY:
1081 return ImeWnd_OnImeNotify(pimeui, wParam, lParam);
1082
1083 case WM_IME_REQUEST:
1084 return 0;
1085
1086 case WM_IME_SELECT:
1088 return (LRESULT)pimeui;
1089
1090 case WM_IME_SETCONTEXT:
1091 return ImeWnd_OnImeSetContext(pimeui, wParam, lParam);
1092
1093 case WM_IME_SYSTEM:
1094 return ImeWnd_OnImeSystem(pimeui, wParam, lParam);
1095
1096 default:
1097 break;
1098 }
1099
1100Finish:
1101 if (unicode)
1102 return DefWindowProcW(hwnd, msg, wParam, lParam);
1103 return DefWindowProcA(hwnd, msg, wParam, lParam);
1104}
1105
1106// Win: ImeWndProcA
1108{
1110}
1111
1112// Win: ImeWndProcW
1114{
1116}
1117
1118// Win: UpdatePerUserImmEnabling
1120{
1121 HMODULE imm32;
1122 BOOL ret;
1123
1125 if (!ret || !(gpsi->dwSRVIFlags & SRVINFO_IMM32))
1126 return FALSE;
1127
1128 imm32 = GetModuleHandleW(L"imm32.dll");
1129 if (imm32)
1130 return TRUE;
1131
1132 imm32 = LoadLibraryW(L"imm32.dll");
1133 if (imm32 == NULL)
1134 {
1135 ERR("Imm32 not installed!\n");
1136 ret = FALSE;
1137 }
1138
1139 return ret;
1140}
1141
1142BOOL
1143WINAPI
1145{
1146 ATOM atom;
1147 WNDCLASSEXW WndClass = { sizeof(WndClass) };
1148
1149 WndClass.lpszClassName = L"IME";
1150 WndClass.style = CS_GLOBALCLASS;
1151 WndClass.lpfnWndProc = ImeWndProcW;
1152 WndClass.cbWndExtra = sizeof(LONG_PTR);
1153 WndClass.hCursor = LoadCursorW(NULL, IDC_ARROW);
1154
1155 atom = RegisterClassExWOWW(&WndClass, 0, FNID_IME, 0, FALSE);
1156 if (!atom)
1157 {
1158 ERR("Failed to register IME Class!\n");
1159 return FALSE;
1160 }
1161
1163 TRACE("RegisterIMEClass atom = %u\n", atom);
1164 return TRUE;
1165}
1166
1167/*
1168 * @implemented
1169 */
1170BOOL
1171WINAPI
1173{
1174 return IMM_FN(ImmIMPSetIMEW)(hwnd, ime);
1175}
1176
1177/*
1178 * @implemented
1179 */
1180BOOL
1181WINAPI
1183{
1184 return IMM_FN(ImmIMPQueryIMEW)(ime);
1185}
1186
1187/*
1188 * @implemented
1189 */
1190BOOL
1191WINAPI
1193{
1194 return IMM_FN(ImmIMPGetIMEW)(hwnd, ime);
1195}
1196
1197/*
1198 * @implemented
1199 */
1200BOOL
1201WINAPI
1203{
1204 return IMM_FN(ImmIMPSetIMEA)(hwnd, ime);
1205}
1206
1207/*
1208 * @implemented
1209 */
1210BOOL
1211WINAPI
1213{
1214 return IMM_FN(ImmIMPQueryIMEA)(ime);
1215}
1216
1217/*
1218 * @implemented
1219 */
1220BOOL
1221WINAPI
1223{
1224 return IMM_FN(ImmIMPGetIMEA)(hwnd, ime);
1225}
1226
1227/*
1228 * @implemented
1229 */
1230LRESULT
1231WINAPI
1233{
1235}
1236
1237/*
1238 * @implemented
1239 */
1240LRESULT
1241WINAPI
1243{
1245}
1246
1247/*
1248 * @implemented
1249 */
1250BOOL
1251WINAPI
1253{
1255}
1256
1257/*
1258 * @implemented
1259 */
1260BOOL
1261WINAPI
1263{
1265}
1266
1267/*
1268 * @implemented
1269 */
1270UINT
1271WINAPI
1273{
1274 return FALSE;
1275}
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
BOOL WINAPI ImmSetCandidateWindow(HIMC hIMC, LPCANDIDATEFORM lpCandidate)
Definition: candidate.c:410
BOOL WINAPI ImmGetCandidateWindow(HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandidate)
Definition: candidate.c:377
WCHAR WndClass[]
Definition: capicon.c:23
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
VOID WINAPI CtfImmRestoreToolbarWnd(_In_ LPVOID pUnused, _In_ DWORD dwShowFlags)
Definition: ctf.c:1391
LRESULT WINAPI CtfImmDispatchDefImeMessage(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam)
Definition: ctf.c:1416
HRESULT WINAPI CtfImmTIMActivate(_In_ HKL hKL)
Definition: ctf.c:1123
DWORD WINAPI CtfImmHideToolbarWnd(VOID)
Definition: ctf.c:1362
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 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
BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1204
BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
Definition: ime.c:1389
BOOL WINAPI ImmGetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
Definition: ime.c:1260
PIMEDPI WINAPI ImmLockImeDpi(HKL hKL)
Definition: ime.c:657
BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
Definition: ime.c:1333
VOID WINAPI ImmUnlockImeDpi(PIMEDPI pImeDpi)
Definition: ime.c:686
BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
Definition: ime.c:1698
BOOL WINAPI ImmGetOpenStatus(HIMC hIMC)
Definition: ime.c:1088
BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence)
Definition: ime.c:1584
BOOL WINAPI ImmSetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
Definition: ime.c:1176
LRESULT WINAPI ImmEscapeW(HKL hKL, HIMC hIMC, UINT uSubFunc, LPVOID lpData)
Definition: ime.c:1010
BOOL WINAPI ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
Definition: ime.c:618
BOOL WINAPI ImmWINNLSEnableIME(HWND hWnd, BOOL enable)
Definition: ime.c:1753
BOOL WINAPI ImmGetConversionStatus(HIMC hIMC, LPDWORD lpfdwConversion, LPDWORD lpfdwSentence)
Definition: ime.c:1555
BOOL WINAPI ImmLoadIME(HKL hKL)
Definition: ime.c:734
BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
Definition: ime.c:1111
BOOL WINAPI ImmSetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1228
BOOL WINAPI ImmGetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
Definition: ime.c:1296
BOOL WINAPI ImmUnlockIMC(HIMC hIMC)
Definition: imm.c:1067
HIMC WINAPI ImmGetContext(HWND hWnd)
Definition: imm.c:1045
BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
Definition: imm.c:1086
BOOL WINAPI ImmSetActiveContext(HWND hWnd, HIMC hIMC, BOOL fActive)
Definition: imm.c:1125
LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC hIMC)
Definition: imm.c:1058
SHAREDINFO gSharedInfo
Definition: imm.c:19
BOOL WINAPI ImmEnumInputContext(DWORD dwThreadId, IMCENUMPROC lpfn, LPARAM lParam)
Definition: imm.c:1097
BOOL WINAPI ImmRegisterClient(PSHAREDINFO ptr, HINSTANCE hMod)
Definition: imm.c:57
BOOL WINAPI ImmFreeLayout(HKL hKL)
Definition: imm.c:117
PSERVERINFO gpsi
Definition: imm.c:18
BOOL WINAPI ImmActivateLayout(HKL hKL)
Definition: imm.c:443
BOOL WINAPI ImmWINNLSGetEnableStatus(HWND hWnd)
Definition: imm.c:1223
#define ValidateHwnd(hwnd)
Definition: precomp.h:110
#define IMM_INIT_MAGIC
Definition: precomp.h:75
#define MAX_CANDIDATEFORM
Definition: precomp.h:78
LPVOID FASTCALL ValidateHandle(HANDLE hObject, UINT uType)
Definition: utils.c:242
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2313
#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
LRESULT WINAPI ImmPutImeMenuItemsIntoMappedFile(_In_ HIMC hIMC)
Definition: imemenu.c:377
BOOL WINAPI ImmIMPQueryIMEA(LPIMEPROA pImePro)
Definition: imepro.c:103
BOOL WINAPI ImmIMPGetIMEW(_In_opt_ HWND hWnd, _Out_ LPIMEPROW pImePro)
Definition: imepro.c:84
BOOL WINAPI ImmIMPGetIMEA(_In_opt_ HWND hWnd, _Out_ LPIMEPROA pImePro)
Definition: imepro.c:59
BOOL WINAPI ImmIMPSetIMEA(HWND hWnd, LPIMEPROA pImePro)
Definition: imepro.c:123
BOOL WINAPI ImmIMPQueryIMEW(LPIMEPROW pImePro)
Definition: imepro.c:113
BOOL WINAPI ImmIMPSetIMEW(HWND hWnd, LPIMEPROW pImePro)
Definition: imepro.c:133
#define IS_IME_HKL(hKL)
Definition: imm32_undoc.h:21
@ ImeInfoExKeyboardLayout
Definition: imm32_undoc.h:53
#define IMC_SETCANDIDATEPOS
Definition: imm.h:149
#define IME_PROP_UNICODE
Definition: imm.h:249
#define IMC_CLOSESTATUSWINDOW
Definition: imm.h:156
#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
#define IMC_SETCOMPOSITIONWINDOW
Definition: imm.h:153
#define IMN_PRIVATE
Definition: imm.h:385
#define IMC_GETCANDIDATEPOS
Definition: imm.h:148
#define IME_ESC_GETHELPFILENAME
Definition: imm.h:424
#define IMN_OPENSTATUSWINDOW
Definition: imm.h:373
#define IMC_GETCOMPOSITIONFONT
Definition: imm.h:150
#define IMC_SETCOMPOSITIONFONT
Definition: imm.h:151
#define IMN_SETOPENSTATUS
Definition: imm.h:379
#define IMC_OPENSTATUSWINDOW
Definition: imm.h:157
#define IMN_CLOSESTATUSWINDOW
Definition: imm.h:372
#define IMC_GETSTATUSWINDOWPOS
Definition: imm.h:154
#define IMN_SETCONVERSIONMODE
Definition: imm.h:377
#define IME_CONFIG_GENERAL
Definition: imm.h:405
#define IMS_IMEHELP
Definition: immdev.h:108
#define IMC_SETOPENSTATUS
Definition: immdev.h:395
#define IMS_GETIMEMENU
Definition: immdev.h:112
#define IMS_SETOPENSTATUS
Definition: immdev.h:104
#define IMC_SETCONVERSIONMODE
Definition: immdev.h:393
#define IMC_SETSENTENCEMODE
Definition: immdev.h:394
#define IMS_IMEACTIVATE
Definition: immdev.h:109
#define IMS_UPDATEIMEUI
Definition: immdev.h:99
#define IMS_GETCONTEXT
Definition: immdev.h:113
#define IMS_SETCANDFORM
Definition: immdev.h:100
#define IMS_SETLANGBAND
Definition: immdev.h:117
#define IMC_GETSOFTKBDPOS
Definition: immdev.h:91
#define IMS_COMPLETECOMPSTR
Definition: immdev.h:115
#define IMS_UNSETLANGBAND
Definition: immdev.h:118
#define IMS_SETCOMPFONT
Definition: immdev.h:101
#define IMS_GETCONVSTATUS
Definition: immdev.h:107
#define IMS_CONFIGURE
Definition: immdev.h:103
#define IMS_NOTIFYIMESHOW
Definition: immdev.h:98
#define IMS_LOADTHREADLAYOUT
Definition: immdev.h:116
#define IMS_SOFTKBDONOFF
Definition: immdev.h:106
#define IMS_FREELAYOUT
Definition: immdev.h:105
#define IMC_GETSENTENCEMODE
Definition: immdev.h:87
#define IMS_ACTIVATELAYOUT
Definition: immdev.h:111
#define IMC_GETOPENSTATUS
Definition: immdev.h:88
#define IMS_IMEDEACTIVATE
Definition: immdev.h:110
#define IMMGWLP_IMC
Definition: immdev.h:126
#define IMC_SETSOFTKBDPOS
Definition: immdev.h:92
#define IMS_SETCOMPFORM
Definition: immdev.h:102
#define IMS_SENDNOTIFICATION
Definition: immdev.h:114
#define IMC_GETCONVERSIONMODE
Definition: immdev.h:86
_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:2835
#define FNID_DESTROY
Definition: ntuser.h:898
#define QUERY_WINDOW_ACTIVE
Definition: ntuser.h:2834
struct tagIMEUI * PIMEUI
#define WNDS_DESTROYED
Definition: ntuser.h:636
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
DWORD_PTR NTAPI NtUserCallNoParam(DWORD Routine)
Definition: simplecall.c:59
DWORD NTAPI NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion)
Definition: ime.c:803
DWORD NTAPI NtUserCallHwndParamLock(HWND hWnd, DWORD_PTR Param, DWORD Routine)
Definition: simplecall.c:895
#define NtUserSetWindowLongPtr
Definition: ntuser.h:3293
BOOL NTAPI NtUserSetImeOwnerWindow(HWND hImeWnd, HWND hwndFocus)
Definition: ime.c:1362
@ THREADSTATE_CHECKCONIME
Definition: ntuser.h:2494
BOOLEAN NTAPI NtUserDestroyWindow(HWND Wnd)
Definition: window.c:3054
@ NOPARAM_ROUTINE_GETIMESHOWSTATUS
Definition: ntuser.h:1518
@ HWNDLOCK_ROUTINE_CHECKIMESHOWSTATUSINTHRD
Definition: ntuser.h:1634
@ NOPARAM_ROUTINE_UPDATEPERUSERIMMENABLING
Definition: ntuser.h:1544
@ TWOPARAM_ROUTINE_IMESHOWSTATUSCHANGE
Definition: ntuser.h:1643
@ 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:1762
#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
LRESULT WINAPI ImmSystemHandler(HIMC hIMC, WPARAM wParam, LPARAM lParam)
Definition: keymsg.c:813
#define ASSERT(a)
Definition: mode.c:44
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
UINT_PTR HKL
Definition: msctf.idl:143
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
#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:66
HINSTANCE hInstance
Definition: winuser.h:3191
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:134
Definition: ntuser.h:199
HWND hImeWnd
Definition: ntuser.h:203
IMEINFO ImeInfo
Definition: imm32_undoc.h:35
WCHAR wszUIClass[16]
Definition: imm32_undoc.h:36
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
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:311
#define WM_IME_SYSTEM
Definition: undocuser.h:60
#define WM_FINALDESTROY
Definition: undocuser.h:39
#define IMM_FN(name)
Definition: user32p.h:56
int ret
static VOID User32SetImeWindowOfImc(HIMC hIMC, HWND hImeWnd)
Definition: imm.c:214
BOOL gbImmInitializing
Definition: imm.c:22
BOOL WINAPI IMPSetIMEW(HWND hwnd, LPIMEPROW ime)
Definition: imm.c:1172
static VOID User32DestroyImeUIWindow(PIMEUI pimeui)
Definition: imm.c:375
BOOL WINAPI IMPQueryIMEA(LPIMEPROA ime)
Definition: imm.c:1212
UINT WINAPI WINNLSGetIMEHotkey(HWND hwnd)
Definition: imm.c:1272
Imm32ApiTable gImmApiEntries
Definition: imm.c:47
LRESULT WINAPI ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:952
BOOL WINAPI IMPQueryIMEW(LPIMEPROW ime)
Definition: imm.c:1182
HRESULT User32GetImmFileName(_Out_ LPWSTR lpBuffer, _In_ size_t cchBuffer)
Definition: imm.c:57
static BOOL User32GetImeShowStatus(VOID)
Definition: imm.c:162
LRESULT ImeWnd_OnImeSetContext(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:796
static INT ImeWnd_OnCreate(PIMEUI pimeui, LPCREATESTRUCT lpCS)
Definition: imm.c:343
static VOID FASTCALL User32SetImeActivenessOfWindow(HWND hWnd, BOOL bActive)
Definition: imm.c:562
static HWND User32CreateImeUIWindow(PIMEUI pimeui, HKL hKL)
Definition: imm.c:297
INT gfConIme
Definition: imm.c:24
LRESULT WINAPI SendIMEMessageExA(HWND hwnd, LPARAM lParam)
Definition: imm.c:1242
static BOOL IntInitializeImmEntryTable(VOID)
Definition: imm.c:70
static LRESULT User32SendImeUIMessage(PIMEUI pimeui, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:170
LRESULT WINAPI ImeWndProcA(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: imm.c:1107
BOOL WINAPI UpdatePerUserImmEnabling(VOID)
Definition: imm.c:1119
BOOL WINAPI InitializeImmEntryTable(VOID)
Definition: imm.c:119
static LRESULT ImeWnd_OnImeSystem(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:640
VOID FASTCALL CtfLoadThreadLayout(PIMEUI pimeui)
Definition: imm.c:578
static LRESULT ImeWnd_OnImeControl(PIMEUI pimeui, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:427
BOOL WINAPI IMPGetIMEA(HWND hwnd, LPIMEPROA ime)
Definition: imm.c:1222
static BOOL User32CanSetImeWindowToImc(HIMC hIMC, HWND hImeWnd)
Definition: imm.c:155
BOOL WINAPI IMPSetIMEA(HWND hwnd, LPIMEPROA ime)
Definition: imm.c:1202
HINSTANCE ghImm32
Definition: imm.c:20
BOOL WINAPI WINNLSEnableIME(HWND hwnd, BOOL enable)
Definition: imm.c:1252
BOOL WINAPI RegisterIMEClass(VOID)
Definition: imm.c:1144
HWND FASTCALL IntGetTopLevelWindow(HWND hWnd)
Definition: imm.c:26
static BOOL CALLBACK ImeWnd_SwitchSoftKbdProc(_In_ HIMC hIMC, _In_ LPARAM lParam)
Definition: imm.c:622
static VOID ImeWnd_OnImeSelect(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:391
BOOL WINAPI IMPGetIMEW(HWND hwnd, LPIMEPROW ime)
Definition: imm.c:1192
static VOID User32UpdateImcOfImeUI(PIMEUI pimeui, HIMC hNewIMC)
Definition: imm.c:224
static LRESULT ImeWnd_OnImeNotify(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:246
static VOID User32NotifyOpenStatus(PIMEUI pimeui, HWND hwndIMC, BOOL bOpen)
Definition: imm.c:199
static LRESULT FASTCALL User32DoImeHelp(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:588
LRESULT WINAPI SendIMEMessageExW(HWND hwnd, LPARAM lParam)
Definition: imm.c:1232
LRESULT WINAPI ImeWndProcW(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: imm.c:1113
BOOL WINAPI WINNLSGetEnableStatus(HWND hwnd)
Definition: imm.c:1262
WORD WINAPI ImmSendIMEMessageExW(HWND hWnd, LPARAM lParam)
Definition: win3.c:225
WORD WINAPI ImmSendIMEMessageExA(HWND hWnd, LPARAM lParam)
Definition: win3.c:216
_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 WM_PAINT
Definition: winuser.h:1631
#define GW_OWNER
Definition: winuser.h:777
#define WM_ERASEBKGND
Definition: winuser.h:1636
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_IME_REQUEST
Definition: winuser.h:1847
#define GetWindowLongPtrW
Definition: winuser.h:4840
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_IME_NOTIFY
Definition: winuser.h:1841
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:4326
#define WM_CREATE
Definition: winuser.h:1619
#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:1840
#define HELP_FINDER
Definition: winuser.h:2430
#define WM_IME_CHAR
Definition: winuser.h:1845
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4327
#define WM_IME_COMPOSITIONFULL
Definition: winuser.h:1843
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:1695
#define WM_IME_CONTROL
Definition: winuser.h:1842
#define WM_IME_SELECT
Definition: winuser.h:1844
#define WM_DESTROY
Definition: winuser.h:1620
BOOL WINAPI GetClassInfoW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSW)
#define SetWindowLongPtrW
Definition: winuser.h:5366
#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
WCHAR * LPWSTR
Definition: xmlstorage.h:184
char CHAR
Definition: xmlstorage.h:175