81 TRACE(
"(%p, %p)\n", hKL, pImeInfoEx);
92 pszSubKey =
L"Software\\Microsoft\\Windows NT\\CurrentVersion\\IMM";
101 cbData =
sizeof(pImeInfoEx->wszImeFile);
103 (
LPBYTE)pImeInfoEx->wszImeFile, &cbData);
113 pImeInfoEx->hkl = hKL;
114 pImeInfoEx->fLoadFlag = 0;
132 TRACE(
"(%p)\n", hKL);
151 for (iKL = 0; iKL < cKLs; ++iKL)
166 WARN(
"Default to English US\n");
200 BOOL fOldOpen, bIsNewHKLIme =
TRUE, bIsOldHKLIme =
TRUE, bClientWide, bNewDpiWide;
201 DWORD cbNewPrivate = 0, cbOldPrivate = 0, dwOldConversion, dwOldSentence,
dwSize, dwNewSize;
212 if (hNewKL != hOldKL)
226 cbOldPrivate = pOldImeDpi->ImeInfo.dwPrivateDataSize;
228 cbNewPrivate =
max(cbNewPrivate,
sizeof(
DWORD));
229 cbOldPrivate =
max(cbOldPrivate,
sizeof(
DWORD));
231 if (pClientImc->
hKL == hOldKL)
236 pOldImeDpi->ImeSelect(hIMC,
FALSE);
238 pOldImeDpi->CtfImeSelectEx(hIMC,
FALSE, hOldKL);
255 pNewImeDpi->ImeSelect(hIMC,
TRUE);
257 pNewImeDpi->CtfImeSelectEx(hIMC,
TRUE, hNewKL);
259 pClientImc->
hKL = hNewKL;
264 dwOldConversion = pIC->fdwConversion;
265 dwOldSentence = pIC->fdwSentence;
266 fOldOpen = pIC->fOpen;
272 if (bClientWide && !bNewDpiWide)
277 pIC->lfFont.A = LogFontA;
279 pClientImc->
dwFlags &= ~CLIENTIMC_WIDE;
281 else if (!bClientWide && bNewDpiWide)
286 pIC->lfFont.W = LogFontW;
292 if (cbOldPrivate != cbNewPrivate)
300 pIC->hPrivate = hPrivate;
303#define MAX_IMCC_SIZE 0x1000
309 pIC->dwNumMsgBuf = 0;
358 if (pOldImeDpi && bIsOldHKLIme)
365 if (pNewImeDpi && bIsNewHKLIme)
368 if (pOldState != pNewState)
372 pOldState->fOpen = !!pIC->fOpen;
373 pOldState->dwConversion = pIC->fdwConversion;
374 pOldState->dwConversion &= ~IME_CMODE_EUDC;
375 pOldState->dwSentence = pIC->fdwSentence;
376 pOldState->dwInit = pIC->fdwInit;
383 pIC->
dwChange &= ~INPUTCONTEXTDX_CHANGE_FORCE_OPEN;
388 pIC->fOpen = pNewState->
fOpen;
392 pIC->fdwConversion &= ~IME_CMODE_EUDC;
394 pIC->fdwInit = pNewState->
dwInit;
404 pNewImeDpi->ImeSelect(hIMC,
TRUE);
406 pNewImeDpi->CtfImeSelectEx(hIMC,
TRUE, hNewKL);
408 pClientImc->
hKL = hNewKL;
412 if (pIC->fOpen != fOldOpen)
414 if (pIC->fdwConversion != dwOldConversion)
416 if (pIC->fdwSentence != dwOldSentence)
486 SelectLayout.
hNewKL = hKL;
487 SelectLayout.
hOldKL = hOldKL;
524 hOldIMC = pWnd->
hImc;
536 if (hwndFocus ==
hWnd)
643 for (pState = pIC->
pState; pState; pState = pNext)
645 pNext = pState->
pNext;
647 for (pSubState = pState->
pSubState; pSubState; pSubState = pSubNext)
649 pSubNext = pSubState->
pNext;
682 ERR(
"Thread mismatch\n");
689 TRACE(
"pClientImc == NULL\n");
695 ERR(
"Can't destroy for CLIENTIMC_UNKNOWN2\n");
716 if (pClientImc->
hKL == hKL)
722 pImeDpi->ImeSelect(hIMC,
FALSE);
724 pImeDpi->CtfImeSelectEx(hIMC,
FALSE, hKL);
754 DWORD dwIndex, cbPrivate;
803 cbPrivate =
sizeof(
DWORD);
828 pImeDpi->ImeSelect(hIMC,
TRUE);
830 pImeDpi->CtfImeSelectEx(hIMC,
TRUE, hKL);
834 pClientImc->
hKL = hKL;
894 ERR(
"No default IME window\n");
935 TRACE(
"(%p)\n", hIMC);
959 TRACE(
"(%p)\n", hImc);
1006 TRACE(
"(%p)\n", pClientImc);
1012 hInputContext = pClientImc->hInputContext;
1031 TRACE(
"Not IMM mode.\n");
1046 if (!hIMC && (dwContextFlags & 1))
1081 TRACE(
"(%p)\n", hIMC);
1125 _In_ IMCENUMPROC lpfn,
1129 DWORD dwIndex, dwCount;
1139 for (dwIndex = 0; dwIndex < dwCount; ++dwIndex)
1141 hIMC = phList[dwIndex];
1169 TRACE(
"(%p, %p, %d)\n",
hWnd, hIMC, fActive);
1182 pClientImc->
dwFlags &= ~CLIENTIMC_ACTIVE;
1203 dwConversion = pIC->fdwConversion;
1229 pImeDpi->ImeSetActiveContext(hIMC, fActive);
1290 static LANGID s_wKeyboardLangIdCache = 0;
1291 static UINT s_uKeyboardLayoutCPCache = 0;
1293 TRACE(
"(%u)\n", wLangId);
1295 if (wLangId == s_wKeyboardLangIdCache)
1296 return s_uKeyboardLayoutCPCache;
1301 s_wKeyboardLangIdCache = wLangId;
1303 s_uKeyboardLayoutCPCache =
wcstol(szText,
NULL, 10);
1304 return s_uKeyboardLayoutCPCache;
1318 ASSERT(dwValue == 0x100);
1345 ERR(
"ImmInitializeGlobals failed\n");
1350 ERR(
"User32InitializeImmEntryTable failed\n");
1372 TRACE(
"imm32.dll is unloaded\n");
#define InterlockedIncrement
#define InterlockedDecrement
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define UlongToHandle(ul)
#define RegCloseKey(hKey)
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
HRESULT CtfImmTIMCreateInputContext(_In_ HIMC hIMC)
HRESULT CtfImmTIMDestroyInputContext(_In_ HIMC hIMC)
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
#define ERROR_CALL_NOT_IMPLEMENTED
#define DLL_THREAD_DETACH
#define DLL_PROCESS_ATTACH
#define DLL_PROCESS_DETACH
#define DLL_THREAD_ATTACH
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
LCID WINAPI GetSystemDefaultLCID(void)
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
PTHEME_CLASS ValidateHandle(HTHEME hTheme)
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
LPVOID NTAPI LocalLock(HLOCAL hMem)
BOOL NTAPI LocalUnlock(HLOCAL hMem)
HLOCAL NTAPI LocalFree(HLOCAL hMem)
RTL_CRITICAL_SECTION gcsImeDpi
BOOL Imm32ReleaseIME(_In_ HKL hKL)
PIMEDPI Imm32FindOrLoadImeDpi(HKL hKL)
HIMC WINAPI ImmAssociateContext(_In_ HWND hWnd, _In_opt_ HIMC hIMC)
BOOL WINAPI ImmFreeLayout(_In_ HKL hKL)
UINT WINAPI GetKeyboardLayoutCP(_In_ LANGID wLangId)
LPINPUTCONTEXT Imm32InternalLockIMC(HIMC hIMC, BOOL fSelect)
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
BOOL WINAPI ImmActivateLayout(_In_ HKL hKL)
static BOOL CALLBACK Imm32SelectContextProc(HIMC hIMC, LPARAM lParam)
BOOL WINAPI ImmRegisterClient(_Inout_ PSHAREDINFO ptr, _In_ HINSTANCE hMod)
static BOOL Imm32CreateInputContext(HIMC hIMC, LPINPUTCONTEXT pIC, PCLIENTIMC pClientImc, HKL hKL, BOOL fSelect)
PCLIENTIMC WINAPI ImmLockClientImc(_In_ HIMC hImc)
HIMC WINAPI ImmGetContext(_In_ HWND hWnd)
BOOL WINAPI ImmEnumInputContext(_In_ DWORD dwThreadId, _In_ IMCENUMPROC lpfn, _In_ LPARAM lParam)
BOOL WINAPI ImmWINNLSGetEnableStatus(_In_opt_ HWND hWnd)
BOOL WINAPI ImmSetActiveContextConsoleIME(_In_ HWND hwnd, _In_ BOOL fFlag)
static VOID Imm32SelectInputContext(HKL hNewKL, HKL hOldKL, HIMC hIMC)
BOOL WINAPI ImmDllInitialize(_In_ HINSTANCE hDll, _In_ ULONG dwReason, _In_opt_ PVOID pReserved)
static BOOL Imm32DestroyInputContext(HIMC hIMC, HKL hKL, BOOL bKeep)
static HIMC ImmGetSaveContext(_In_opt_ HWND hWnd, _In_ DWORD dwContextFlags)
static VOID Imm32DestroyImeModeSaver(LPINPUTCONTEXTDX pIC)
static BOOL CALLBACK Imm32NotifyIMEProc(HIMC hIMC, LPARAM lParam)
HIMC WINAPI ImmCreateContext(VOID)
struct SELECT_LAYOUT * LPSELECT_LAYOUT
BOOL WINAPI ImmReleaseContext(_In_ HWND hWnd, _In_ HIMC hIMC)
BOOL WINAPI ImmAssociateContextEx(_In_ HWND hWnd, _In_opt_ HIMC hIMC, _In_ DWORD dwFlags)
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
BOOL WINAPI ImmDestroyContext(_In_ HIMC hIMC)
BOOL WINAPI ImmSetActiveContext(_In_ HWND hWnd, _In_opt_ HIMC hIMC, _In_ BOOL fActive)
ULONG_PTR gHighestUserAddress
static BOOL ImmInitializeGlobals(HMODULE hMod)
VOID WINAPI ImmUnlockClientImc(_Inout_ PCLIENTIMC pClientImc)
BOOL WINAPI ImmLoadLayout(_In_ HKL hKL, _Inout_ PIMEINFOEX pImeInfoEx)
struct tagCLIENTIMC * PCLIENTIMC
#define HKL_SWITCH_TO_NON_IME
BOOL WINAPI ImmLoadIME(_In_ HKL hKL)
#define CLIENTIMC_DESTROY
HRESULT WINAPI CtfImmTIMActivate(_In_ HKL hKL)
#define CLIENTIMC_DISABLEIME
struct INPUTCONTEXTDX * LPINPUTCONTEXTDX
BOOL WINAPI CtfImmIsTextFrameServiceDisabled(VOID)
#define CLIENTIMC_UNKNOWN2
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
#define ISC_SHOWUIGUIDELINE
#define ISC_SHOWUIALLCANDIDATEWINDOW
HWND WINAPI ImmGetDefaultIMEWnd(_In_opt_ HWND hWnd)
#define IME_PROP_COMPLETE_ON_UNSELECT
BOOL WINAPI ImmNotifyIME(_In_ HIMC hIMC, _In_ DWORD dwAction, _In_ DWORD dwIndex, _In_ DWORD_PTR dwValue)
DWORD WINAPI ImmGetIMCCSize(_In_ HIMCC imcc)
struct tagGUIDELINE GUIDELINE
BOOL WINAPI ImmUnlockIMCC(_In_ HIMCC imcc)
#define INPUTCONTEXTDX_CHANGE_OPEN
#define INPUTCONTEXTDX_CHANGE_SENTENCE
HIMCC WINAPI ImmReSizeIMCC(_In_ HIMCC imcc, _In_ DWORD size)
HIMCC WINAPI ImmDestroyIMCC(_In_ HIMCC block)
#define NI_COMPOSITIONSTR
DWORD WINAPI ImmGetIMCCLockCount(_In_ HIMCC imcc)
struct tagCANDIDATEINFO CANDIDATEINFO
#define INPUTCONTEXTDX_CHANGE_FORCE_OPEN
#define INPUTCONTEXTDX_CHANGE_CONVERSION
HIMCC WINAPI ImmCreateIMCC(_In_ DWORD size)
struct tagCOMPOSITIONSTRING COMPOSITIONSTRING
LPVOID WINAPI ImmLockIMCC(_In_ HIMCC imcc)
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
#define QUERY_WINDOW_DEFAULT_ICONTEXT
#define QUERY_WINDOW_FOCUS
DWORD NTAPI NtUserNotifyIMEStatus(_In_ HWND hwnd, _In_ BOOL fOpen, _In_ DWORD dwConversion)
BOOL NTAPI NtUserDestroyInputContext(_In_ HIMC hIMC)
DWORD NTAPI NtUserSetThreadLayoutHandles(_In_ HKL hNewKL, _In_ HKL hOldKL)
@ THREADSTATE_DEFAULTINPUTCONTEXT
@ THREADSTATE_IMECOMPATFLAGS
DWORD NTAPI NtUserAssociateInputContext(_In_ HWND hWnd, _In_opt_ HIMC hIMC, _In_ DWORD dwFlags)
DWORD_PTR NTAPI NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
HIMC NTAPI NtUserCreateInputContext(_In_ ULONG_PTR dwClientImcData)
BOOL NTAPI NtUserUpdateInputContext(HIMC hIMC, DWORD dwType, DWORD_PTR dwValue)
#define GetWin32ClientInfo()
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
EXTERN_C HRESULT WINAPI CtfImeSetActiveContextAlways(_In_ HIMC hIMC, _In_ BOOL fActive, _In_ HWND hWnd, _In_ HKL hKL)
NTSYSAPI NTSTATUS NTAPI RtlDeleteCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define UNREFERENCED_PARAMETER(P)
#define LANGIDFROMLCID(l)
NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
struct IME_SUBSTATE * pNext
struct IME_STATE * pState
CANDIDATEFORM cfCandForm[4]
ULONG_PTR dwClientImcData
BOOL WINAPI User32InitializeImmEntryTable(_In_ DWORD)
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_writes_opt_ NumCharacters PUSHORT _Inout_ PUSHORT _In_ UCHAR _In_opt_ USHORT LangID
BOOL Imm32LoadImeVerInfo(_Inout_ PIMEINFOEX pImeInfoEx)
DWORD Imm32BuildHimcList(DWORD dwThreadId, HIMC **pphList)
#define IS_ZERO_UNEXPECTEDLY(p)
BOOL Imm32LoadImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
#define ValidateHwnd(hwnd)
#define ImmLocalFree(lpData)
#define IS_CROSS_THREAD_HIMC(hIMC)
#define IMM_INVALID_CANDFORM
PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
#define REGKEY_KEYBOARD_LAYOUTS
#define IS_ERROR_UNEXPECTEDLY(x)
VOID LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW)
HRESULT Imm32UIntToStr(_In_ DWORD dwValue, _In_ ULONG nBase, _Out_ PWSTR pszBuff, _In_ USHORT cchBuff)
#define IS_NULL_UNEXPECTEDLY(p)
BOOL Imm32SaveImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
#define MAX_CANDIDATEFORM
#define IS_CROSS_PROCESS_HWND(hWnd)
BOOL Imm32IsSystemJapaneseOrKorean(VOID)
PIME_STATE Imm32FetchImeState(LPINPUTCONTEXTDX pIC, HKL hKL)
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
VOID LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA)
#define ImeDpi_IsUnicode(pImeDpi)
HRESULT Imm32StrToUInt(_In_ PCWSTR pszText, _Out_ PDWORD pdwValue, _In_ ULONG nBase)
BOOL Imm32CheckImcProcess(PIMC pIMC)
DWORD WINAPI GetCurrentThreadId(void)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
#define LOCALE_IDEFAULTANSICODEPAGE
#define HKEY_LOCAL_MACHINE
BOOL WINAPI IsWindow(_In_opt_ HWND)
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
#define WM_IME_SETCONTEXT
HKL WINAPI LoadKeyboardLayoutW(_In_ LPCWSTR, _In_ UINT)
UINT WINAPI GetKeyboardLayoutList(_In_ int nBuff, _Out_writes_to_opt_(nBuff, return) HKL FAR *lpList)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)