ReactOS 0.4.15-dev-8390-g075894b
imm.c File Reference
#include <user32.h>
#include <strsafe.h>
#include <immdev.h>
#include "immtable.h"
Include dependency graph for imm.c:

Go to the source code of this file.

Macros

#define IMM_INIT_MAGIC   0x19650412
 
#define MAX_CANDIDATEFORM   4
 
#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind)    static type WINAPI IMMSTUB_##name params { IMM_RETURN_##retkind((type)retval); }
 
#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind)    IMMSTUB_##name,
 
#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (user32)
 
HWND FASTCALL IntGetTopLevelWindow (HWND hWnd)
 
HRESULT User32GetImmFileName (_Out_ LPWSTR lpBuffer, _In_ size_t cchBuffer)
 
static BOOL IntInitializeImmEntryTable (VOID)
 
BOOL WINAPI InitializeImmEntryTable (VOID)
 
BOOL WINAPI User32InitializeImmEntryTable (DWORD magic)
 
static BOOL User32CanSetImeWindowToImc (HIMC hIMC, HWND hImeWnd)
 
static BOOL User32GetImeShowStatus (VOID)
 
static LRESULT User32SendImeUIMessage (PIMEUI pimeui, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode)
 
static VOID User32NotifyOpenStatus (PIMEUI pimeui, HWND hwndIMC, BOOL bOpen)
 
static VOID User32SetImeWindowOfImc (HIMC hIMC, HWND hImeWnd)
 
static VOID User32UpdateImcOfImeUI (PIMEUI pimeui, HIMC hNewIMC)
 
