ReactOS  0.4.15-dev-5146-g069b08d
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 <ddk/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 */
20 HINSTANCE ghImm32 = NULL; // Win: ghImm32
21 
22 BOOL gbImmInitializing = FALSE; // Win: bImmInitializing
23 
24 INT gfConIme = -1; // Win: gfConIme
25 
27 {
28  DWORD style;
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
56 HRESULT
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 {
157  PIMC pIMC = ValidateHandle(hIMC, TYPE_INPUTCONTEXT);
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) */
169 static 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
199 static 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
214 static VOID User32SetImeWindowOfImc(HIMC hIMC, HWND hImeWnd)
215 {
216  PIMC pIMC = ValidateHandle(hIMC, TYPE_INPUTCONTEXT);
217  if (!pIMC || pIMC->hImeWnd == hImeWnd)
218  return;
219 
221 }
222 
223 // Win: ImeSetImc
224 static 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)
236  User32SetImeWindowOfImc(hOldIMC, NULL);
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  {
258  case IMN_SETOPENSTATUS:
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 
336 Quit:
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 
407  if (User32GetImeShowStatus() && pimeui->fCtrlShowStatus)
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 
419  User32DestroyImeUIWindow(pimeui);
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) */
426 static 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 
456  case IMC_GETSENTENCEMODE:
457  if (!IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence))
458  return 1;
459  return dwSentence;
460 
461  case IMC_GETOPENSTATUS:
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 
472  case IMC_SETSENTENCEMODE:
473  if (!IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence) ||
474  !IMM_FN(ImmSetConversionStatus)(hIMC, dwConversion, (DWORD)lParam))
475  {
476  return 1;
477  }
478  break;
479 
480  case IMC_SETOPENSTATUS:
481  if (!IMM_FN(ImmSetOpenStatus)(hIMC, (BOOL)lParam))
482  return 1;
483  break;
484 
485  case IMC_GETCANDIDATEPOS:
487  case IMC_GETSOFTKBDPOS:
488  case IMC_SETSOFTKBDPOS:
490  return User32SendImeUIMessage(pimeui, WM_IME_CONTROL, wParam, lParam, unicode);
491 
492  case IMC_SETCANDIDATEPOS:
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 
529  pt.x = GET_X_LPARAM(lParam);
530  pt.y = GET_Y_LPARAM(lParam);
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  {
568  IMM_FN(ImmSetActiveContext)(NULL, NULL, bActive);
569  return;
570  }
571 
572  hIMC = IMM_FN(ImmGetContext)(hWnd);
573  IMM_FN(ImmSetActiveContext)(hWnd, hIMC, bActive);
574  IMM_FN(ImmReleaseContext)(hWnd, hIMC);
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. */
587 static 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 */
600  if (IMM_FN(ImmEscapeW)(pimeui->hKL, pimeui->hIMC, IME_ESC_GETHELPFILENAME, szHelpFile))
601  {
602  /* Check filename extension */
603  cch = wcslen(szHelpFile);
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;
626  LPINPUTCONTEXTDX pIC;
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  {
641  case IMS_NOTIFYIMESHOW:
642  if (User32GetImeShowStatus() == !lParam)
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 
714  case IMS_SETOPENSTATUS:
715  if (hIMC)
717  break;
718 
719  case IMS_FREELAYOUT:
721  break;
722 
723  case 0x13:
724  FIXME("\n");
725  break;
726 
727  case IMS_GETCONVSTATUS:
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 
739  case IMS_IMEDEACTIVATE:
741  break;
742 
743  case IMS_ACTIVATELAYOUT:
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 
760  case IMS_COMPLETECOMPSTR:
761  case IMS_SETLANGBAND:
762  case IMS_UNSETLANGBAND:
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;
783  LPINPUTCONTEXTDX pIC;
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  {
827  User32UpdateImcOfImeUI(pimeui, NULL);
828  return 0;
829  }
830 
831  User32UpdateImcOfImeUI(pimeui, hIMC);
832 
833  if (pimeui->hwndUI)
834  SetWindowLongPtrW(pimeui->hwndUI, IMMGWLP_IMC, (LONG_PTR)hIMC);
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);
867  NtUserSetImeOwnerWindow(hImeWnd, NULL);
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(hwnd, msg, wParam, lParam, !unicode) */
936 {
937  PWND pWnd;
938  PIMEUI pimeui;
939  LRESULT ret;
940 
941  pWnd = ValidateHwnd(hwnd);
942  if (pWnd)
943  {
944  if (IS_CICERO_MODE())
945  {
947  if (ret)
948  return ret;
949  }
950 
951  if (!pWnd->fnid)
952  {
953  if (msg != WM_NCCREATE)
954  {
955  if (unicode)
956  return DefWindowProcW(hwnd, msg, wParam, lParam);
957  return DefWindowProcA(hwnd, msg, wParam, lParam);
958  }
960  pimeui = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMEUI));
961  pimeui->spwnd = pWnd;
962  SetWindowLongPtrW(hwnd, 0, (LONG_PTR)pimeui);
963  }
964  else
965  {
966  if (pWnd->fnid != FNID_IME)
967  {
968  ERR("Wrong window class for Ime! fnId 0x%x\n",pWnd->fnid);
969  return 0;
970  }
971  pimeui = (PIMEUI)GetWindowLongPtrW(hwnd, 0);
972  if (pimeui == NULL)
973  {
974  ERR("Window is not set to IME!\n");
975  return 0;
976  }
977  }
978  }
979 
980  if (pimeui->nCntInIMEProc > 0)
981  {
982  switch (msg)
983  {
984  case WM_IME_CHAR:
986  case WM_IME_CONTROL:
987  case WM_IME_REQUEST:
988  case WM_IME_SELECT:
989  case WM_IME_SETCONTEXT:
990  case WM_IME_STARTCOMPOSITION:
991  case WM_IME_COMPOSITION:
992  case WM_IME_ENDCOMPOSITION:
993  return 0;
994 
995  case WM_IME_NOTIFY:
996  if (wParam < IMN_PRIVATE || IS_IME_HKL(pimeui->hKL) || !IS_CICERO_MODE())
997  return 0;
998  break;
999 
1000  case WM_IME_SYSTEM:
1001  switch (wParam)
1002  {
1003  case 0x03:
1004  case 0x10:
1005  case 0x13:
1006  break;
1007 
1008  default:
1009  return 0;
1010  }
1011  break;
1012 
1013  default:
1014  {
1015  if (unicode)
1016  return DefWindowProcW(hwnd, msg, wParam, lParam);
1017  return DefWindowProcA(hwnd, msg, wParam, lParam);
1018  }
1019  }
1020  }
1021 
1022  switch (msg)
1023  {
1024  case WM_CREATE:
1025  return ImeWnd_OnCreate(pimeui, (LPCREATESTRUCT)lParam);
1026 
1027  case WM_DESTROY:
1028  User32DestroyImeUIWindow(pimeui);
1029  break;
1030 
1031  case WM_NCDESTROY:
1032  HeapFree(GetProcessHeap(), 0, pimeui);
1034  break;
1035 
1036  case WM_ERASEBKGND:
1037  return TRUE;
1038 
1039  case WM_PAINT:
1040  break;
1041 
1042  case WM_COPYDATA:
1043  // TODO:
1044  break;
1045 
1046  case WM_IME_STARTCOMPOSITION:
1047  case WM_IME_COMPOSITION:
1048  case WM_IME_ENDCOMPOSITION:
1049  return User32SendImeUIMessage(pimeui, msg, wParam, lParam, unicode);
1050 
1051  case WM_IME_CONTROL:
1052  return ImeWnd_OnImeControl(pimeui, wParam, lParam, unicode);
1053 
1054  case WM_IME_NOTIFY:
1055  return ImeWnd_OnImeNotify(pimeui, wParam, lParam);
1056 
1057  case WM_IME_REQUEST:
1058  break;
1059 
1060  case WM_IME_SELECT:
1061  ImeWnd_OnImeSelect(pimeui, wParam, lParam);
1062  break;
1063 
1064  case WM_IME_SETCONTEXT:
1065  return ImeWnd_OnImeSetContext(pimeui, wParam, lParam);
1066 
1067  case WM_IME_SYSTEM:
1068  return ImeWnd_OnImeSystem(pimeui, wParam, lParam);
1069 
1070  default:
1071  {
1072  if (unicode)
1073  return DefWindowProcW(hwnd, msg, wParam, lParam);
1074  return DefWindowProcA(hwnd, msg, wParam, lParam);
1075  }
1076  }
1077 
1078  return 0;
1079 }
1080 
1081 // Win: ImeWndProcA
1083 {
1085 }
1086 
1087 // Win: ImeWndProcW
1089 {
1091 }
1092 
1093 // Win: UpdatePerUserImmEnabling
1095 {
1096  HMODULE imm32;
1097  BOOL ret;
1098 
1100  if (!ret || !(gpsi->dwSRVIFlags & SRVINFO_IMM32))
1101  return FALSE;
1102 
1103  imm32 = GetModuleHandleW(L"imm32.dll");
1104  if (imm32)
1105  return TRUE;
1106 
1107  imm32 = LoadLibraryW(L"imm32.dll");
1108  if (imm32)
1109  {
1110  ERR("UPUIE: Imm32 not installed!\n");
1111  ret = FALSE;
1112  }
1113 
1114  return ret;
1115 }
1116 
1117 BOOL
1118 WINAPI
1120 {
1121  ATOM atom;
1122  WNDCLASSEXW WndClass = { sizeof(WndClass) };
1123 
1124  WndClass.lpszClassName = L"IME";
1125  WndClass.style = CS_GLOBALCLASS;
1126  WndClass.lpfnWndProc = ImeWndProcW;
1127  WndClass.cbWndExtra = sizeof(LONG_PTR);
1128  WndClass.hCursor = LoadCursorW(NULL, IDC_ARROW);
1129 
1130  atom = RegisterClassExWOWW(&WndClass, 0, FNID_IME, 0, FALSE);
1131  if (!atom)
1132  {
1133  ERR("Failed to register IME Class!\n");
1134  return FALSE;
1135  }
1136 
1138  TRACE("RegisterIMEClass atom = %u\n", atom);
1139  return TRUE;
1140 }
1141 
1142 /*
1143  * @implemented
1144  */
1145 BOOL
1146 WINAPI
1148 {
1149  return IMM_FN(ImmIMPSetIMEW)(hwnd, ime);
1150 }
1151 
1152 /*
1153  * @implemented
1154  */
1155 BOOL
1156 WINAPI
1158 {
1159  return IMM_FN(ImmIMPQueryIMEW)(ime);
1160 }
1161 
1162 /*
1163  * @implemented
1164  */
1165 BOOL
1166 WINAPI
1168 {
1169  return IMM_FN(ImmIMPGetIMEW)(hwnd, ime);
1170 }
1171 
1172 /*
1173  * @implemented
1174  */
1175 BOOL
1176 WINAPI
1178 {
1179  return IMM_FN(ImmIMPSetIMEA)(hwnd, ime);
1180 }
1181 
1182 /*
1183  * @implemented
1184  */
1185 BOOL
1186 WINAPI
1188 {
1189  return IMM_FN(ImmIMPQueryIMEA)(ime);
1190 }
1191 
1192 /*
1193  * @implemented
1194  */
1195 BOOL
1196 WINAPI
1198 {
1199  return IMM_FN(ImmIMPGetIMEA)(hwnd, ime);
1200 }
1201 
1202 /*
1203  * @implemented
1204  */
1205 LRESULT
1206 WINAPI
1208 {
1210 }
1211 
1212 /*
1213  * @implemented
1214  */
1215 LRESULT
1216 WINAPI
1218 {
1220 }
1221 
1222 /*
1223  * @implemented
1224  */
1225 BOOL
1226 WINAPI
1228 {
1230 }
1231 
1232 /*
1233  * @implemented
1234  */
1235 BOOL
1236 WINAPI
1238 {
1240 }
1241 
1242 /*
1243  * @implemented
1244  */
1245 UINT
1246 WINAPI
1248 {
1249  return FALSE;
1250 }
VOID WINAPI ImmUnlockImeDpi(PIMEDPI pImeDpi)
Definition: ime.c:945
#define WS_DISABLED
Definition: pedump.c:621
static BOOL User32CanSetImeWindowToImc(HIMC hIMC, HWND hImeWnd)
Definition: imm.c:155
UINT WINAPI WINNLSGetIMEHotkey(HWND hwnd)
Definition: imm.c:1247
#define WM_IME_NOTIFY
Definition: winuser.h:1820
#define LONG_PTR
Definition: treelist.c:79
static VOID User32NotifyOpenStatus(PIMEUI pimeui, HWND hwndIMC, BOOL bOpen)
Definition: imm.c:199
#define IMC_GETCOMPOSITIONFONT
Definition: imm.h:280
DWORD dwUIFlags
Definition: immdev.h:126
#define IMN_CLOSESTATUSWINDOW
Definition: imm.h:521
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
Definition: misc.c:232
#define IMS_SETOPENSTATUS
Definition: immdev.h:34
BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
Definition: ime.c:1567
#define IMN_OPENSTATUSWINDOW
Definition: imm.h:522
#define WideCharToMultiByte
Definition: compat.h:111
#define WM_IME_CHAR
Definition: winuser.h:1824
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define IMC_SETCANDIDATEPOS
Definition: imm.h:279
BOOL WINAPI ImmGetOpenStatus(HIMC hIMC)
Definition: ime.c:1331
#define _Out_
Definition: ms_sal.h:345
static LRESULT ImeWnd_OnImeNotify(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:246
WORD ATOM
Definition: dimm.idl:113
BOOL WINAPI ImmGetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
Definition: ime.c:1494
#define TRUE
Definition: types.h:120
#define pt(x, y)
Definition: drawing.c:79
#define IMC_SETCOMPOSITIONFONT
Definition: imm.h:281
#define MAX_CANDIDATEFORM
Definition: imm.c:17
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define IMS_IMEACTIVATE
Definition: immdev.h:38
LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC hIMC)
Definition: imm.c:1015
#define CP_ACP
Definition: compat.h:109
VOID FASTCALL CtfLoadThreadLayout(PIMEUI pimeui)
Definition: imm.c:578
BOOL WINAPI IMPGetIMEA(HWND hwnd, LPIMEPROA ime)
Definition: imm.c:1197
char CHAR
Definition: xmlstorage.h:175
Definition: ntuser.h:190
#define INT
Definition: polytest.cpp:20
BOOL WINAPI ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
Definition: ime.c:873
PSERVERINFO gpsi
Definition: imm.c:17
HWND hWnd
Definition: settings.c:17
#define IMS_FREELAYOUT
Definition: immdev.h:35
DWORD NTAPI NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion)
Definition: ime.c:810
HKL hKL
Definition: ntuser.h:1212
HANDLE HWND
Definition: compat.h:19
#define WM_IME_SELECT
Definition: winuser.h:1823
PWND spwnd
Definition: ntuser.h:1209
#define GET_X_LPARAM(lp)
Definition: windowsx.h:274
u32_t magic(void)
#define IMS_GETCONVSTATUS
Definition: immdev.h:36
BOOL WINAPI ImmLoadIME(HKL hKL)
Definition: ime.c:993
LRESULT WINAPI ImeWndProcW(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: imm.c:1088
BOOL WINAPI WINNLSEnableIME(HWND hwnd, BOOL enable)
Definition: imm.c:1227
static LRESULT User32SendImeUIMessage(PIMEUI pimeui, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:170
#define IMC_GETCONVERSIONMODE
Definition: immdev.h:21
LRESULT WINAPI ImmPutImeMenuItemsIntoMappedFile(HIMC hIMC)
Definition: ime.c:398
DWORD dwStyle
Definition: dimm.idl:80
LONG nCntInIMEProc
Definition: ntuser.h:1214
#define IMS_SETLANGBAND
Definition: immdev.h:46
UINT_PTR WPARAM
Definition: windef.h:207
BOOL WINAPI IMPSetIMEW(HWND hwnd, LPIMEPROW ime)
Definition: imm.c:1147
#define WS_CHILD
Definition: pedump.c:617
#define GetWin32ClientInfo()
Definition: ntuser.h:335
HRESULT User32GetImmFileName(_Out_ LPWSTR lpBuffer, _In_ size_t cchBuffer)
Definition: imm.c:57
#define GetWindowLongPtrW
Definition: winuser.h:4819
LRESULT WINAPI ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:935
WORD WINAPI ImmSendIMEMessageExA(HWND hWnd, LPARAM lParam)
Definition: win3.c:210
DWORD fdwConversion
Definition: immdev.h:60
BOOL WINAPI ImmGetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
Definition: ime.c:1530
#define FNID_DESTROY
Definition: ntuser.h:877
HIMC hImc
Definition: ntuser.h:719
BOOL WINAPI ImmGetCandidateWindow(HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandidate)
Definition: candidate.c:359
static VOID User32SetImeWindowOfImc(HIMC hIMC, HWND hImeWnd)
Definition: imm.c:214
DWORD WINAPI CtfImmHideToolbarWnd(VOID)
Definition: ctf.c:92
#define BOOL
Definition: nt_native.h:43
#define FASTCALL
Definition: nt_native.h:50
#define WM_NCCREATE
Definition: winuser.h:1673
BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence)
Definition: ime.c:1814
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4306
#define DWORD
Definition: nt_native.h:44
#define WM_IME_COMPOSITIONFULL
Definition: winuser.h:1822
int32_t INT
Definition: typedefs.h:58
WPARAM wParam
Definition: combotst.c:138
BOOL WINAPI ImmRegisterClient(PSHAREDINFO ptr, HINSTANCE hMod)
Definition: imm.c:44
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LRESULT WINAPI SendIMEMessageExA(HWND hwnd, LPARAM lParam)
Definition: imm.c:1217
BOOL WINAPI ImmSetActiveContext(HWND hWnd, HIMC hIMC, BOOL fActive)
Definition: imm.c:1121
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
ATOM WINAPI RegisterClassExWOWW(WNDCLASSEXW *, LPDWORD, WORD, DWORD, BOOL)
Definition: class.c:1413
uint32_t ULONG_PTR
Definition: typedefs.h:65
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
Definition: window.c:4181
#define HELP_FINDER
Definition: winuser.h:2409
LRESULT WINAPI CtfImmDispatchDefImeMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: ctf.c:101
BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
Definition: ime.c:1624
#define L(x)
Definition: ntvdm.h:50
#define IMS_IMEDEACTIVATE
Definition: immdev.h:39
#define QUERY_WINDOW_FOCUS
Definition: ntuser.h:2925
#define IMN_SETOPENSTATUS
Definition: imm.h:528
#define IMC_GETSTATUSWINDOWPOS
Definition: imm.h:284
#define FALSE
Definition: types.h:117
DWORD dwSRVIFlags
Definition: ntuser.h:1022
HINSTANCE hInst
Definition: ntuser.h:1254
DWORD fnid
Definition: ntuser.h:688
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
Definition: ime.c:1354
HWND hwndUI
Definition: ntuser.h:1213
BOOL WINAPI ImmIMPQueryIMEW(LPIMEPROW pImePro)
Definition: utils.c:1206
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
#define debugstr_w
Definition: kernel32.h:32
static DWORD cchBuffer
Definition: fusion.c:85
BOOL WINAPI ImmFreeLayout(DWORD dwUnknown)
Definition: imm.c:109
BOOL WINAPI ImmIMPSetIMEA(HWND hWnd, LPIMEPROA pImePro)
Definition: utils.c:1215
#define FIXME(fmt,...)
Definition: debug.h:111
GLenum GLuint GLenum GLsizei length
Definition: glext.h:5579
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4305
BOOL NTAPI NtUserCallHwndLock(HWND hWnd, DWORD Routine)
Definition: simplecall.c:590
DWORD dwLastStatus
Definition: ntuser.h:1224
static VOID User32DestroyImeUIWindow(PIMEUI pimeui)
Definition: imm.c:375
THRDESKHEAD head
Definition: ntuser.h:674
#define IMS_SETCOMPFONT
Definition: immdev.h:31
BOOL NTAPI NtUserSetImeOwnerWindow(HWND hImeWnd, HWND hwndFocus)
Definition: ime.c:1365
#define LoadLibraryW(x)
Definition: compat.h:606
BOOL WINAPI User32InitializeImmEntryTable(DWORD)
Definition: imm.c:126
#define IME_ESC_GETHELPFILENAME
Definition: imm.h:572
BOOLEAN NTAPI NtUserDestroyWindow(HWND Wnd)
Definition: window.c:3019
BOOL WINAPI GetClassInfoW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSW)
#define _In_
Definition: ms_sal.h:308
BOOL WINAPI InitializeImmEntryTable(VOID)
Definition: imm.c:119
BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1443
LONG_PTR LPARAM
Definition: windef.h:208
#define IMC_CLOSESTATUSWINDOW
Definition: imm.h:286
LRESULT ImeWnd_OnImeSetContext(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:779
UINT fDestroy
Definition: ntuser.h:1218
BOOL gbImmInitializing
Definition: imm.c:22
#define WM_IME_REQUEST
Definition: winuser.h:1826
#define WM_IME_SYSTEM
Definition: undocuser.h:59
DWORD HIMC
Definition: dimm.idl:75
BOOL WINAPI IMPGetIMEW(HWND hwnd, LPIMEPROW ime)
Definition: imm.c:1167
#define IMC_GETCOMPOSITIONWINDOW
Definition: imm.h:282
#define WM_DESTROY
Definition: winuser.h:1599
#define IME_PROP_UNICODE
Definition: imm.h:393
LRESULT WINAPI ImeWndProcA(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: imm.c:1082
#define UserHMGetHandle(obj)
Definition: ntuser.h:222
#define WM_COPYDATA
Definition: winuser.h:1654
Imm32ApiTable gImmApiEntries
Definition: imm.c:47
#define TRACE(s)
Definition: solgame.cpp:4
#define QUERY_WINDOW_ACTIVE
Definition: ntuser.h:2924
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define IMS_LOADTHREADLAYOUT
Definition: immdev.h:45
static LRESULT FASTCALL User32DoImeHelp(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:588
#define IMC_SETCONVERSIONMODE
Definition: imm.h:221
#define ASSERT(a)
Definition: mode.c:44
#define IMMGWLP_IMC
Definition: immdev.h:52
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
DWORD fdwProperty
Definition: imm.h:158
#define WM_IME_SETCONTEXT
Definition: winuser.h:1819
#define _countof(array)
Definition: sndvol32.h:68
static LRESULT ImeWnd_OnImeSystem(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:623
#define IMS_COMPLETECOMPSTR
Definition: immdev.h:44
HIMC WINAPI ImmGetContext(HWND hWnd)
Definition: imm.c:1002
#define IMS_SENDNOTIFICATION
Definition: immdev.h:43
HIMC hIMC
Definition: ntuser.h:1210
#define WM_IME_CONTROL
Definition: winuser.h:1821
PIMEDPI WINAPI ImmLockImeDpi(HKL hKL)
Definition: ime.c:916
#define CS_GLOBALCLASS
Definition: winuser.h:647
#define WM_NCDESTROY
Definition: winuser.h:1674
#define MAX_PATH
Definition: compat.h:34
#define WINAPI
Definition: msvc.h:6
#define IS_CICERO_MODE()
Definition: ntuser.h:1205
BOOL WINAPI ImmIMPGetIMEW(HWND hWnd, LPIMEPROW pImePro)
Definition: utils.c:1188
#define IMS_GETCONTEXT
Definition: immdev.h:42
unsigned long DWORD
Definition: ntddk_ex.h:95
HWND hImeWnd
Definition: ntuser.h:195
#define IMC_SETSTATUSWINDOWPOS
Definition: imm.h:285
WCHAR wszUIClass[16]
Definition: ntuser.h:1180
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2074
WORD WINAPI ImmSendIMEMessageExW(HWND hWnd, LPARAM lParam)
Definition: win3.c:219
#define IMC_GETSOFTKBDPOS
Definition: immdev.h:24
static INT ImeWnd_OnCreate(PIMEUI pimeui, LPCREATESTRUCT lpCS)
Definition: imm.c:343
#define WM_PAINT
Definition: winuser.h:1610
SHAREDINFO gSharedInfo
Definition: imm.c:18
#define NtUserSetWindowLongPtr
Definition: ntuser.h:3372
static BOOL User32GetImeShowStatus(VOID)
Definition: imm.c:162
#define IMC_GETCANDIDATEPOS
Definition: imm.h:278
#define IMC_OPENSTATUSWINDOW
Definition: imm.h:287
#define IMS_SETCOMPFORM
Definition: immdev.h:32
#define IMS_ACTIVATELAYOUT
Definition: immdev.h:40
int ret
TCHAR szHelpFile[]
Definition: scrnsave.c:30
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
#define ICLS_IME
Definition: ntuser.h:906
#define InterlockedDecrement
Definition: armddk.h:52
static VOID FASTCALL User32SetImeActivenessOfWindow(HWND hWnd, BOOL bActive)
Definition: imm.c:562
BOOL WINAPI ImmIMPSetIMEW(HWND hWnd, LPIMEPROW pImePro)
Definition: utils.c:1224
#define IMN_PRIVATE
Definition: imm.h:534
BOOL WINAPI ImmWINNLSEnableIME(HWND hWnd, BOOL enable)
Definition: ime.c:2007
WINE_DEFAULT_DEBUG_CHANNEL(imm)
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
UINT_PTR HKL
Definition: msctf.idl:101
#define IMC_SETSENTENCEMODE
Definition: imm.h:222
BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
Definition: ime.c:1927
static VOID User32UpdateImcOfImeUI(PIMEUI pimeui, HIMC hNewIMC)
Definition: imm.c:224
#define IMS_CONFIGURE
Definition: immdev.h:33
LRESULT WINAPI ImmEscapeW(HKL hKL, HIMC hIMC, UINT uSubFunc, LPVOID lpData)
Definition: ime.c:1254
#define IMS_NOTIFYIMESHOW
Definition: immdev.h:28
BOOL WINAPI ImmWINNLSGetEnableStatus(HWND hWnd)
Definition: imm.c:1217
DWORD NTAPI NtUserCallHwndParamLock(HWND hWnd, DWORD_PTR Param, DWORD Routine)
Definition: simplecall.c:889
BOOL WINAPI ImmSetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
Definition: ime.c:1415
DWORD_PTR NTAPI NtUserCallNoParam(DWORD Routine)
Definition: simplecall.c:59
BOOL WINAPI IMPQueryIMEW(LPIMEPROW ime)
Definition: imm.c:1157
static BOOL IntInitializeImmEntryTable(VOID)
Definition: imm.c:70
BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
Definition: imm.c:1043
LRESULT WINAPI ImmSystemHandler(HIMC hIMC, WPARAM wParam, LPARAM lParam)
Definition: keymsg.c:769
#define ERR(fmt,...)
Definition: debug.h:110
#define GWL_STYLE
Definition: winuser.h:846
Definition: ntuser.h:672
HINSTANCE ghImm32
Definition: imm.c:20
HWND WINAPI GetParent(_In_ HWND)
BOOL WINAPI ImmGetConversionStatus(HIMC hIMC, LPDWORD lpfdwConversion, LPDWORD lpfdwSentence)
Definition: ime.c:1792
BOOL WINAPI WINNLSGetEnableStatus(HWND hwnd)
Definition: imm.c:1237
static HWND User32CreateImeUIWindow(PIMEUI pimeui, HKL hKL)
Definition: imm.c:297
#define IS_IME_HKL(hKL)
Definition: input.h:88
GLboolean enable
Definition: glext.h:11120
IMEINFO ImeInfo
Definition: ntuser.h:1179
BOOL WINAPI IMPQueryIMEA(LPIMEPROA ime)
Definition: imm.c:1187
#define InterlockedIncrement
Definition: armddk.h:53
BOOL WINAPI RegisterIMEClass(VOID)
Definition: imm.c:1119
#define IMS_UPDATEIMEUI
Definition: immdev.h:29
BOOL NTAPI NtUserUpdateInputContext(HIMC hIMC, DWORD dwType, DWORD_PTR dwValue)
Definition: ime.c:1765
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define IMN_SETCONVERSIONMODE
Definition: imm.h:526
DWORD state
Definition: ntuser.h:680
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2313
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define IMC_SETOPENSTATUS
Definition: imm.h:223
#define IME_ESC_QUERY_SUPPORT
Definition: imm.h:558
#define WS_POPUP
Definition: pedump.c:616
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
#define IME_CONFIG_GENERAL
Definition: imm.h:553
#define GW_OWNER
Definition: winuser.h:761
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
UINT fShowStatus
Definition: ntuser.h:1216
BOOL WINAPI UpdatePerUserImmEnabling(VOID)
Definition: imm.c:1094
static VOID ImeWnd_OnImeSelect(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:391
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:275
BOOL WINAPI WinHelpW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_ UINT, _In_ ULONG_PTR)
#define IMS_GETIMEMENU
Definition: immdev.h:41
HINSTANCE hInstance
Definition: winuser.h:3170
BOOL WINAPI ImmIMPQueryIMEA(LPIMEPROA pImePro)
Definition: utils.c:1197
#define msg(x)
Definition: auth_time.c:54
#define IDC_ARROW
Definition: winuser.h:682
BOOL WINAPI ImmSetCandidateWindow(HIMC hIMC, LPCANDIDATEFORM lpCandidate)
Definition: candidate.c:385
BOOL WINAPI IMPSetIMEA(HWND hwnd, LPIMEPROA ime)
Definition: imm.c:1177
#define WM_CREATE
Definition: winuser.h:1598
#define SRVINFO_IMM32
Definition: ntuser.h:928
BOOL WINAPI ImmIMPGetIMEA(HWND hWnd, LPIMEPROA pImePro)
Definition: utils.c:1179
#define ICLASS_TO_MASK(iCls)
Definition: ntuser.h:881
DWORD state2
Definition: ntuser.h:681
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
#define IMC_SETCOMPOSITIONWINDOW
Definition: imm.h:283
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
BOOL NTAPI NtUserSetWindowFNID(HWND hWnd, WORD fnID)
Definition: window.c:4336
LRESULT WINAPI SendIMEMessageExW(HWND hwnd, LPARAM lParam)
Definition: imm.c:1207
#define ULONG_PTR
Definition: config.h:101
#define IMM_INIT_MAGIC
Definition: imm.c:16
#define IMC_SETSOFTKBDPOS
Definition: immdev.h:25
UINT fCtrlShowStatus
Definition: ntuser.h:1221
#define SetWindowLongPtrW
Definition: winuser.h:5336
DWORD RegisterDefaultClasses
Definition: regcontrol.c:13
#define WM_ERASEBKGND
Definition: winuser.h:1615
#define IMC_GETOPENSTATUS
Definition: immdev.h:23
BOOL WINAPI ImmActivateLayout(HKL hKL)
Definition: imm.c:438
LPVOID FASTCALL ValidateHandle(HANDLE hObject, UINT uType)
Definition: utils.c:328
struct tagIMEUI * PIMEUI
HWND hwndIMC
Definition: ntuser.h:1211
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define IMC_GETSENTENCEMODE
Definition: immdev.h:22
BOOL WINAPI ImmSetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1467
LONG_PTR LRESULT
Definition: windef.h:209
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4022
IN PCTCH IN DWORD cch
Definition: pager.h:36
UINT fActivate
Definition: ntuser.h:1217
Arabic default style
Definition: afstyles.h:93
HWND FASTCALL IntGetTopLevelWindow(HWND hWnd)
Definition: imm.c:26
VOID WINAPI CtfImmRestoreToolbarWnd(DWORD dwStatus)
Definition: ctf.c:84
#define IMS_UNSETLANGBAND
Definition: immdev.h:47
#define WNDS_DESTROYED
Definition: ntuser.h:619
BOOL WINAPI ImmUnlockIMC(HIMC hIMC)
Definition: imm.c:1024
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
DWORD dwStyle
Definition: dimm.idl:86
#define HeapFree(x, y, z)
Definition: compat.h:594
#define IMS_SETCANDFORM
Definition: immdev.h:30
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define IMS_IMEHELP
Definition: immdev.h:37
INT gfConIme
Definition: imm.c:24
WCHAR WndClass[]
Definition: capicon.c:23
#define WNDS2_INDESTROY
Definition: ntuser.h:631
#define FNID_IME
Definition: ntuser.h:853
HRESULT WINAPI CtfImmTIMActivate(HKL hKL)
Definition: ctf.c:75
static LRESULT ImeWnd_OnImeControl(PIMEUI pimeui, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:427
#define ValidateHwnd(hwnd)
Definition: precomp.h:85
#define IMM_FN(name)
Definition: user32p.h:56
DWORD style
Definition: ntuser.h:685