ReactOS 0.4.15-dev-8227-g32d615f
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
621/* Handles WM_IME_SYSTEM message of the default IME window. */
622/* Win: ImeSystemHandler */
624{
625 LRESULT ret = 0;
627 HIMC hIMC = pimeui->hIMC;
628 LPCANDIDATEFORM pCandForm;
629 LPCOMPOSITIONFORM pCompForm;
630 DWORD dwConversion, dwSentence;
631 HWND hImeWnd;
632 BOOL bCompForm;
633 CANDIDATEFORM CandForm;
634 COMPOSITIONFORM CompForm;
635 UINT iCandForm;
636
637 ASSERT(pimeui->spwnd != NULL);
638
639 switch (wParam)
640 {
643 {
644 hImeWnd = UserHMGetHandle(pimeui->spwnd);
646 }
647 break;
648
649 case IMS_UPDATEIMEUI:
650 if (!hIMC)
651 break;
652
653 bCompForm = TRUE;
654 pIC = IMM_FN(ImmLockIMC)(hIMC);
655 if (pIC)
656 {
657 bCompForm = !(pIC->dwUIFlags & 0x2);
658 IMM_FN(ImmUnlockIMC)(hIMC);
659 }
660
661 if (!IsWindow(pimeui->hwndIMC))
662 break;
663
664 if (bCompForm && IMM_FN(ImmGetCompositionWindow)(hIMC, &CompForm))
665 {
666 if (CompForm.dwStyle)
667 IMM_FN(ImmSetCompositionWindow)(hIMC, &CompForm);
668 }
669
670 for (iCandForm = 0; iCandForm < MAX_CANDIDATEFORM; ++iCandForm)
671 {
672 if (IMM_FN(ImmGetCandidateWindow)(hIMC, iCandForm, &CandForm))
673 {
674 if (CandForm.dwStyle)
675 IMM_FN(ImmSetCandidateWindow)(hIMC, &CandForm);
676 }
677 }
678 break;
679
680 case IMS_SETCANDFORM:
681 pIC = IMM_FN(ImmLockIMC)(hIMC);
682 if (!pIC)
683 break;
684
685 pCandForm = &pIC->cfCandForm[lParam];
686 IMM_FN(ImmSetCandidateWindow)(hIMC, pCandForm);
687 IMM_FN(ImmUnlockIMC)(hIMC);
688 break;
689
690 case IMS_SETCOMPFONT:
691 pIC = IMM_FN(ImmLockIMC)(hIMC);
692 if (!pIC)
693 break;
694
695 IMM_FN(ImmSetCompositionFontW)(hIMC, &pIC->lfFont.W);
696 IMM_FN(ImmUnlockIMC)(hIMC);
697 break;
698
699 case IMS_SETCOMPFORM:
700 pIC = IMM_FN(ImmLockIMC)(hIMC);
701 if (!pIC)
702 break;
703
704 pCompForm = &pIC->cfCompForm;
705 pIC->dwUIFlags |= 0x8;
706 IMM_FN(ImmSetCompositionWindow)(hIMC, pCompForm);
707 IMM_FN(ImmUnlockIMC)(hIMC);
708 break;
709
710 case IMS_CONFIGURE:
712 break;
713
715 if (hIMC)
717 break;
718
719 case IMS_FREELAYOUT:
721 break;
722
723 case 0x13:
724 FIXME("\n");
725 break;
726
728 IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence);
729 ret = dwConversion;
730 break;
731
732 case IMS_IMEHELP:
733 return User32DoImeHelp(pimeui, wParam, lParam);
734
735 case IMS_IMEACTIVATE:
737 break;
738
741 break;
742
745 break;
746
747 case IMS_GETIMEMENU:
749 break;
750
751 case 0x1D:
752 FIXME("\n");
753 break;
754
755 case IMS_GETCONTEXT:
757 break;
758
761 case IMS_SETLANGBAND:
764 break;
765
767 CtfLoadThreadLayout(pimeui);
768 break;
769
770 default:
771 break;
772 }
773
774 return ret;
775}
776
777/* Handles WM_IME_SETCONTEXT message of the default IME window. */
778/* Win: ImeSetContextHandler */
780{
781 LRESULT ret;
782 HIMC hIMC;
784 HWND hwndFocus, hwndOldImc, hwndNewImc, hImeWnd, hwndActive, hwndOwner;
785 PWND pwndFocus, pImeWnd, pwndOwner;
786 COMPOSITIONFORM CompForm;
787
788 pimeui->fActivate = !!wParam;
789 hwndOldImc = pimeui->hwndIMC;
790 ASSERT(pimeui->spwnd != NULL);
791
792 if (wParam)
793 {
794 if (!pimeui->hwndUI)
795 pimeui->hwndUI = User32CreateImeUIWindow(pimeui, pimeui->hKL);
796
797 if (gfConIme == -1)
798 {
800 if (gfConIme)
801 pimeui->fCtrlShowStatus = FALSE;
802 }
803
804 hImeWnd = UserHMGetHandle(pimeui->spwnd);
805
806 if (gfConIme)
807 {
808 hwndOwner = GetWindow(hImeWnd, GW_OWNER);
809 pwndOwner = ValidateHwnd(hwndOwner);
810 if (pwndOwner)
811 {
812 User32UpdateImcOfImeUI(pimeui, pwndOwner->hImc);
813
814 if (pimeui->hwndUI)
815 SetWindowLongPtrW(pimeui->hwndUI, IMMGWLP_IMC, (LONG_PTR)pwndOwner->hImc);
816 }
817
819 }
820
821 hwndFocus = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_FOCUS);
822
823 hIMC = IMM_FN(ImmGetContext)(hwndFocus);
824
825 if (hIMC && !User32CanSetImeWindowToImc(hIMC, hImeWnd))
826 {
828 return 0;
829 }
830
831 User32UpdateImcOfImeUI(pimeui, hIMC);
832
833 if (pimeui->hwndUI)
835
836 if (hIMC)
837 {
838 pIC = IMM_FN(ImmLockIMC)(hIMC);
839 if (!pIC)
840 return 0;
841
842 if (hwndFocus != pIC->hWnd)
843 {
844 IMM_FN(ImmUnlockIMC)(hIMC);
845 return 0;
846 }
847
848 if ((pIC->dwUIFlags & 0x40000) && hwndOldImc != hwndFocus)
849 {
850 RtlZeroMemory(&CompForm, sizeof(CompForm));
851 IMM_FN(ImmSetCompositionWindow)(hIMC, &CompForm);
852
853 pIC->dwUIFlags &= ~0x40000;
854 }
855
856 IMM_FN(ImmUnlockIMC)(hIMC);
857
858 hImeWnd = UserHMGetHandle(pimeui->spwnd);
859 if (NtUserSetImeOwnerWindow(hImeWnd, hwndFocus))
860 pimeui->hwndIMC = hwndFocus;
861 }
862 else
863 {
864 pimeui->hwndIMC = hwndFocus;
865
866 hImeWnd = UserHMGetHandle(pimeui->spwnd);
868 }
869 }
870
872
873 if (!pimeui->spwnd)
874 return 0;
875
876 if (!pimeui->fCtrlShowStatus || !User32GetImeShowStatus())
877 return ret;
878
879 hImeWnd = UserHMGetHandle(pimeui->spwnd);
880 hwndFocus = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_FOCUS);
881 pwndFocus = ValidateHwnd(hwndFocus);
882
883 if (wParam)
884 {
885 pImeWnd = ValidateHwnd(hImeWnd);
886 if (pwndFocus && pImeWnd && pImeWnd->head.pti == pwndFocus->head.pti)
887 {
888 hwndNewImc = pimeui->hwndIMC;
889 if (pimeui->fShowStatus)
890 {
891 if (hwndOldImc && hwndNewImc && hwndOldImc != hwndNewImc &&
892 IntGetTopLevelWindow(hwndOldImc) != IntGetTopLevelWindow(hwndNewImc))
893 {
894 User32NotifyOpenStatus(pimeui, hwndOldImc, FALSE);
895 User32NotifyOpenStatus(pimeui, hwndNewImc, TRUE);
896 }
897 }
898 else
899 {
900 if (ValidateHwnd(hwndNewImc))
901 User32NotifyOpenStatus(pimeui, hwndNewImc, TRUE);
902 }
903 }
904
905 pImeWnd = pimeui->spwnd;
906 hImeWnd = (pImeWnd ? UserHMGetHandle(pImeWnd) : NULL);
907 if (hImeWnd)
909 }
910 else
911 {
912 pImeWnd = pimeui->spwnd;
913 hImeWnd = UserHMGetHandle(pImeWnd);
914 hwndActive = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_ACTIVE);
915 if (!pwndFocus || !hwndActive || pImeWnd->head.pti != pwndFocus->head.pti)
916 {
917 if (IsWindow(hwndOldImc))
918 {
919 User32NotifyOpenStatus(pimeui, hwndOldImc, FALSE);
920 }
921 else
922 {
923 pimeui->fShowStatus = FALSE;
925 }
926 }
927 }
928
929 return ret;
930}
931
932/* The window procedure of the default IME window */
933/* Win: ImeWndProcWorker(pWnd, msg, wParam, lParam, !unicode) */
936{
937 PWND pWnd;
938 PIMEUI pimeui;
939 LRESULT ret;
940
941 pWnd = ValidateHwnd(hwnd);
942 if (pWnd == NULL)
943 {
944 ERR("hwnd was %p\n", hwnd);
945 return 0;
946 }
947
948 if (!pWnd->fnid)
949 {
951 }
952 else if (pWnd->fnid != FNID_IME)
953 {
954 ERR("fnid was 0x%x\n", pWnd->fnid);
955 return 0;
956 }
957
958 pimeui = (PIMEUI)GetWindowLongPtrW(hwnd, 0);
959 if (pimeui == NULL)
960 {
961 pimeui = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMEUI));
962 if (pimeui == NULL)
963 {
964 ERR("HeapAlloc failed\n");
967 return 0;
968 }
969
970 SetWindowLongPtrW(hwnd, 0, (LONG_PTR)pimeui);
971 pimeui->spwnd = pWnd;
972 }
973
974 if (IS_CICERO_MODE())
975 {
977 if (ret)
978 return ret;
979 }
980
981 if (pimeui->nCntInIMEProc > 0)
982 {
983 switch (msg)
984 {
985 case WM_IME_CHAR:
987 case WM_IME_CONTROL:
988 case WM_IME_REQUEST:
989 case WM_IME_SELECT:
991 case WM_IME_STARTCOMPOSITION:
992 case WM_IME_COMPOSITION:
993 case WM_IME_ENDCOMPOSITION:
994 return 0;
995
996 case WM_IME_NOTIFY:
997 if (wParam < IMN_PRIVATE || IS_IME_HKL(pimeui->hKL) || !IS_CICERO_MODE())
998 return 0;
999 break;
1000
1001 case WM_IME_SYSTEM:
1002 switch (wParam)
1003 {
1004 case 0x03:
1005 case 0x10:
1006 case 0x13:
1007 break;
1008
1009 default:
1010 return 0;
1011 }
1012 break;
1013
1014 default:
1015 goto Finish;
1016 }
1017 }
1018
1019 if ((pWnd->state2 & WNDS2_INDESTROY) || (pWnd->state & WNDS_DESTROYED))
1020 {
1021 switch (msg)
1022 {
1023 case WM_DESTROY:
1024 case WM_NCDESTROY:
1025 case WM_FINALDESTROY:
1026 break;
1027
1028 default:
1029 return 0;
1030 }
1031 }
1032
1033 switch (msg)
1034 {
1035 case WM_CREATE:
1036 return ImeWnd_OnCreate(pimeui, (LPCREATESTRUCT)lParam);
1037
1038 case WM_DESTROY:
1040 return 0;
1041
1042 case WM_NCDESTROY:
1043 case WM_FINALDESTROY:
1044 pimeui->spwnd = NULL;
1045 HeapFree(GetProcessHeap(), 0, pimeui);
1047 break;
1048
1049 case WM_ERASEBKGND:
1050 return TRUE;
1051
1052 case WM_PAINT:
1053 return 0;
1054
1055 case WM_IME_STARTCOMPOSITION:
1056 case WM_IME_COMPOSITION:
1057 case WM_IME_ENDCOMPOSITION:
1058 return User32SendImeUIMessage(pimeui, msg, wParam, lParam, unicode);
1059
1060 case WM_IME_CONTROL:
1061 return ImeWnd_OnImeControl(pimeui, wParam, lParam, unicode);
1062
1063 case WM_IME_NOTIFY:
1064 return ImeWnd_OnImeNotify(pimeui, wParam, lParam);
1065
1066 case WM_IME_REQUEST:
1067 return 0;
1068
1069 case WM_IME_SELECT:
1071 return (LRESULT)pimeui;
1072
1073 case WM_IME_SETCONTEXT:
1074 return ImeWnd_OnImeSetContext(pimeui, wParam, lParam);
1075
1076 case WM_IME_SYSTEM:
1077 return ImeWnd_OnImeSystem(pimeui, wParam, lParam);
1078
1079 default:
1080 break;
1081 }
1082
1083Finish:
1084 if (unicode)
1085 return DefWindowProcW(hwnd, msg, wParam, lParam);
1086 return DefWindowProcA(hwnd, msg, wParam, lParam);
1087}
1088
1089// Win: ImeWndProcA
1091{
1093}
1094
1095// Win: ImeWndProcW
1097{
1099}
1100
1101// Win: UpdatePerUserImmEnabling
1103{
1104 HMODULE imm32;
1105 BOOL ret;
1106
1108 if (!ret || !(gpsi->dwSRVIFlags & SRVINFO_IMM32))
1109 return FALSE;
1110
1111 imm32 = GetModuleHandleW(L"imm32.dll");
1112 if (imm32)
1113 return TRUE;
1114
1115 imm32 = LoadLibraryW(L"imm32.dll");
1116 if (imm32 == NULL)
1117 {
1118 ERR("Imm32 not installed!\n");
1119 ret = FALSE;
1120 }
1121
1122 return ret;
1123}
1124
1125BOOL
1126WINAPI
1128{
1129 ATOM atom;
1130 WNDCLASSEXW WndClass = { sizeof(WndClass) };
1131
1132 WndClass.lpszClassName = L"IME";
1133 WndClass.style = CS_GLOBALCLASS;
1134 WndClass.lpfnWndProc = ImeWndProcW;
1135 WndClass.cbWndExtra = sizeof(LONG_PTR);
1136 WndClass.hCursor = LoadCursorW(NULL, IDC_ARROW);
1137
1138 atom = RegisterClassExWOWW(&WndClass, 0, FNID_IME, 0, FALSE);
1139 if (!atom)
1140 {
1141 ERR("Failed to register IME Class!\n");
1142 return FALSE;
1143 }
1144
1146 TRACE("RegisterIMEClass atom = %u\n", atom);
1147 return TRUE;
1148}
1149
1150/*
1151 * @implemented
1152 */
1153BOOL
1154WINAPI
1156{
1157 return IMM_FN(ImmIMPSetIMEW)(hwnd, ime);
1158}
1159
1160/*
1161 * @implemented
1162 */
1163BOOL
1164WINAPI
1166{
1167 return IMM_FN(ImmIMPQueryIMEW)(ime);
1168}
1169
1170/*
1171 * @implemented
1172 */
1173BOOL
1174WINAPI
1176{
1177 return IMM_FN(ImmIMPGetIMEW)(hwnd, ime);
1178}
1179
1180/*
1181 * @implemented
1182 */
1183BOOL
1184WINAPI
1186{
1187 return IMM_FN(ImmIMPSetIMEA)(hwnd, ime);
1188}
1189
1190/*
1191 * @implemented
1192 */
1193BOOL
1194WINAPI
1196{
1197 return IMM_FN(ImmIMPQueryIMEA)(ime);
1198}
1199
1200/*
1201 * @implemented
1202 */
1203BOOL
1204WINAPI
1206{
1207 return IMM_FN(ImmIMPGetIMEA)(hwnd, ime);
1208}
1209
1210/*
1211 * @implemented
1212 */
1213LRESULT
1214WINAPI
1216{
1218}
1219
1220/*
1221 * @implemented
1222 */
1223LRESULT
1224WINAPI
1226{
1228}
1229
1230/*
1231 * @implemented
1232 */
1233BOOL
1234WINAPI
1236{
1238}
1239
1240/*
1241 * @implemented
1242 */
1243BOOL
1244WINAPI
1246{
1248}
1249
1250/*
1251 * @implemented
1252 */
1253UINT
1254WINAPI
1256{
1257 return FALSE;
1258}
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: debug.h:114
#define ERR(fmt,...)
Definition: debug.h:113
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 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:1559
BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
Definition: ime.c:1744
BOOL WINAPI ImmGetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
Definition: ime.c:1615
PIMEDPI WINAPI ImmLockImeDpi(HKL hKL)
Definition: ime.c:978
BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
Definition: ime.c:1688
VOID WINAPI ImmUnlockImeDpi(PIMEDPI pImeDpi)
Definition: ime.c:1007
BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
Definition: ime.c:2055
BOOL WINAPI ImmGetOpenStatus(HIMC hIMC)
Definition: ime.c:1443
BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence)
Definition: ime.c:1941
BOOL WINAPI ImmSetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
Definition: ime.c:1531
LRESULT WINAPI ImmEscapeW(HKL hKL, HIMC hIMC, UINT uSubFunc, LPVOID lpData)
Definition: ime.c:1365
BOOL WINAPI ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
Definition: ime.c:932
LRESULT WINAPI ImmPutImeMenuItemsIntoMappedFile(HIMC hIMC)
Definition: ime.c:448
BOOL WINAPI ImmWINNLSEnableIME(HWND hWnd, BOOL enable)
Definition: ime.c:2136
BOOL WINAPI ImmGetConversionStatus(HIMC hIMC, LPDWORD lpfdwConversion, LPDWORD lpfdwSentence)
Definition: ime.c:1912
BOOL WINAPI ImmLoadIME(HKL hKL)
Definition: ime.c:1055
BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
Definition: ime.c:1466
BOOL WINAPI ImmSetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1583
BOOL WINAPI ImmGetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
Definition: ime.c:1651
BOOL WINAPI ImmUnlockIMC(HIMC hIMC)
Definition: imm.c:1066
HIMC WINAPI ImmGetContext(HWND hWnd)
Definition: imm.c:1044
BOOL WINAPI ImmFreeLayout(DWORD dwUnknown)
Definition: imm.c:115
BOOL WINAPI User32InitializeImmEntryTable(DWORD)
Definition: imm.c:126
BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
Definition: imm.c:1085
BOOL WINAPI ImmSetActiveContext(HWND hWnd, HIMC hIMC, BOOL fActive)
Definition: imm.c:1124
LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC hIMC)
Definition: imm.c:1057
SHAREDINFO gSharedInfo
Definition: imm.c:19
BOOL WINAPI ImmRegisterClient(PSHAREDINFO ptr, HINSTANCE hMod)
Definition: imm.c:57
PSERVERINFO gpsi
Definition: imm.c:18
BOOL WINAPI ImmActivateLayout(HKL hKL)
Definition: imm.c:442
BOOL WINAPI ImmWINNLSGetEnableStatus(HWND hWnd)
Definition: imm.c:1222
#define ValidateHwnd(hwnd)
Definition: precomp.h:85
#define IMM_INIT_MAGIC
Definition: precomp.h:50
#define MAX_CANDIDATEFORM
Definition: precomp.h:53
LPVOID FASTCALL ValidateHandle(HANDLE hObject, UINT uType)
Definition: utils.c:377
BOOL WINAPI ImmIMPQueryIMEA(LPIMEPROA pImePro)
Definition: utils.c:1286
BOOL WINAPI ImmIMPGetIMEW(HWND hWnd, LPIMEPROW pImePro)
Definition: utils.c:1277
BOOL WINAPI ImmIMPGetIMEA(HWND hWnd, LPIMEPROA pImePro)
Definition: utils.c:1268
BOOL WINAPI ImmIMPSetIMEA(HWND hWnd, LPIMEPROA pImePro)
Definition: utils.c:1304
BOOL WINAPI ImmIMPQueryIMEW(LPIMEPROW pImePro)
Definition: utils.c:1295
BOOL WINAPI ImmIMPSetIMEW(HWND hWnd, LPIMEPROW pImePro)
Definition: utils.c:1313
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
#define IS_IME_HKL(hKL)
Definition: imm32_undoc.h:20
@ ImeInfoExKeyboardLayout
Definition: imm32_undoc.h:48
#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 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:107
#define IMC_SETOPENSTATUS
Definition: immdev.h:394
#define IMS_GETIMEMENU
Definition: immdev.h:111
#define IMS_SETOPENSTATUS
Definition: immdev.h:104
#define IMC_SETCONVERSIONMODE
Definition: immdev.h:392
#define IMC_SETSENTENCEMODE
Definition: immdev.h:393
#define IMS_IMEACTIVATE
Definition: immdev.h:108
#define IMS_UPDATEIMEUI
Definition: immdev.h:99
#define IMS_GETCONTEXT
Definition: immdev.h:112
#define IMS_SETCANDFORM
Definition: immdev.h:100
#define IMS_SETLANGBAND
Definition: immdev.h:116
#define IMC_GETSOFTKBDPOS
Definition: immdev.h:91
#define IMS_COMPLETECOMPSTR
Definition: immdev.h:114
#define IMS_UNSETLANGBAND
Definition: immdev.h:117
#define IMS_SETCOMPFONT
Definition: immdev.h:101
#define IMS_GETCONVSTATUS
Definition: immdev.h:106
#define IMS_CONFIGURE
Definition: immdev.h:103
#define IMS_NOTIFYIMESHOW
Definition: immdev.h:98
#define IMS_LOADTHREADLAYOUT
Definition: immdev.h:115
#define IMS_FREELAYOUT
Definition: immdev.h:105
#define IMC_GETSENTENCEMODE
Definition: immdev.h:87
#define IMS_ACTIVATELAYOUT
Definition: immdev.h:110
#define IMC_GETOPENSTATUS
Definition: immdev.h:88
#define IMS_IMEDEACTIVATE
Definition: immdev.h:109
#define IMMGWLP_IMC
Definition: immdev.h:125
#define IMC_SETSOFTKBDPOS
Definition: immdev.h:92
#define IMS_SETCOMPFORM
Definition: immdev.h:102
#define IMS_SENDNOTIFICATION
Definition: immdev.h:113
#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:2830
#define FNID_DESTROY
Definition: ntuser.h:898
#define QUERY_WINDOW_ACTIVE
Definition: ntuser.h:2829
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:884
#define NtUserSetWindowLongPtr
Definition: ntuser.h:3282
BOOL NTAPI NtUserSetImeOwnerWindow(HWND hImeWnd, HWND hwndFocus)
Definition: ime.c:1362
@ THREADSTATE_CHECKCONIME
Definition: ntuser.h:2489
BOOLEAN NTAPI NtUserDestroyWindow(HWND Wnd)
Definition: window.c:3037
@ NOPARAM_ROUTINE_GETIMESHOWSTATUS
Definition: ntuser.h:1513
@ HWNDLOCK_ROUTINE_CHECKIMESHOWSTATUSINTHRD
Definition: ntuser.h:1629
@ NOPARAM_ROUTINE_UPDATEPERUSERIMMENABLING
Definition: ntuser.h:1539
@ TWOPARAM_ROUTINE_IMESHOWSTATUSCHANGE
Definition: ntuser.h:1638
@ TYPE_INPUTCONTEXT
Definition: ntuser.h:57
#define FNID_IME
Definition: ntuser.h:874
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
Definition: window.c:4189
#define IS_CICERO_MODE()
Definition: ntuser.h:1210
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:4330
#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
#define _Out_
Definition: ms_sal.h:345
#define _In_
Definition: ms_sal.h:308
UINT_PTR HKL
Definition: msctf.idl:143
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
u32_t magic(void)
#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:61
HINSTANCE hInstance
Definition: winuser.h:3180
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:133
Definition: ntuser.h:199
HWND hImeWnd
Definition: ntuser.h:203
IMEINFO ImeInfo
Definition: imm32_undoc.h:30
WCHAR wszUIClass[16]
Definition: imm32_undoc.h:31
HKL hKL
Definition: ntuser.h:1218
HIMC hIMC
Definition: ntuser.h:1216
DWORD dwLastStatus
Definition: ntuser.h:1230
PWND spwnd
Definition: ntuser.h:1215
UINT fCtrlShowStatus
Definition: ntuser.h:1227
UINT fActivate
Definition: ntuser.h:1223
HWND hwndIMC
Definition: ntuser.h:1217
UINT fShowStatus
Definition: ntuser.h:1222
HWND hwndUI
Definition: ntuser.h:1219
LONG nCntInIMEProc
Definition: ntuser.h:1220
UINT fDestroy
Definition: ntuser.h:1224
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
@ UIC_IMEWINDOW
Definition: undocuser.h:304
#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:1155
static VOID User32DestroyImeUIWindow(PIMEUI pimeui)
Definition: imm.c:375
BOOL WINAPI IMPQueryIMEA(LPIMEPROA ime)
Definition: imm.c:1195
UINT WINAPI WINNLSGetIMEHotkey(HWND hwnd)
Definition: imm.c:1255
Imm32ApiTable gImmApiEntries
Definition: imm.c:47
LRESULT WINAPI ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:935
BOOL WINAPI IMPQueryIMEW(LPIMEPROW ime)
Definition: imm.c:1165
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:779
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:1225
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:1090
BOOL WINAPI UpdatePerUserImmEnabling(VOID)
Definition: imm.c:1102
BOOL WINAPI InitializeImmEntryTable(VOID)
Definition: imm.c:119
static LRESULT ImeWnd_OnImeSystem(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:623
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:1205
static BOOL User32CanSetImeWindowToImc(HIMC hIMC, HWND hImeWnd)
Definition: imm.c:155
BOOL WINAPI IMPSetIMEA(HWND hwnd, LPIMEPROA ime)
Definition: imm.c:1185
HINSTANCE ghImm32
Definition: imm.c:20
BOOL WINAPI WINNLSEnableIME(HWND hwnd, BOOL enable)
Definition: imm.c:1235
BOOL WINAPI RegisterIMEClass(VOID)
Definition: imm.c:1127
HWND FASTCALL IntGetTopLevelWindow(HWND hWnd)
Definition: imm.c:26
static VOID ImeWnd_OnImeSelect(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:391
BOOL WINAPI IMPGetIMEW(HWND hwnd, LPIMEPROW ime)
Definition: imm.c:1175
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:1215
LRESULT WINAPI ImeWndProcW(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: imm.c:1096
BOOL WINAPI WINNLSGetEnableStatus(HWND hwnd)
Definition: imm.c:1245
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:1620
#define GW_OWNER
Definition: winuser.h:766
#define WM_ERASEBKGND
Definition: winuser.h:1625
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_IME_REQUEST
Definition: winuser.h:1836
#define GetWindowLongPtrW
Definition: winuser.h:4829
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_IME_NOTIFY
Definition: winuser.h:1830
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:4315
#define WM_CREATE
Definition: winuser.h:1608
#define IDC_ARROW
Definition: winuser.h:687
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:2136
#define WM_IME_SETCONTEXT
Definition: winuser.h:1829
#define HELP_FINDER
Definition: winuser.h:2419
#define WM_IME_CHAR
Definition: winuser.h:1834
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4316
#define WM_IME_COMPOSITIONFULL
Definition: winuser.h:1832
HWND WINAPI GetParent(_In_ HWND)
#define CS_GLOBALCLASS
Definition: winuser.h:652
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
#define WM_NCDESTROY
Definition: winuser.h:1684
#define WM_IME_CONTROL
Definition: winuser.h:1831
#define WM_IME_SELECT
Definition: winuser.h:1833
#define WM_DESTROY
Definition: winuser.h:1609
BOOL WINAPI GetClassInfoW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSW)
#define SetWindowLongPtrW
Definition: winuser.h:5355
#define GWL_STYLE
Definition: winuser.h:852
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