static LRESULT ImeWnd_OnImeNotify (PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
 
static HWND User32CreateImeUIWindow (PIMEUI pimeui, HKL hKL)
 
static INT ImeWnd_OnCreate (PIMEUI pimeui, LPCREATESTRUCT lpCS)
 
static VOID User32DestroyImeUIWindow (PIMEUI pimeui)
 
static VOID ImeWnd_OnImeSelect (PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
 
static LRESULT ImeWnd_OnImeControl (PIMEUI pimeui, WPARAM wParam, LPARAM lParam, BOOL unicode)
 
static VOID FASTCALL User32SetImeActivenessOfWindow (HWND hWnd, BOOL bActive)
 
VOID FASTCALL CtfLoadThreadLayout (PIMEUI pimeui)
 
static LRESULT FASTCALL User32DoImeHelp (PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
 
static LRESULT ImeWnd_OnImeSystem (PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
 
LRESULT ImeWnd_OnImeSetContext (PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
 
LRESULT WINAPI ImeWndProc_common (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode)
 
LRESULT WINAPI ImeWndProcA (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
LRESULT WINAPI ImeWndProcW (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
BOOL WINAPI UpdatePerUserImmEnabling (VOID)
 
BOOL WINAPI RegisterIMEClass (VOID)
 
BOOL WINAPI IMPSetIMEW (HWND hwnd, LPIMEPROW ime)
 
BOOL WINAPI IMPQueryIMEW (LPIMEPROW ime)
 
BOOL WINAPI IMPGetIMEW (HWND hwnd, LPIMEPROW ime)
 
BOOL WINAPI IMPSetIMEA (HWND hwnd, LPIMEPROA ime)
 
BOOL WINAPI IMPQueryIMEA (LPIMEPROA ime)
 
BOOL WINAPI IMPGetIMEA (HWND hwnd, LPIMEPROA ime)
 
LRESULT WINAPI SendIMEMessageExW (HWND hwnd, LPARAM lParam)
 
LRESULT WINAPI SendIMEMessageExA (HWND hwnd, LPARAM lParam)
 
BOOL WINAPI WINNLSEnableIME (HWND hwnd, BOOL enable)
 
BOOL WINAPI WINNLSGetEnableStatus (HWND hwnd)
 
UINT WINAPI WINNLSGetIMEHotkey (HWND hwnd)
 

Variables

HINSTANCE ghImm32 = NULL
 
BOOL gbImmInitializing = FALSE
 
INT gfConIme = -1
 
Imm32ApiTable gImmApiEntries
 

Macro Definition Documentation

◆ DEFINE_IMM_ENTRY [1/3]

#define DEFINE_IMM_ENTRY (   type,
  name,
  params,
  retval,
  retkind 
)     static type WINAPI IMMSTUB_##name params { IMM_RETURN_##retkind((type)retval); }

Definition at line 42 of file imm.c.

◆ DEFINE_IMM_ENTRY [2/3]

#define DEFINE_IMM_ENTRY (   type,
  name,
  params,
  retval,
  retkind 
)     IMMSTUB_##name,

Definition at line 42 of file imm.c.

◆ DEFINE_IMM_ENTRY [3/3]

#define DEFINE_IMM_ENTRY (   type,
  name,
  params,
  retval,
  retkind 
)
Value:
do { \
FN_##name proc = (FN_##name)GetProcAddress(imm32, #name); \
if (!proc) { \
ERR("Could not load %s\n", #name); \
return FALSE; \
} \
IMM_FN(name) = proc; \
} while (0);
#define FALSE
Definition: types.h:117
#define GetProcAddress(x, y)
Definition: compat.h:753
static HANDLE proc()
Definition: pdb.c:34
Definition: name.c:39

Definition at line 42 of file imm.c.

◆ IMM_INIT_MAGIC

#define IMM_INIT_MAGIC   0x19650412

Definition at line 16 of file imm.c.

◆ MAX_CANDIDATEFORM

#define MAX_CANDIDATEFORM   4

Definition at line 17 of file imm.c.

Function Documentation

◆ CtfLoadThreadLayout()

VOID FASTCALL CtfLoadThreadLayout ( PIMEUI  pimeui)

Definition at line 578 of file imm.c.

579{
580 IMM_FN(CtfImmTIMActivate)(pimeui->hKL);
581 pimeui->hKL = GetWin32ClientInfo()->hKL;
582 IMM_FN(ImmLoadIME)(pimeui->hKL);
583 pimeui->hwndUI = NULL;
584}
HRESULT WINAPI CtfImmTIMActivate(_In_ HKL hKL)
Definition: ctf.c:1123
#define NULL
Definition: types.h:112
BOOL WINAPI ImmLoadIME(HKL hKL)
Definition: ime.c:1055
#define GetWin32ClientInfo()
Definition: ntuser.h:352
HKL hKL
Definition: ntuser.h:1218
HWND hwndUI
Definition: ntuser.h:1219
#define IMM_FN(name)
Definition: user32p.h:56

Referenced by ImeWnd_OnImeSystem().

◆ ImeWnd_OnCreate()

static INT ImeWnd_OnCreate ( PIMEUI  pimeui,
LPCREATESTRUCT  lpCS 
)
static

Definition at line 343 of file imm.c.

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}
DWORD HIMC
Definition: dimm.idl:75
#define TRUE
Definition: types.h:120
#define ValidateHwnd(hwnd)
Definition: precomp.h:85
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define WS_POPUP
Definition: pedump.c:616
#define WS_DISABLED
Definition: pedump.c:621
Definition: ntuser.h:694
DWORD style
Definition: ntuser.h:706
HIMC hImc
Definition: ntuser.h:740
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
LONG nCntInIMEProc
Definition: ntuser.h:1220
UINT fDestroy
Definition: ntuser.h:1224
static BOOL User32CanSetImeWindowToImc(HIMC hIMC, HWND hImeWnd)
Definition: imm.c:155
static VOID User32UpdateImcOfImeUI(PIMEUI pimeui, HIMC hNewIMC)
Definition: imm.c:224

Referenced by ImeWndProc_common().

◆ ImeWnd_OnImeControl()

static LRESULT ImeWnd_OnImeControl ( PIMEUI  pimeui,
WPARAM  wParam,
LPARAM  lParam,
BOOL  unicode 
)
static

Definition at line 427 of file imm.c.

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}
BOOL WINAPI ImmSetCandidateWindow(HIMC hIMC, LPCANDIDATEFORM lpCandidate)
Definition: candidate.c:410
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
DWORD WINAPI CtfImmHideToolbarWnd(VOID)
Definition: ctf.c:1362
BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
Definition: ime.c:1744
BOOL WINAPI ImmGetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
Definition: ime.c:1615
BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
Definition: ime.c:1688
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
BOOL WINAPI ImmGetConversionStatus(HIMC hIMC, LPDWORD lpfdwConversion, LPDWORD lpfdwSentence)
Definition: ime.c:1912
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
#define pt(x, y)
Definition: drawing.c:79
unsigned long DWORD
Definition: ntddk_ex.h:95
#define IMC_SETCANDIDATEPOS
Definition: imm.h:149
#define IMC_CLOSESTATUSWINDOW
Definition: imm.h:156
#define IMC_SETSTATUSWINDOWPOS
Definition: imm.h:155
#define IMC_GETCOMPOSITIONWINDOW
Definition: imm.h:152
#define IMC_SETCOMPOSITIONWINDOW
Definition: imm.h:153
#define IMC_GETCANDIDATEPOS
Definition: imm.h:148
#define IMN_OPENSTATUSWINDOW
Definition: imm.h:373
#define IMC_GETCOMPOSITIONFONT
Definition: imm.h:150
#define IMC_SETCOMPOSITIONFONT
Definition: imm.h:151
#define IMC_OPENSTATUSWINDOW
Definition: imm.h:157
#define IMN_CLOSESTATUSWINDOW
Definition: imm.h:372
#define IMC_GETSTATUSWINDOWPOS
Definition: imm.h:154
#define IMC_SETOPENSTATUS
Definition: immdev.h:394
#define IMC_SETCONVERSIONMODE
Definition: immdev.h:392
#define IMC_SETSENTENCEMODE
Definition: immdev.h:393
#define IMC_GETSOFTKBDPOS
Definition: immdev.h:91
#define IMC_GETSENTENCEMODE
Definition: immdev.h:87
#define IMC_GETOPENSTATUS
Definition: immdev.h:88
#define IMC_SETSOFTKBDPOS
Definition: immdev.h:92
#define IMC_GETCONVERSIONMODE
Definition: immdev.h:86
#define IS_CICERO_MODE()
Definition: ntuser.h:1210
#define BOOL
Definition: nt_native.h:43
#define DWORD
Definition: nt_native.h:44
HIMC hIMC
Definition: ntuser.h:1216
static BOOL User32GetImeShowStatus(VOID)
Definition: imm.c:162
static LRESULT User32SendImeUIMessage(PIMEUI pimeui, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:170
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
#define WM_IME_NOTIFY
Definition: winuser.h:1830
#define WM_IME_CONTROL
Definition: winuser.h:1831

Referenced by ImeWndProc_common().

◆ ImeWnd_OnImeNotify()

static LRESULT ImeWnd_OnImeNotify ( PIMEUI  pimeui,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 246 of file imm.c.

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}
BOOL WINAPI ImmUnlockIMC(HIMC hIMC)
Definition: imm.c:1066
LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC hIMC)
Definition: imm.c:1057
#define IMN_PRIVATE
Definition: imm.h:385
#define IMN_SETOPENSTATUS
Definition: imm.h:379
#define IMN_SETCONVERSIONMODE
Definition: imm.h:377
DWORD NTAPI NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion)
Definition: ime.c:803
#define ASSERT(a)
Definition: mode.c:44
DWORD fdwConversion
Definition: immdev.h:133
int ret
INT gfConIme
Definition: imm.c:24
LONG_PTR LRESULT
Definition: windef.h:209
#define GW_OWNER
Definition: winuser.h:766
BOOL WINAPI IsWindow(_In_opt_ HWND)
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by ImeWndProc_common().

◆ ImeWnd_OnImeSelect()

static VOID ImeWnd_OnImeSelect ( PIMEUI  pimeui,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 391 of file imm.c.

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}
UINT_PTR HKL
Definition: msctf.idl:143
static VOID User32DestroyImeUIWindow(PIMEUI pimeui)
Definition: imm.c:375
static HWND User32CreateImeUIWindow(PIMEUI pimeui, HKL hKL)
Definition: imm.c:297
static VOID User32NotifyOpenStatus(PIMEUI pimeui, HWND hwndIMC, BOOL bOpen)
Definition: imm.c:199
#define WM_IME_SELECT
Definition: winuser.h:1833

Referenced by ImeWndProc_common().

◆ ImeWnd_OnImeSetContext()

LRESULT ImeWnd_OnImeSetContext ( PIMEUI  pimeui,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 779 of file imm.c.

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}
HANDLE HWND
Definition: compat.h:19
HIMC WINAPI ImmGetContext(HWND hWnd)
Definition: imm.c:1044
#define IMMGWLP_IMC
Definition: immdev.h:125
#define QUERY_WINDOW_FOCUS
Definition: ntuser.h:2830
#define QUERY_WINDOW_ACTIVE
Definition: ntuser.h:2829
BOOL NTAPI NtUserSetImeOwnerWindow(HWND hImeWnd, HWND hwndFocus)
Definition: ime.c:1362
@ THREADSTATE_CHECKCONIME
Definition: ntuser.h:2489
@ HWNDLOCK_ROUTINE_CHECKIMESHOWSTATUSINTHRD
Definition: ntuser.h:1629
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
Definition: window.c:4189
BOOL NTAPI NtUserCallHwndLock(HWND hWnd, DWORD Routine)
Definition: simplecall.c:585
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
Definition: misc.c:240
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define INT
Definition: polytest.cpp:20
THRDESKHEAD head
Definition: ntuser.h:695
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
HWND FASTCALL IntGetTopLevelWindow(HWND hWnd)
Definition: imm.c:26
#define WM_IME_SETCONTEXT
Definition: winuser.h:1829
#define SetWindowLongPtrW
Definition: winuser.h:5355

Referenced by ImeWndProc_common().

◆ ImeWnd_OnImeSystem()

static LRESULT ImeWnd_OnImeSystem ( PIMEUI  pimeui,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 623 of file imm.c.

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}
#define FIXME(fmt,...)
Definition: precomp.h:53
BOOL WINAPI ImmGetCandidateWindow(HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandidate)
Definition: candidate.c:377
BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
Definition: ime.c:1559
BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
Definition: ime.c:2055
LRESULT WINAPI ImmPutImeMenuItemsIntoMappedFile(HIMC hIMC)
Definition: ime.c:448
BOOL WINAPI ImmFreeLayout(DWORD dwUnknown)
Definition: imm.c:115
BOOL WINAPI ImmActivateLayout(HKL hKL)
Definition: imm.c:442
#define MAX_CANDIDATEFORM
Definition: precomp.h:53
#define ULONG_PTR
Definition: config.h:101
unsigned int BOOL
Definition: ntddk_ex.h:94
#define IME_CONFIG_GENERAL
Definition: imm.h:405
#define IMS_IMEHELP
Definition: immdev.h:107
#define IMS_GETIMEMENU
Definition: immdev.h:111
#define IMS_SETOPENSTATUS
Definition: immdev.h:104
#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 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 IMS_ACTIVATELAYOUT
Definition: immdev.h:110
#define IMS_IMEDEACTIVATE
Definition: immdev.h:109
#define IMS_SETCOMPFORM
Definition: immdev.h:102
#define IMS_SENDNOTIFICATION
Definition: immdev.h:113
DWORD NTAPI NtUserCallHwndParamLock(HWND hWnd, DWORD_PTR Param, DWORD Routine)
Definition: simplecall.c:884
@ TWOPARAM_ROUTINE_IMESHOWSTATUSCHANGE
Definition: ntuser.h:1638
LRESULT WINAPI ImmSystemHandler(HIMC hIMC, WPARAM wParam, LPARAM lParam)
Definition: keymsg.c:813
unsigned int UINT
Definition: ndis.h:50
DWORD dwStyle
Definition: dimm.idl:80
DWORD dwStyle
Definition: dimm.idl:86
static VOID FASTCALL User32SetImeActivenessOfWindow(HWND hWnd, BOOL bActive)
Definition: imm.c:562
VOID FASTCALL CtfLoadThreadLayout(PIMEUI pimeui)
Definition: imm.c:578
static LRESULT FASTCALL User32DoImeHelp(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:588

Referenced by ImeWndProc_common().

◆ ImeWndProc_common()

LRESULT WINAPI ImeWndProc_common ( HWND  hwnd,
UINT  msg,
WPARAM  wParam,
LPARAM  lParam,
BOOL  unicode 
)

Definition at line 935 of file imm.c.

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}
#define msg(x)
Definition: auth_time.c:54
#define ERR(fmt,...)
Definition: precomp.h:57
LRESULT WINAPI CtfImmDispatchDefImeMessage(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam)
Definition: ctf.c:1416
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define IS_IME_HKL(hKL)
Definition: imm32_undoc.h:20
#define FNID_DESTROY
Definition: ntuser.h:898
struct tagIMEUI * PIMEUI
#define WNDS_DESTROYED
Definition: ntuser.h:636
#define FNID_IME
Definition: ntuser.h:874
#define WNDS2_INDESTROY
Definition: ntuser.h:648
BOOL NTAPI NtUserSetWindowFNID(HWND hWnd, WORD fnID)
Definition: window.c:4330
DWORD state2
Definition: ntuser.h:702
DWORD fnid
Definition: ntuser.h:709
DWORD state
Definition: ntuser.h:701
#define WM_IME_SYSTEM
Definition: undocuser.h:60
#define WM_FINALDESTROY
Definition: undocuser.h:39
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 LRESULT ImeWnd_OnImeSystem(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:623
static LRESULT ImeWnd_OnImeControl(PIMEUI pimeui, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:427
static VOID ImeWnd_OnImeSelect(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:391
static LRESULT ImeWnd_OnImeNotify(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
Definition: imm.c:246
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WM_PAINT
Definition: winuser.h:1620
#define WM_ERASEBKGND
Definition: winuser.h:1625
#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)
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_CREATE
Definition: winuser.h:1608
#define WM_IME_CHAR
Definition: winuser.h:1834
#define WM_IME_COMPOSITIONFULL
Definition: winuser.h:1832
#define WM_NCDESTROY
Definition: winuser.h:1684
#define WM_DESTROY
Definition: winuser.h:1609
BOOL WINAPI DestroyWindow(_In_ HWND)

Referenced by ImeWndProcA(), ImeWndProcW(), RealDefWindowProcA(), RealDefWindowProcW(), and RegisterClientPFN().

◆ ImeWndProcA()

LRESULT WINAPI ImeWndProcA ( HWND  hwnd,
UINT  msg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1090 of file imm.c.

1091{
1093}
LRESULT WINAPI ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: imm.c:935

Referenced by RegisterClientPFN().

◆ ImeWndProcW()

LRESULT WINAPI ImeWndProcW ( HWND  hwnd,
UINT  msg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1096 of file imm.c.

1097{
1099}

Referenced by RegisterClientPFN(), and RegisterIMEClass().

◆ IMPGetIMEA()

BOOL WINAPI IMPGetIMEA ( HWND  hwnd,
LPIMEPROA  ime 
)

Definition at line 1205 of file imm.c.

1206{
1207 return IMM_FN(ImmIMPGetIMEA)(hwnd, ime);
1208}
BOOL WINAPI ImmIMPGetIMEA(HWND hWnd, LPIMEPROA pImePro)
Definition: utils.c:1268

◆ IMPGetIMEW()

BOOL WINAPI IMPGetIMEW ( HWND  hwnd,
LPIMEPROW  ime 
)

Definition at line 1175 of file imm.c.

1176{
1177 return IMM_FN(ImmIMPGetIMEW)(hwnd, ime);
1178}
BOOL WINAPI ImmIMPGetIMEW(HWND hWnd, LPIMEPROW pImePro)
Definition: utils.c:1277

◆ IMPQueryIMEA()

BOOL WINAPI IMPQueryIMEA ( LPIMEPROA  ime)

Definition at line 1195 of file imm.c.

1196{
1197 return IMM_FN(ImmIMPQueryIMEA)(ime);
1198}
BOOL WINAPI ImmIMPQueryIMEA(LPIMEPROA pImePro)
Definition: utils.c:1286

◆ IMPQueryIMEW()

BOOL WINAPI IMPQueryIMEW ( LPIMEPROW  ime)

Definition at line 1165 of file imm.c.

1166{
1167 return IMM_FN(ImmIMPQueryIMEW)(ime);
1168}
BOOL WINAPI ImmIMPQueryIMEW(LPIMEPROW pImePro)
Definition: utils.c:1295

◆ IMPSetIMEA()

BOOL WINAPI IMPSetIMEA ( HWND  hwnd,
LPIMEPROA  ime 
)

Definition at line 1185 of file imm.c.

1186{
1187 return IMM_FN(ImmIMPSetIMEA)(hwnd, ime);
1188}
BOOL WINAPI ImmIMPSetIMEA(HWND hWnd, LPIMEPROA pImePro)
Definition: utils.c:1304

◆ IMPSetIMEW()

BOOL WINAPI IMPSetIMEW ( HWND  hwnd,
LPIMEPROW  ime 
)

Definition at line 1155 of file imm.c.

1156{
1157 return IMM_FN(ImmIMPSetIMEW)(hwnd, ime);
1158}
BOOL WINAPI ImmIMPSetIMEW(HWND hWnd, LPIMEPROW pImePro)
Definition: utils.c:1313

◆ InitializeImmEntryTable()

BOOL WINAPI InitializeImmEntryTable ( VOID  )

Definition at line 119 of file imm.c.

120{
123}
BOOL gbImmInitializing
Definition: imm.c:22
static BOOL IntInitializeImmEntryTable(VOID)
Definition: imm.c:70

Referenced by DllMain().

◆ IntGetTopLevelWindow()

HWND FASTCALL IntGetTopLevelWindow ( HWND  hWnd)

Definition at line 26 of file imm.c.

27{
29
30 for (; hWnd; hWnd = GetParent(hWnd))
31 {
33 if (!(style & WS_CHILD))
34 break;
35 }
36
37 return hWnd;
38}
Arabic default style
Definition: afstyles.h:94
HWND hWnd
Definition: settings.c:17
#define WS_CHILD
Definition: pedump.c:617
HWND WINAPI GetParent(_In_ HWND)
#define GWL_STYLE
Definition: winuser.h:852

Referenced by ImeWnd_OnImeSetContext().

◆ IntInitializeImmEntryTable()

static BOOL IntInitializeImmEntryTable ( VOID  )
static

Definition at line 70 of file imm.c.

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}
#define MAX_PATH
Definition: compat.h:34
#define LoadLibraryW(x)
Definition: compat.h:747
BOOL WINAPI ImmWINNLSEnableIME(HWND hWnd, BOOL enable)
Definition: ime.c:2136
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT User32GetImmFileName(_Out_ LPWSTR lpBuffer, _In_ size_t cchBuffer)
Definition: imm.c:57
HINSTANCE ghImm32
Definition: imm.c:20
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by InitializeImmEntryTable(), and User32InitializeImmEntryTable().

◆ RegisterIMEClass()

BOOL WINAPI RegisterIMEClass ( VOID  )

Definition at line 1127 of file imm.c.

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}
WCHAR WndClass[]
Definition: capicon.c:23
WORD ATOM
Definition: dimm.idl:113
#define ICLS_IME
Definition: ntuser.h:927
#define ICLASS_TO_MASK(iCls)
Definition: ntuser.h:902
#define L(x)
Definition: ntvdm.h:50
DWORD RegisterDefaultClasses
Definition: regcontrol.c:13
ATOM WINAPI RegisterClassExWOWW(WNDCLASSEXW *, LPDWORD, WORD, DWORD, BOOL)
Definition: class.c:1262
#define LONG_PTR
Definition: treelist.c:79
LRESULT WINAPI ImeWndProcW(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: imm.c:1096
#define IDC_ARROW
Definition: winuser.h:687
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2149
#define CS_GLOBALCLASS
Definition: winuser.h:652

Referenced by RegisterSystemControls().

◆ SendIMEMessageExA()

LRESULT WINAPI SendIMEMessageExA ( HWND  hwnd,
LPARAM  lParam 
)

Definition at line 1225 of file imm.c.

1226{
1228}
WORD WINAPI ImmSendIMEMessageExA(HWND hWnd, LPARAM lParam)
Definition: win3.c:216

◆ SendIMEMessageExW()

LRESULT WINAPI SendIMEMessageExW ( HWND  hwnd,
LPARAM  lParam 
)

Definition at line 1215 of file imm.c.

1216{
1218}
WORD WINAPI ImmSendIMEMessageExW(HWND hWnd, LPARAM lParam)
Definition: win3.c:225

◆ UpdatePerUserImmEnabling()

BOOL WINAPI UpdatePerUserImmEnabling ( VOID  )

Definition at line 1102 of file imm.c.

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}
PSERVERINFO gpsi
Definition: imm.c:18
DWORD_PTR NTAPI NtUserCallNoParam(DWORD Routine)
Definition: simplecall.c:59
@ NOPARAM_ROUTINE_UPDATEPERUSERIMMENABLING
Definition: ntuser.h:1539
#define SRVINFO_IMM32
Definition: ntuser.h:949
DWORD dwSRVIFlags
Definition: ntuser.h:1051

Referenced by UpdatePerUserSystemParameters().

◆ User32CanSetImeWindowToImc()

static BOOL User32CanSetImeWindowToImc ( HIMC  hIMC,
HWND  hImeWnd 
)
static

Definition at line 155 of file imm.c.

156{
158 return pIMC && (!pIMC->hImeWnd || pIMC->hImeWnd == hImeWnd || !ValidateHwnd(pIMC->hImeWnd));
159}
LPVOID FASTCALL ValidateHandle(HANDLE hObject, UINT uType)
Definition: utils.c:377
@ TYPE_INPUTCONTEXT
Definition: ntuser.h:57
Definition: ntuser.h:199
HWND hImeWnd
Definition: ntuser.h:203

Referenced by ImeWnd_OnCreate(), and ImeWnd_OnImeSetContext().

◆ User32CreateImeUIWindow()

static HWND User32CreateImeUIWindow ( PIMEUI  pimeui,
HKL  hKL 
)
static

Definition at line 297 of file imm.c.

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}
#define CP_ACP
Definition: compat.h:109
#define WideCharToMultiByte
Definition: compat.h:111
PIMEDPI WINAPI ImmLockImeDpi(HKL hKL)
Definition: ime.c:978
VOID WINAPI ImmUnlockImeDpi(PIMEDPI pImeDpi)
Definition: ime.c:1007
BOOL WINAPI ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
Definition: ime.c:932
@ ImeInfoExKeyboardLayout
Definition: imm32_undoc.h:48
#define IME_PROP_UNICODE
Definition: imm.h:249
#define NtUserSetWindowLongPtr
Definition: ntuser.h:3282
HINSTANCE hInst
Definition: imm32_undoc.h:61
HINSTANCE hInstance
Definition: winuser.h:3180
DWORD fdwProperty
Definition: immdev.h:22
IMEINFO ImeInfo
Definition: imm32_undoc.h:30
WCHAR wszUIClass[16]
Definition: imm32_undoc.h:31
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4315
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4316
BOOL WINAPI GetClassInfoW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSW)
char CHAR
Definition: xmlstorage.h:175

Referenced by ImeWnd_OnImeSelect(), and ImeWnd_OnImeSetContext().

◆ User32DestroyImeUIWindow()

static VOID User32DestroyImeUIWindow ( PIMEUI  pimeui)
static

Definition at line 375 of file imm.c.

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}
BOOLEAN NTAPI NtUserDestroyWindow(HWND Wnd)
Definition: window.c:3037

Referenced by ImeWnd_OnImeSelect(), and ImeWndProc_common().

◆ User32DoImeHelp()

static LRESULT FASTCALL User32DoImeHelp ( PIMEUI  pimeui,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 588 of file imm.c.

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}
LRESULT WINAPI ImmEscapeW(HKL hKL, HIMC hIMC, UINT uSubFunc, LPVOID lpData)
Definition: ime.c:1365
#define IME_ESC_QUERY_SUPPORT
Definition: imm.h:410
#define IME_ESC_GETHELPFILENAME
Definition: imm.h:424
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define debugstr_w
Definition: kernel32.h:32
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
TCHAR szHelpFile[]
Definition: scrnsave.c:31
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
BOOL WINAPI WinHelpW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_ UINT, _In_ ULONG_PTR)
#define HELP_FINDER
Definition: winuser.h:2419

Referenced by ImeWnd_OnImeSystem().

◆ User32GetImeShowStatus()

static BOOL User32GetImeShowStatus ( VOID  )
static

Definition at line 162 of file imm.c.

163{
165}
@ NOPARAM_ROUTINE_GETIMESHOWSTATUS
Definition: ntuser.h:1513

Referenced by ImeWnd_OnImeControl(), ImeWnd_OnImeSelect(), ImeWnd_OnImeSetContext(), and ImeWnd_OnImeSystem().

◆ User32GetImmFileName()

HRESULT User32GetImmFileName ( _Out_ LPWSTR  lpBuffer,
_In_ size_t  cchBuffer 
)

Definition at line 57 of file imm.c.

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}
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
static DWORD cchBuffer
Definition: fusion.c:85
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2313
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
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

Referenced by DllMain(), IntInitializeImmEntryTable(), and User32InitializeImmEntryTable().

◆ User32InitializeImmEntryTable()

BOOL WINAPI User32InitializeImmEntryTable ( DWORD  magic)

Definition at line 126 of file imm.c.

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}
SHAREDINFO gSharedInfo
Definition: imm.c:19
BOOL WINAPI ImmRegisterClient(PSHAREDINFO ptr, HINSTANCE hMod)
Definition: imm.c:57
#define IMM_INIT_MAGIC
Definition: precomp.h:50
u32_t magic(void)

Referenced by ImmDllInitialize().

◆ User32NotifyOpenStatus()

static VOID User32NotifyOpenStatus ( PIMEUI  pimeui,
HWND  hwndIMC,
BOOL  bOpen 
)
static

Definition at line 199 of file imm.c.

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}
#define LOWORD(l)
Definition: pedump.c:82
UINT_PTR WPARAM
Definition: windef.h:207

Referenced by ImeWnd_OnImeSelect(), and ImeWnd_OnImeSetContext().

◆ User32SendImeUIMessage()

static LRESULT User32SendImeUIMessage ( PIMEUI  pimeui,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL  unicode 
)
static

Definition at line 170 of file imm.c.

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}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by ImeWnd_OnImeControl(), ImeWnd_OnImeNotify(), ImeWnd_OnImeSelect(), ImeWnd_OnImeSetContext(), ImeWndProc_common(), and User32NotifyOpenStatus().

◆ User32SetImeActivenessOfWindow()

static VOID FASTCALL User32SetImeActivenessOfWindow ( HWND  hWnd,
BOOL  bActive 
)
static

Definition at line 562 of file imm.c.

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}
BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
Definition: imm.c:1085
BOOL WINAPI ImmSetActiveContext(HWND hWnd, HIMC hIMC, BOOL fActive)
Definition: imm.c:1124

Referenced by ImeWnd_OnImeSystem().

◆ User32SetImeWindowOfImc()

static VOID User32SetImeWindowOfImc ( HIMC  hIMC,
HWND  hImeWnd 
)
static

Definition at line 214 of file imm.c.

215{
217 if (!pIMC || pIMC->hImeWnd == hImeWnd)
218 return;
219
221}
BOOL NTAPI NtUserUpdateInputContext(HIMC hIMC, DWORD dwType, DWORD_PTR dwValue)
Definition: ime.c:1762
uint32_t ULONG_PTR
Definition: typedefs.h:65
@ UIC_IMEWINDOW
Definition: undocuser.h:304

Referenced by User32UpdateImcOfImeUI().

◆ User32UpdateImcOfImeUI()

static VOID User32UpdateImcOfImeUI ( PIMEUI  pimeui,
HIMC  hNewIMC 
)
static

Definition at line 224 of file imm.c.

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}
static VOID User32SetImeWindowOfImc(HIMC hIMC, HWND hImeWnd)
Definition: imm.c:214

Referenced by ImeWnd_OnCreate(), and ImeWnd_OnImeSetContext().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( user32  )

◆ WINNLSEnableIME()

BOOL WINAPI WINNLSEnableIME ( HWND  hwnd,
BOOL  enable 
)

Definition at line 1235 of file imm.c.

1236{
1238}
GLboolean enable
Definition: glext.h:11120

◆ WINNLSGetEnableStatus()

BOOL WINAPI WINNLSGetEnableStatus ( HWND  hwnd)

Definition at line 1245 of file imm.c.

1246{
1248}
BOOL WINAPI ImmWINNLSGetEnableStatus(HWND hWnd)
Definition: imm.c:1222

◆ WINNLSGetIMEHotkey()

UINT WINAPI WINNLSGetIMEHotkey ( HWND  hwnd)

Definition at line 1255 of file imm.c.

1256{
1257 return FALSE;
1258}

Variable Documentation

◆ gbImmInitializing

BOOL gbImmInitializing = FALSE

Definition at line 22 of file imm.c.

Referenced by InitializeImmEntryTable(), and User32InitializeImmEntryTable().

◆ gfConIme

INT gfConIme = -1

Definition at line 24 of file imm.c.

Referenced by ImeWnd_OnImeNotify(), and ImeWnd_OnImeSetContext().

◆ ghImm32

HINSTANCE ghImm32 = NULL

Definition at line 20 of file imm.c.

Referenced by DllMain(), IntInitializeImmEntryTable(), and User32InitializeImmEntryTable().

◆ gImmApiEntries

Imm32ApiTable gImmApiEntries
Initial value:
= {
#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind)
}

Definition at line 47 of file imm.c.