ReactOS 0.4.16-dev-2613-g9533ad7
ime.c File Reference
#include "precomp.h"
#include <ime.h>
#include <imetable.h>
Include dependency graph for ime.c:

Go to the source code of this file.

Macros

#define VALID_IME_PROP
 
#define VALID_CMODE_CAPS
 
#define VALID_SMODE_CAPS
 
#define VALID_UI_CAPS
 
#define VALID_SCS_CAPS
 
#define VALID_SELECT_CAPS   (SELECT_CAP_CONVERSION | SELECT_CAP_SENTENCE)
 
#define DEFINE_IME_ENTRY(type, name, params, optional)
 
#define DEFINE_IME_ENTRY(type, name, params, optional)   pImeDpi->name = Stub##name;
 
#define DEFINE_IME_ENTRY(type, name, params, optional)
 
#define CHECK_IME_FN(name)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (imm)
 
PIMEDPI Imm32FindImeDpi (HKL hKL)
 
VOID Imm32FreeIME (PIMEDPI pImeDpi, BOOL bDestroy)
 
BOOL Imm32InquireIme (PIMEDPI pImeDpi)
 
static BOOL Imm32LoadIME (PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
 
static PIMEDPI Imm32LoadImeDpi (HKL hKL, BOOL bLock)
 
PIMEDPI Imm32FindOrLoadImeDpi (HKL hKL)
 
static LRESULT ImeDpi_Escape (PIMEDPI pImeDpi, HIMC hIMC, UINT uSubFunc, LPVOID lpData, HKL hKL)
 
BOOL Imm32ReleaseIME (_In_ HKL hKL)
 
BOOL WINAPI ImmIsIME (_In_ HKL hKL)
 
HWND WINAPI ImmGetDefaultIMEWnd (_In_opt_ HWND hWnd)
 
BOOL WINAPI ImmNotifyIME (_In_ HIMC hIMC, _In_ DWORD dwAction, _In_ DWORD dwIndex, _In_ DWORD_PTR dwValue)
 
BOOL WINAPI ImmGetImeInfoEx (PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
 
PIMEDPI WINAPI ImmLockImeDpi (_In_ HKL hKL)
 
VOID WINAPI ImmUnlockImeDpi (_Inout_opt_ PIMEDPI pImeDpi)
 
BOOL WINAPI ImmLoadIME (_In_ HKL hKL)
 
BOOL WINAPI ImmDisableIME (_In_ DWORD dwThreadId)
 
UINT WINAPI ImmGetDescriptionA (_In_ HKL hKL, _Out_writes_opt_(uBufLen) LPSTR lpszDescription, _In_ UINT uBufLen)
 
UINT WINAPI ImmGetDescriptionW (_In_ HKL hKL, _Out_writes_opt_(uBufLen) LPWSTR lpszDescription, _In_ UINT uBufLen)
 
UINT WINAPI ImmGetIMEFileNameA (_In_ HKL hKL, _Out_writes_opt_(uBufLen) LPSTR lpszFileName, _In_ UINT uBufLen)
 
UINT WINAPI ImmGetIMEFileNameW (_In_ HKL hKL, _Out_writes_opt_(uBufLen) LPWSTR lpszFileName, _In_ UINT uBufLen)
 
DWORD WINAPI ImmGetProperty (_In_ HKL hKL, _In_ DWORD fdwIndex)
 
LRESULT WINAPI ImmEscapeA (_In_ HKL hKL, _In_ HIMC hIMC, _In_ UINT uSubFunc, _Inout_opt_ LPVOID lpData)
 
LRESULT WINAPI ImmEscapeW (_In_ HKL hKL, _In_ HIMC hIMC, _In_ UINT uSubFunc, _Inout_opt_ LPVOID lpData)
 
BOOL WINAPI ImmGetOpenStatus (_In_ HIMC hIMC)
 
BOOL WINAPI ImmSetOpenStatus (_In_ HIMC hIMC, _In_ BOOL fOpen)
 
BOOL WINAPI ImmGetStatusWindowPos (_In_ HIMC hIMC, _Out_ LPPOINT lpptPos)
 
BOOL WINAPI ImmSetStatusWindowPos (_In_ HIMC hIMC, _In_ LPPOINT lpptPos)
 
BOOL WINAPI ImmGetCompositionWindow (_In_ HIMC hIMC, _Out_ LPCOMPOSITIONFORM lpCompForm)
 
BOOL WINAPI ImmSetCompositionWindow (_In_ HIMC hIMC, _In_ LPCOMPOSITIONFORM lpCompForm)
 
BOOL WINAPI ImmGetCompositionFontA (_In_ HIMC hIMC, _Out_ LPLOGFONTA lplf)
 
BOOL WINAPI ImmGetCompositionFontW (_In_ HIMC hIMC, _Out_ LPLOGFONTW lplf)
 
BOOL WINAPI ImmSetCompositionFontA (_In_ HIMC hIMC, _In_ LPLOGFONTA lplf)
 
BOOL WINAPI ImmSetCompositionFontW (_In_ HIMC hIMC, _In_ LPLOGFONTW lplf)
 
DWORD WINAPI ImmGetConversionListA (_In_ HKL hKL, _In_ HIMC hIMC, _In_ LPCSTR pSrc, _Out_writes_bytes_(dwBufLen) LPCANDIDATELIST lpDst, _In_ DWORD dwBufLen, _In_ UINT uFlag)
 
DWORD WINAPI ImmGetConversionListW (_In_ HKL hKL, _In_ HIMC hIMC, _In_ LPCWSTR pSrc, _Out_writes_bytes_(dwBufLen) LPCANDIDATELIST lpDst, _In_ DWORD dwBufLen, _In_ UINT uFlag)
 
BOOL WINAPI ImmGetConversionStatus (_In_ HIMC hIMC, _Out_opt_ LPDWORD lpfdwConversion, _Out_opt_ LPDWORD lpfdwSentence)
 
BOOL WINAPI ImmSetConversionStatus (_In_ HIMC hIMC, _In_ DWORD fdwConversion, _In_ DWORD fdwSentence)
 
BOOL WINAPI ImmConfigureIMEA (_In_ HKL hKL, _In_ HWND hWnd, _In_ DWORD dwMode, _Inout_opt_ LPVOID lpData)
 
BOOL WINAPI ImmConfigureIMEW (_In_ HKL hKL, _In_ HWND hWnd, _In_ DWORD dwMode, _Inout_opt_ LPVOID lpData)
 
BOOL WINAPI ImmWINNLSEnableIME (_In_opt_ HWND hWnd, _In_ BOOL enable)
 

Variables

RTL_CRITICAL_SECTION gcsImeDpi
 
PIMEDPI gpImeDpiList = NULL
 

Macro Definition Documentation

◆ CHECK_IME_FN

#define CHECK_IME_FN (   name)
Value:
do { \
if (!pImeDpi->name) { \
ERR("'%s' not found in Cicero IME module %s.\n", #name, debugstr_w(szPath)); \
goto Failed; \
} \
} while(0)
#define debugstr_w
Definition: kernel32.h:32
LPCWSTR szPath
Definition: env.c:37
@ Failed
Definition: arc.h:88
Definition: name.c:39

◆ DEFINE_IME_ENTRY [1/3]

#define DEFINE_IME_ENTRY (   type,
  name,
  params,
  optional 
)
Value:
FIXME("%s: Why stub called?\n", #name); \
return (type)0; \
}
#define APIENTRY
Definition: api.h:79
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLenum const GLfloat * params
Definition: glext.h:5645

Definition at line 187 of file ime.c.

◆ DEFINE_IME_ENTRY [2/3]

#define DEFINE_IME_ENTRY (   type,
  name,
  params,
  optional 
)    pImeDpi->name = Stub##name;

Definition at line 187 of file ime.c.

◆ DEFINE_IME_ENTRY [3/3]

#define DEFINE_IME_ENTRY (   type,
  name,
  params,
  optional 
)
Value:
do { \
fn = GetProcAddress(hIME, #name); \
if (fn) pImeDpi->name = (FN_##name)fn; \
else if (!(optional)) { \
ERR("'%s' not found in IME module %s.\n", #name, debugstr_w(szPath)); \
goto Failed; \
} \
} while (0);
@ optional
Definition: SystemMenu.c:34
#define GetProcAddress(x, y)
Definition: compat.h:753
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159

Definition at line 187 of file ime.c.

◆ VALID_CMODE_CAPS

#define VALID_CMODE_CAPS
Value:
#define IME_CMODE_KATAKANA
Definition: imm.h:343
#define IME_CMODE_ROMAN
Definition: imm.h:346
#define IME_CMODE_NATIVE
Definition: imm.h:337
#define IME_CMODE_LANGUAGE
Definition: imm.h:344
#define IME_CMODE_SYMBOL
Definition: imm.h:352
#define IME_CMODE_HANJACONVERT
Definition: imm.h:348
#define IME_CMODE_EUDC
Definition: imm.h:351
#define IME_CMODE_SOFTKBD
Definition: imm.h:349
#define IME_CMODE_NOCONVERSION
Definition: imm.h:350
#define IME_CMODE_FIXED
Definition: imm.h:353
#define IME_CMODE_CHARCODE
Definition: imm.h:347
#define IME_CMODE_ALPHANUMERIC
Definition: imm.h:336
#define IME_CMODE_FULLSHAPE
Definition: imm.h:345

◆ VALID_IME_PROP

#define VALID_IME_PROP
Value:
#define IME_PROP_CANDLIST_START_FROM_1
Definition: imm.h:248
#define IME_PROP_AT_CARET
Definition: imm.h:246
#define IME_PROP_UNICODE
Definition: imm.h:249
#define IME_PROP_SPECIAL_UI
Definition: imm.h:247
#define IME_PROP_COMPLETE_ON_UNSELECT
Definition: imm.h:250
#define IME_PROP_ACCEPT_WIDE_VKEY
Definition: immdev.h:349
#define IME_PROP_NEED_ALTKEY
Definition: immdev.h:347
#define IME_PROP_NO_KEYS_ON_CLOSE
Definition: immdev.h:348
#define IME_PROP_END_UNLOAD
Definition: immdev.h:344
#define IME_PROP_KBD_CHAR_FIRST
Definition: immdev.h:345
#define IME_PROP_IGNORE_UPKEYS
Definition: immdev.h:346

◆ VALID_SCS_CAPS

#define VALID_SCS_CAPS
Value:
#define SCS_CAP_COMPSTR
Definition: imm.h:259
#define SCS_CAP_SETRECONVERTSTRING
Definition: imm.h:261
#define SCS_CAP_MAKEREAD
Definition: imm.h:260

◆ VALID_SELECT_CAPS

#define VALID_SELECT_CAPS   (SELECT_CAP_CONVERSION | SELECT_CAP_SENTENCE)

◆ VALID_SMODE_CAPS

#define VALID_SMODE_CAPS
Value:
#define IME_SMODE_CONVERSATION
Definition: imm.h:361
#define IME_SMODE_PLAURALCLAUSE
Definition: imm.h:357
#define IME_SMODE_SINGLECONVERT
Definition: imm.h:358
#define IME_SMODE_PHRASEPREDICT
Definition: imm.h:360
#define IME_SMODE_AUTOMATIC
Definition: imm.h:359
#define IME_SMODE_NONE
Definition: imm.h:356

◆ VALID_UI_CAPS

#define VALID_UI_CAPS
Value:
#define UI_CAP_SOFTKBD
Definition: imm.h:256
#define UI_CAP_ROTANY
Definition: imm.h:255
#define UI_CAP_2700
Definition: imm.h:253
#define UI_CAP_ROT90
Definition: imm.h:254

Function Documentation

◆ ImeDpi_Escape()

static LRESULT ImeDpi_Escape ( PIMEDPI  pImeDpi,
HIMC  hIMC,
UINT  uSubFunc,
LPVOID  lpData,
HKL  hKL 
)
static

Definition at line 368 of file ime.c.

369{
370 if (IS_IME_HKL(hKL))
371 return pImeDpi->ImeEscape(hIMC, uSubFunc, lpData);
372 if (IS_CICERO_MODE() && !IS_16BIT_MODE())
373 return pImeDpi->CtfImeEscapeEx(hIMC, uSubFunc, lpData, hKL);
374
375 return 0;
376}
#define IS_IME_HKL(hKL)
Definition: imm32_undoc.h:21
#define IS_16BIT_MODE()
Definition: ntuser.h:1214
#define IS_CICERO_MODE()
Definition: ntuser.h:1213

Referenced by ImmEscapeA(), and ImmEscapeW().

◆ Imm32FindImeDpi()

PIMEDPI Imm32FindImeDpi ( HKL  hKL)

Definition at line 20 of file ime.c.

21{
22 PIMEDPI pImeDpi;
23
25 for (pImeDpi = gpImeDpiList; pImeDpi != NULL; pImeDpi = pImeDpi->pNext)
26 {
27 if (pImeDpi->hKL == hKL)
28 break;
29 }
31
32 return pImeDpi;
33}
#define NULL
Definition: types.h:112
RTL_CRITICAL_SECTION gcsImeDpi
Definition: ime.c:17
PIMEDPI gpImeDpiList
Definition: ime.c:18
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
HKL hKL
Definition: imm32_undoc.h:107
struct IMEDPI * pNext
Definition: imm32_undoc.h:105

Referenced by Imm32LoadImeDpi(), and ImmLoadIME().

◆ Imm32FindOrLoadImeDpi()

PIMEDPI Imm32FindOrLoadImeDpi ( HKL  hKL)

Definition at line 351 of file ime.c.

352{
353 PIMEDPI pImeDpi;
354
355 if (!IS_IME_HKL(hKL) && (!IS_CICERO_MODE() || IS_16BIT_MODE()))
356 {
357 TRACE("\n");
358 return NULL;
359 }
360
361 pImeDpi = ImmLockImeDpi(hKL);
362 if (pImeDpi == NULL)
363 pImeDpi = Imm32LoadImeDpi(hKL, TRUE);
364 return pImeDpi;
365}
#define TRUE
Definition: types.h:120
static PIMEDPI Imm32LoadImeDpi(HKL hKL, BOOL bLock)
Definition: ime.c:282
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
Definition: ime.c:532
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by CtfImmGetGuidAtom(), CtfImmIsGuidMapEnable(), Imm32InternalLockIMC(), ImmConfigureIMEA(), ImmConfigureIMEW(), ImmEnumRegisterWordA(), ImmEnumRegisterWordW(), ImmEscapeA(), ImmEscapeW(), ImmGetConversionListA(), ImmGetConversionListW(), ImmGetProperty(), ImmGetRegisterWordStyleA(), ImmGetRegisterWordStyleW(), ImmRegisterWordA(), ImmRegisterWordW(), ImmUnregisterWordA(), and ImmUnregisterWordW().

◆ Imm32FreeIME()

VOID Imm32FreeIME ( PIMEDPI  pImeDpi,
BOOL  bDestroy 
)

Definition at line 35 of file ime.c.

36{
37 if (pImeDpi->hInst == NULL)
38 return;
39 if (bDestroy)
40 pImeDpi->ImeDestroy(0);
41 FreeLibrary(pImeDpi->hInst);
42 pImeDpi->hInst = NULL;
43}
#define FreeLibrary(x)
Definition: compat.h:748
HINSTANCE hInst
Definition: imm32_undoc.h:106

Referenced by Imm32LoadImeDpi(), Imm32ReleaseIME(), and ImmUnlockImeDpi().

◆ Imm32InquireIme()

BOOL Imm32InquireIme ( PIMEDPI  pImeDpi)

Definition at line 45 of file ime.c.

46{
47 WCHAR szUIClass[64];
48 WNDCLASSW wcW;
49 DWORD dwSysInfoFlags = 0;
50 LPIMEINFO pImeInfo = &pImeDpi->ImeInfo;
51
53 dwSysInfoFlags |= IME_SYSINFO_WINLOGON;
54
55 if (GetWin32ClientInfo()->dwTIFlags & TIF_16BIT)
56 dwSysInfoFlags |= IME_SYSINFO_WOW16;
57
58 if (IS_IME_HKL(pImeDpi->hKL))
59 {
60 if (!pImeDpi->ImeInquire(pImeInfo, szUIClass, dwSysInfoFlags))
61 {
62 ERR("\n");
63 return FALSE;
64 }
65 }
66 else if (IS_CICERO_MODE() && !IS_16BIT_MODE())
67 {
68 if (pImeDpi->CtfImeInquireExW(pImeInfo, szUIClass, dwSysInfoFlags, pImeDpi->hKL) != S_OK)
69 {
70 ERR("\n");
71 return FALSE;
72 }
73 }
74 else
75 {
76 ERR("\n");
77 return FALSE;
78 }
79
80 szUIClass[_countof(szUIClass) - 1] = UNICODE_NULL; /* Avoid buffer overrun */
81
82 if (pImeInfo->dwPrivateDataSize < sizeof(DWORD))
83 pImeInfo->dwPrivateDataSize = sizeof(DWORD);
84
85#define VALID_IME_PROP (IME_PROP_AT_CARET | \
86 IME_PROP_SPECIAL_UI | \
87 IME_PROP_CANDLIST_START_FROM_1 | \
88 IME_PROP_UNICODE | \
89 IME_PROP_COMPLETE_ON_UNSELECT | \
90 IME_PROP_END_UNLOAD | \
91 IME_PROP_KBD_CHAR_FIRST | \
92 IME_PROP_IGNORE_UPKEYS | \
93 IME_PROP_NEED_ALTKEY | \
94 IME_PROP_NO_KEYS_ON_CLOSE | \
95 IME_PROP_ACCEPT_WIDE_VKEY)
96#define VALID_CMODE_CAPS (IME_CMODE_ALPHANUMERIC | \
97 IME_CMODE_NATIVE | \
98 IME_CMODE_KATAKANA | \
99 IME_CMODE_LANGUAGE | \
100 IME_CMODE_FULLSHAPE | \
101 IME_CMODE_ROMAN | \
102 IME_CMODE_CHARCODE | \
103 IME_CMODE_HANJACONVERT | \
104 IME_CMODE_SOFTKBD | \
105 IME_CMODE_NOCONVERSION | \
106 IME_CMODE_EUDC | \
107 IME_CMODE_SYMBOL | \
108 IME_CMODE_FIXED)
109#define VALID_SMODE_CAPS (IME_SMODE_NONE | \
110 IME_SMODE_PLAURALCLAUSE | \
111 IME_SMODE_SINGLECONVERT | \
112 IME_SMODE_AUTOMATIC | \
113 IME_SMODE_PHRASEPREDICT | \
114 IME_SMODE_CONVERSATION)
115#define VALID_UI_CAPS (UI_CAP_2700 | \
116 UI_CAP_ROT90 | \
117 UI_CAP_ROTANY | \
118 UI_CAP_SOFTKBD)
119#define VALID_SCS_CAPS (SCS_CAP_COMPSTR | \
120 SCS_CAP_MAKEREAD | \
121 SCS_CAP_SETRECONVERTSTRING)
122#define VALID_SELECT_CAPS (SELECT_CAP_CONVERSION | SELECT_CAP_SENTENCE)
123
124 if (pImeInfo->fdwProperty & ~VALID_IME_PROP)
125 {
126 ERR("Bad flags\n");
127 return FALSE;
128 }
129 if (pImeInfo->fdwConversionCaps & ~VALID_CMODE_CAPS)
130 {
131 ERR("Bad flags\n");
132 return FALSE;
133 }
134 if (pImeInfo->fdwSentenceCaps & ~VALID_SMODE_CAPS)
135 {
136 ERR("Bad flags\n");
137 return FALSE;
138 }
139 if (pImeInfo->fdwUICaps & ~VALID_UI_CAPS)
140 {
141 ERR("Bad flags\n");
142 return FALSE;
143 }
144 if (pImeInfo->fdwSCSCaps & ~VALID_SCS_CAPS)
145 {
146 ERR("Bad flags\n");
147 return FALSE;
148 }
149 if (pImeInfo->fdwSelectCaps & ~VALID_SELECT_CAPS)
150 {
151 ERR("Bad flags\n");
152 return FALSE;
153 }
154
155#undef VALID_IME_PROP
156#undef VALID_CMODE_CAPS
157#undef VALID_SMODE_CAPS
158#undef VALID_UI_CAPS
159#undef VALID_SCS_CAPS
160#undef VALID_SELECT_CAPS
161
162 if (pImeInfo->fdwProperty & IME_PROP_UNICODE)
163 {
164 StringCchCopyW(pImeDpi->szUIClass, _countof(pImeDpi->szUIClass), szUIClass);
165 }
166 else
167 {
168 if (pImeDpi->uCodePage != GetACP() && pImeDpi->uCodePage != CP_ACP)
169 return FALSE;
170
172 pImeDpi->szUIClass, _countof(pImeDpi->szUIClass));
173
174 pImeDpi->szUIClass[_countof(pImeDpi->szUIClass) - 1] = UNICODE_NULL;
175 }
176
177 if (!GetClassInfoW(pImeDpi->hInst, pImeDpi->szUIClass, &wcW))
178 {
179 ERR("\n");
180 return FALSE;
181 }
182
183 return TRUE;
184}
#define ERR(fmt,...)
Definition: precomp.h:57
#define FALSE
Definition: types.h:117
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
UINT WINAPI GetACP(void)
Definition: locale.c:2023
unsigned long DWORD
Definition: ntddk_ex.h:95
#define VALID_IME_PROP
#define VALID_SELECT_CAPS
#define VALID_SCS_CAPS
#define VALID_SMODE_CAPS
#define VALID_UI_CAPS
#define VALID_CMODE_CAPS
#define IME_SYSINFO_WINLOGON
Definition: immdev.h:369
#define IME_SYSINFO_WOW16
Definition: immdev.h:370
@ THREADSTATE_ISWINLOGON
Definition: ntuser.h:2504
#define TIF_16BIT
Definition: ntuser.h:264
#define GetWin32ClientInfo()
Definition: ntuser.h:352
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
Definition: misc.c:240
#define S_OK
Definition: intsafe.h:52
#define DWORD
Definition: nt_native.h:44
#define UNICODE_NULL
short WCHAR
Definition: pedump.c:58
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
IMEINFO ImeInfo
Definition: imm32_undoc.h:108
WCHAR szUIClass[16]
Definition: imm32_undoc.h:110
UINT uCodePage
Definition: imm32_undoc.h:109
DWORD fdwSelectCaps
Definition: immdev.h:27
DWORD fdwSentenceCaps
Definition: immdev.h:24
DWORD fdwConversionCaps
Definition: immdev.h:23
DWORD fdwSCSCaps
Definition: immdev.h:26
DWORD fdwProperty
Definition: immdev.h:22
DWORD dwPrivateDataSize
Definition: immdev.h:21
DWORD fdwUICaps
Definition: immdev.h:25
char * LPSTR
Definition: typedefs.h:51
#define MB_PRECOMPOSED
Definition: winnls.h:299
BOOL WINAPI GetClassInfoW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSW)

Referenced by Imm32LoadIME().

◆ Imm32LoadIME()

static BOOL Imm32LoadIME ( PIMEINFOEX  pImeInfoEx,
PIMEDPI  pImeDpi 
)
static

Definition at line 196 of file ime.c.

197{
199 HINSTANCE hIME;
200 FARPROC fn;
201 BOOL ret = FALSE;
202
204 return FALSE;
205
206 pImeDpi->hInst = hIME = LoadLibraryW(szPath);
207 if (hIME == NULL)
208 {
209 ERR("LoadLibraryW(%s) failed\n", debugstr_w(szPath));
210 return FALSE;
211 }
212
213 /* Populate the table by stub IME functions */
214#define DEFINE_IME_ENTRY(type, name, params, optional) pImeDpi->name = Stub##name;
215#include <imetable.h>
216#undef DEFINE_IME_ENTRY
217
218 /* Populate the table by real IME functions */
219#define DEFINE_IME_ENTRY(type, name, params, optional) \
220 do { \
221 fn = GetProcAddress(hIME, #name); \
222 if (fn) pImeDpi->name = (FN_##name)fn; \
223 else if (!(optional)) { \
224 ERR("'%s' not found in IME module %s.\n", #name, debugstr_w(szPath)); \
225 goto Failed; \
226 } \
227 } while (0);
228#include <imetable.h>
229#undef DEFINE_IME_ENTRY
230
231 /* Check for Cicero IMEs */
232 if (!IS_IME_HKL(pImeDpi->hKL) && IS_CICERO_MODE() && !IS_CICERO_COMPAT_DISABLED())
233 {
234#define CHECK_IME_FN(name) do { \
235 if (!pImeDpi->name) { \
236 ERR("'%s' not found in Cicero IME module %s.\n", #name, debugstr_w(szPath)); \
237 goto Failed; \
238 } \
239} while(0)
245#undef CHECK_IME_FN
246 }
247
248 if (Imm32InquireIme(pImeDpi))
249 {
250 ret = TRUE;
251 }
252 else
253 {
254Failed:
255 ret = FALSE;
256 FreeLibrary(pImeDpi->hInst);
257 pImeDpi->hInst = NULL;
258 }
259
260 if (pImeInfoEx->fLoadFlag == 0)
261 {
262 if (ret)
263 {
264 C_ASSERT(sizeof(pImeInfoEx->wszUIClass) == sizeof(pImeDpi->szUIClass));
265 pImeInfoEx->ImeInfo = pImeDpi->ImeInfo;
266 RtlCopyMemory(pImeInfoEx->wszUIClass, pImeDpi->szUIClass,
267 sizeof(pImeInfoEx->wszUIClass));
268 pImeInfoEx->fLoadFlag = 2;
269 }
270 else
271 {
272 pImeInfoEx->fLoadFlag = 1;
273 }
274
275 NtUserSetImeInfoEx(pImeInfoEx);
276 }
277
278 return ret;
279}
int(* FARPROC)()
Definition: compat.h:36
#define MAX_PATH
Definition: compat.h:34
#define LoadLibraryW(x)
Definition: compat.h:747
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
#define CHECK_IME_FN(name)
BOOL Imm32InquireIme(PIMEDPI pImeDpi)
Definition: ime.c:45
#define IS_CICERO_COMPAT_DISABLED()
Definition: ntuser.h:1215
BOOL NTAPI NtUserSetImeInfoEx(_In_ const IMEINFOEX *pImeInfoEx)
Definition: ime.c:1210
#define C_ASSERT(e)
Definition: intsafe.h:73
EXTERN_C HRESULT WINAPI CtfImeInquireExW(_Out_ LPIMEINFO lpIMEInfo, _Out_ LPWSTR lpszWndClass, _In_ DWORD dwSystemInfoFlags, _In_ HKL hKL)
Definition: msctfime.cpp:542
EXTERN_C BOOL WINAPI CtfImeIsGuidMapEnable(_In_ HIMC hIMC)
Definition: msctfime.cpp:647
EXTERN_C BOOL WINAPI CtfImeSelectEx(_In_ HIMC hIMC, _In_ BOOL fSelect, _In_ HKL hKL)
Definition: msctfime.cpp:571
EXTERN_C LRESULT WINAPI CtfImeEscapeEx(_In_ HIMC hIMC, _In_ UINT uSubFunc, _Inout_opt_ LPVOID lpData, _In_ HKL hKL)
Definition: msctfime.cpp:596
EXTERN_C HRESULT WINAPI CtfImeGetGuidAtom(_In_ HIMC hIMC, _In_ DWORD dwUnknown, _Out_opt_ LPDWORD pdwGuidAtom)
Definition: msctfime.cpp:620
IMEINFO ImeInfo
Definition: imm32_undoc.h:75
WCHAR wszImeFile[80]
Definition: imm32_undoc.h:83
WCHAR wszUIClass[16]
Definition: imm32_undoc.h:76
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
BOOL Imm32GetSystemLibraryPath(LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName)
Definition: utils.c:152

Referenced by Imm32LoadImeDpi().

◆ Imm32LoadImeDpi()

static PIMEDPI Imm32LoadImeDpi ( HKL  hKL,
BOOL  bLock 
)
static

Definition at line 282 of file ime.c.

283{
284 IMEINFOEX ImeInfoEx;
285 CHARSETINFO ci;
286 PIMEDPI pImeDpiNew, pImeDpiFound;
287 UINT uCodePage;
288 LCID lcid;
289
290 if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
291 {
292 ERR("\n");
293 return NULL;
294 }
295
296 if (ImeInfoEx.fLoadFlag == 1)
297 {
298 ERR("\n");
299 return NULL;
300 }
301
302 pImeDpiNew = ImmLocalAlloc(HEAP_ZERO_MEMORY, sizeof(IMEDPI));
303 if (IS_NULL_UNEXPECTEDLY(pImeDpiNew))
304 return NULL;
305
306 pImeDpiNew->hKL = hKL;
307
308 lcid = LOWORD(hKL);
310 uCodePage = ci.ciACP;
311 else
312 uCodePage = CP_ACP;
313 pImeDpiNew->uCodePage = uCodePage;
314
315 if (!Imm32LoadIME(&ImeInfoEx, pImeDpiNew))
316 {
317 ERR("\n");
318 ImmLocalFree(pImeDpiNew);
319 return FALSE;
320 }
321
323
324 pImeDpiFound = Imm32FindImeDpi(hKL);
325 if (pImeDpiFound)
326 {
327 if (!bLock)
328 pImeDpiFound->dwFlags &= ~IMEDPI_FLAG_LOCKED;
329
331 Imm32FreeIME(pImeDpiNew, FALSE);
332 ImmLocalFree(pImeDpiNew);
333 return pImeDpiFound;
334 }
335 else
336 {
337 if (bLock)
338 {
339 pImeDpiNew->dwFlags |= IMEDPI_FLAG_LOCKED;
340 pImeDpiNew->cLockObj = 1;
341 }
342
343 pImeDpiNew->pNext = gpImeDpiList;
344 gpImeDpiList = pImeDpiNew;
345
347 return pImeDpiNew;
348 }
349}
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
LCID lcid
Definition: locale.c:5656
#define UlongToPtr(u)
Definition: config.h:106
static BOOL Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
Definition: ime.c:196
PIMEDPI Imm32FindImeDpi(HKL hKL)
Definition: ime.c:20
BOOL WINAPI ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
Definition: ime.c:492
VOID Imm32FreeIME(PIMEDPI pImeDpi, BOOL bDestroy)
Definition: ime.c:35
#define IMEDPI_FLAG_LOCKED
Definition: imm32_undoc.h:153
@ ImeInfoExKeyboardLayout
Definition: imm32_undoc.h:93
unsigned int UINT
Definition: ndis.h:50
#define LOWORD(l)
Definition: pedump.c:82
DWORD LCID
Definition: nls.h:13
DWORD dwFlags
Definition: imm32_undoc.h:112
DWORD cLockObj
Definition: imm32_undoc.h:111
#define ImmLocalFree(lpData)
Definition: precomp.h:102
#define IS_NULL_UNEXPECTEDLY(p)
Definition: precomp.h:67
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: utils.c:275
#define TCI_SRCLOCALE
Definition: wingdi.h:964
BOOL WINAPI TranslateCharsetInfo(_Inout_ PDWORD, _Out_ LPCHARSETINFO, _In_ DWORD)

Referenced by Imm32FindOrLoadImeDpi(), and ImmLoadIME().

◆ Imm32ReleaseIME()

BOOL Imm32ReleaseIME ( _In_ HKL  hKL)

Definition at line 379 of file ime.c.

380{
381 BOOL ret = TRUE;
382 PIMEDPI pImeDpi0, pImeDpi1;
383
385
386 for (pImeDpi0 = gpImeDpiList; pImeDpi0; pImeDpi0 = pImeDpi0->pNext)
387 {
388 if (pImeDpi0->hKL == hKL)
389 break;
390 }
391
392 if (!pImeDpi0)
393 goto Quit;
394
395 if (pImeDpi0->cLockObj)
396 {
397 pImeDpi0->dwFlags |= IMEDPI_FLAG_UNLOADED;
398 ret = FALSE;
399 goto Quit;
400 }
401
402 if (gpImeDpiList == pImeDpi0)
403 {
404 gpImeDpiList = pImeDpi0->pNext;
405 }
406 else if (gpImeDpiList)
407 {
408 for (pImeDpi1 = gpImeDpiList; pImeDpi1; pImeDpi1 = pImeDpi1->pNext)
409 {
410 if (pImeDpi1->pNext == pImeDpi0)
411 {
412 pImeDpi1->pNext = pImeDpi0->pNext;
413 break;
414 }
415 }
416 }
417
418 Imm32FreeIME(pImeDpi0, TRUE);
419 ImmLocalFree(pImeDpi0);
420
421Quit:
423 return ret;
424}
#define IMEDPI_FLAG_UNLOADED
Definition: imm32_undoc.h:152

Referenced by ImmFreeLayout().

◆ ImmConfigureIMEA()

BOOL WINAPI ImmConfigureIMEA ( _In_ HKL  hKL,
_In_ HWND  hWnd,
_In_ DWORD  dwMode,
_Inout_opt_ LPVOID  lpData 
)

Definition at line 1598 of file ime.c.

1603{
1604 BOOL ret = FALSE;
1605 PIMEDPI pImeDpi;
1606 REGISTERWORDW RegWordW;
1607 LPREGISTERWORDA pRegWordA;
1608
1609 TRACE("(%p, %p, 0x%lX, %p)\n", hKL, hWnd, dwMode, lpData);
1610
1612 return FALSE;
1613
1614 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
1615 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1616 return FALSE;
1617
1618 RtlZeroMemory(&RegWordW, sizeof(RegWordW));
1619
1620 if (!ImeDpi_IsUnicode(pImeDpi) || !lpData || dwMode != IME_CONFIG_REGISTERWORD)
1621 goto DoIt; /* No conversion needed */
1622
1623 pRegWordA = lpData;
1624
1625 if (pRegWordA->lpReading)
1626 {
1627 RegWordW.lpReading = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpReading);
1628 if (IS_NULL_UNEXPECTEDLY(RegWordW.lpReading))
1629 goto Quit;
1630 }
1631
1632 if (pRegWordA->lpWord)
1633 {
1634 RegWordW.lpWord = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpWord);
1635 if (IS_NULL_UNEXPECTEDLY(RegWordW.lpWord))
1636 goto Quit;
1637 }
1638
1639 lpData = &RegWordW;
1640
1641DoIt:
1642 SendMessageW(hWnd, WM_IME_SYSTEM, 0x1B, 0);
1643 ret = pImeDpi->ImeConfigure(hKL, hWnd, dwMode, lpData);
1644 SendMessageW(hWnd, WM_IME_SYSTEM, 0x1A, 0);
1645
1646Quit:
1647 ImmLocalFree(RegWordW.lpReading);
1648 ImmLocalFree(RegWordW.lpWord);
1649 ImmUnlockImeDpi(pImeDpi);
1650 TRACE("ret: %d\n", ret);
1651 return ret;
1652}
HWND hWnd
Definition: settings.c:17
PIMEDPI Imm32FindOrLoadImeDpi(HKL hKL)
Definition: ime.c:351
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
Definition: ime.c:562
#define WM_IME_SYSTEM
Definition: imm32_undoc.h:32
#define IME_CONFIG_REGISTERWORD
Definition: imm.h:406
LPWSTR lpWord
Definition: dimm.idl:36
LPWSTR lpReading
Definition: dimm.idl:35
LPSTR lpReading
Definition: imm.h:28
LPSTR lpWord
Definition: imm.h:29
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define ValidateHwnd(hwnd)
Definition: precomp.h:98
LPWSTR Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA)
Definition: utils.c:96
#define IS_CROSS_PROCESS_HWND(hWnd)
Definition: precomp.h:74
#define ImeDpi_IsUnicode(pImeDpi)
Definition: precomp.h:117
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by ActiveIMMApp_ConfigureIMEA(), and test_ImmIME().

◆ ImmConfigureIMEW()

BOOL WINAPI ImmConfigureIMEW ( _In_ HKL  hKL,
_In_ HWND  hWnd,
_In_ DWORD  dwMode,
_Inout_opt_ LPVOID  lpData 
)

Definition at line 1658 of file ime.c.

1663{
1664 BOOL ret = FALSE;
1665 PIMEDPI pImeDpi;
1666 REGISTERWORDA RegWordA;
1667 LPREGISTERWORDW pRegWordW;
1668
1669 TRACE("(%p, %p, 0x%lX, %p)\n", hKL, hWnd, dwMode, lpData);
1670
1672 return FALSE;
1673
1674 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
1675 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1676 return FALSE;
1677
1678 RtlZeroMemory(&RegWordA, sizeof(RegWordA));
1679
1680 if (ImeDpi_IsUnicode(pImeDpi) || !lpData || dwMode != IME_CONFIG_REGISTERWORD)
1681 goto DoIt; /* No conversion needed */
1682
1683 pRegWordW = lpData;
1684
1685 if (pRegWordW->lpReading)
1686 {
1687 RegWordA.lpReading = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpReading);
1688 if (IS_NULL_UNEXPECTEDLY(RegWordA.lpReading))
1689 goto Quit;
1690 }
1691
1692 if (pRegWordW->lpWord)
1693 {
1694 RegWordA.lpWord = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpWord);
1695 if (IS_NULL_UNEXPECTEDLY(RegWordA.lpWord))
1696 goto Quit;
1697 }
1698
1699 lpData = &RegWordA;
1700
1701DoIt:
1702 SendMessageW(hWnd, WM_IME_SYSTEM, 0x1B, 0);
1703 ret = pImeDpi->ImeConfigure(hKL, hWnd, dwMode, lpData);
1704 SendMessageW(hWnd, WM_IME_SYSTEM, 0x1A, 0);
1705
1706Quit:
1707 ImmLocalFree(RegWordA.lpReading);
1708 ImmLocalFree(RegWordA.lpWord);
1709 ImmUnlockImeDpi(pImeDpi);
1710 TRACE("ret: %d\n", ret);
1711 return ret;
1712}
LPSTR lpReading
Definition: dimm.idl:30
LPSTR lpWord
Definition: dimm.idl:31
LPWSTR lpReading
Definition: imm.h:33
LPWSTR lpWord
Definition: imm.h:34
LPSTR Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW)
Definition: utils.c:107

Referenced by ActiveIMMApp_ConfigureIMEW(), ImeWnd_OnImeSystem(), and test_ImmIME().

◆ ImmDisableIME()

BOOL WINAPI ImmDisableIME ( _In_ DWORD  dwThreadId)

Definition at line 632 of file ime.c.

633{
635}
DWORD dwThreadId
Definition: fdebug.c:31
BOOL NTAPI NtUserDisableThreadIme(_In_ DWORD dwThreadID)
Definition: ime.c:905

Referenced by ActiveIMMApp_DisableIME(), START_TEST(), and test_default_ime_disabled_cb().

◆ ImmEscapeA()

LRESULT WINAPI ImmEscapeA ( _In_ HKL  hKL,
_In_ HIMC  hIMC,
_In_ UINT  uSubFunc,
_Inout_opt_ LPVOID  lpData 
)

Definition at line 821 of file ime.c.

826{
827 LRESULT ret;
828 PIMEDPI pImeDpi;
829 INT cch;
832
833 TRACE("(%p, %p, %u, %p)\n", hKL, hIMC, uSubFunc, lpData);
834
835 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
836 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
837 return 0;
838
839 if (!ImeDpi_IsUnicode(pImeDpi) || !lpData) /* No conversion needed */
840 {
841 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
842 ImmUnlockImeDpi(pImeDpi);
843 return ret;
844 }
845
846 switch (uSubFunc)
847 {
849 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
850
851 cch = 0;
852 if (HIWORD(ret))
853 szW[cch++] = HIWORD(ret);
854 if (LOWORD(ret))
855 szW[cch++] = LOWORD(ret);
856
857 cch = WideCharToMultiByte(pImeDpi->uCodePage, 0, szW, cch, szA, _countof(szA),
858 NULL, NULL);
859 switch (cch)
860 {
861 case 1:
862 ret = MAKEWORD(szA[0], 0);
863 break;
864 case 2:
865 ret = MAKEWORD(szA[1], szA[0]);
866 break;
867 case 3:
868 ret = MAKELONG(MAKEWORD(szA[2], szA[1]), MAKEWORD(szA[0], 0));
869 break;
870 case 4:
871 ret = MAKELONG(MAKEWORD(szA[3], szA[2]), MAKEWORD(szA[1], szA[0]));
872 break;
873 default:
874 ret = 0;
875 break;
876 }
877 break;
878
880 case IME_ESC_IME_NAME:
882 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, szW, hKL);
883 if (ret)
884 {
885 szW[_countof(szW) - 1] = UNICODE_NULL; /* Avoid buffer overrun */
886 WideCharToMultiByte(pImeDpi->uCodePage, 0, szW, -1,
887 lpData, MAX_IMM_FILENAME, NULL, NULL);
888 ((LPSTR)lpData)[MAX_IMM_FILENAME - 1] = ANSI_NULL; // Avoid buffer overrun
889 }
890 break;
891
895 lpData, -1, szW, _countof(szW));
896 szW[_countof(szW) - 1] = UNICODE_NULL; /* Avoid buffer overrun */
897 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, szW, hKL);
898 break;
899
900 default:
901 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
902 break;
903 }
904
905 ImmUnlockImeDpi(pImeDpi);
906 TRACE("ret: %p\n", ret);
907 return ret;
908}
#define WideCharToMultiByte
Definition: compat.h:111
static LRESULT ImeDpi_Escape(PIMEDPI pImeDpi, HIMC hIMC, UINT uSubFunc, LPVOID lpData, HKL hKL)
Definition: ime.c:368
#define IME_ESC_SET_EUDC_DICTIONARY
Definition: imm.h:417
#define IME_ESC_HANJA_MODE
Definition: imm.h:421
#define IME_ESC_GETHELPFILENAME
Definition: imm.h:424
#define IME_ESC_GET_EUDC_DICTIONARY
Definition: imm.h:416
#define IME_ESC_IME_NAME
Definition: imm.h:419
#define IME_ESC_SEQUENCE_TO_INTERNAL
Definition: imm.h:415
LONG_PTR LRESULT
Definition: minwindef.h:176
#define ANSI_NULL
char CHAR
Definition: pedump.c:57
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define MAKEWORD(a, b)
Definition: typedefs.h:248
int32_t INT
Definition: typedefs.h:58
#define MAKELONG(a, b)
Definition: typedefs.h:249
#define HIWORD(l)
Definition: typedefs.h:247
#define MAX_IMM_FILENAME
Definition: precomp.h:80

Referenced by ActiveIMMApp_EscapeA().

◆ ImmEscapeW()

LRESULT WINAPI ImmEscapeW ( _In_ HKL  hKL,
_In_ HIMC  hIMC,
_In_ UINT  uSubFunc,
_Inout_opt_ LPVOID  lpData 
)

Definition at line 914 of file ime.c.

919{
920 LRESULT ret;
921 PIMEDPI pImeDpi;
922 INT cch;
925 WORD word;
926
927 TRACE("(%p, %p, %u, %p)\n", hKL, hIMC, uSubFunc, lpData);
928
929 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
930 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
931 return 0;
932
933 if (ImeDpi_IsUnicode(pImeDpi) || !lpData) /* No conversion needed */
934 {
935 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
936 ImmUnlockImeDpi(pImeDpi);
937 return ret;
938 }
939
940 switch (uSubFunc)
941 {
943 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
944
945 word = LOWORD(ret);
946 cch = 0;
947 if (HIBYTE(word))
948 szA[cch++] = HIBYTE(word);
949 if (LOBYTE(word))
950 szA[cch++] = LOBYTE(word);
951
953 szA, cch, szW, _countof(szW));
954 switch (cch)
955 {
956 case 1: ret = szW[0]; break;
957 case 2: ret = MAKELONG(szW[1], szW[0]); break;
958 default: ret = 0; break;
959 }
960 break;
961
963 case IME_ESC_IME_NAME:
965 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, szA, hKL);
966 if (ret)
967 {
968 szA[_countof(szA) - 1] = ANSI_NULL; // Avoid buffer overrun
970 szA, -1, lpData, MAX_IMM_FILENAME);
971 ((LPWSTR)lpData)[MAX_IMM_FILENAME - 1] = UNICODE_NULL; /* Avoid buffer overrun */
972 }
973 break;
974
977 WideCharToMultiByte(pImeDpi->uCodePage, 0,
978 lpData, -1, szA, _countof(szA), NULL, NULL);
979 szA[_countof(szA) - 1] = ANSI_NULL; // Avoid buffer overrun
980 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, szA, hKL);
981 break;
982
983 default:
984 ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
985 break;
986 }
987
988 ImmUnlockImeDpi(pImeDpi);
989 TRACE("ret: %p\n", ret);
990 return ret;
991}
unsigned short WORD
Definition: ntddk_ex.h:93
#define LOBYTE(W)
Definition: jmemdos.c:487
#define HIBYTE(W)
Definition: jmemdos.c:486
const WCHAR * word
Definition: lex.c:36
uint16_t * LPWSTR
Definition: typedefs.h:56

Referenced by ActiveIMMApp_EscapeW(), IntGetImeLayoutText(), and User32DoImeHelp().

◆ ImmGetCompositionFontA()

BOOL WINAPI ImmGetCompositionFontA ( _In_ HIMC  hIMC,
_Out_ LPLOGFONTA  lplf 
)

Definition at line 1185 of file ime.c.

1188{
1189 PCLIENTIMC pClientImc;
1190 BOOL ret = FALSE, bWide;
1191 LPINPUTCONTEXT pIC;
1192
1193 TRACE("(%p, %p)\n", hIMC, lplf);
1194
1195 pClientImc = ImmLockClientImc(hIMC);
1196 if (IS_NULL_UNEXPECTEDLY(pClientImc))
1197 return FALSE;
1198
1199 bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
1200 ImmUnlockClientImc(pClientImc);
1201
1202 pIC = ImmLockIMC(hIMC);
1203 if (IS_NULL_UNEXPECTEDLY(pIC))
1204 return FALSE;
1205
1206 if (pIC->fdwInit & INIT_LOGFONT)
1207 {
1208 if (bWide)
1209 LogFontWideToAnsi(&pIC->lfFont.W, lplf);
1210 else
1211 *lplf = pIC->lfFont.A;
1212
1213 ret = TRUE;
1214 }
1215
1216 ImmUnlockIMC(hIMC);
1217 return ret;
1218}
PCLIENTIMC WINAPI ImmLockClientImc(_In_ HIMC hImc)
Definition: imm.c:955
VOID WINAPI ImmUnlockClientImc(_Inout_ PCLIENTIMC pClientImc)
Definition: imm.c:1002
#define CLIENTIMC_WIDE
Definition: imm32_undoc.h:183
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
Definition: imm.c:1080
#define INIT_LOGFONT
Definition: immdev.h:154
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
Definition: imm.c:1090
DWORD fdwInit
Definition: immdev.h:125
LOGFONTA A
Definition: immdev.h:114
union _tagINPUTCONTEXT::@2217 lfFont
LOGFONTW W
Definition: immdev.h:115
VOID LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA)
Definition: utils.c:176

Referenced by ActiveIMMApp_GetCompositionFontA(), ImeWnd_OnImeControl(), test_ImmThreads(), and test_InvalidIMC().

◆ ImmGetCompositionFontW()

BOOL WINAPI ImmGetCompositionFontW ( _In_ HIMC  hIMC,
_Out_ LPLOGFONTW  lplf 
)

Definition at line 1224 of file ime.c.

1227{
1228 PCLIENTIMC pClientImc;
1229 BOOL bWide;
1230 LPINPUTCONTEXT pIC;
1231 BOOL ret = FALSE;
1232
1233 TRACE("(%p, %p)\n", hIMC, lplf);
1234
1235 pClientImc = ImmLockClientImc(hIMC);
1236 if (IS_NULL_UNEXPECTEDLY(pClientImc))
1237 return FALSE;
1238
1239 bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
1240 ImmUnlockClientImc(pClientImc);
1241
1242 pIC = ImmLockIMC(hIMC);
1243 if (IS_NULL_UNEXPECTEDLY(pIC))
1244 return FALSE;
1245
1246 if (pIC->fdwInit & INIT_LOGFONT)
1247 {
1248 if (bWide)
1249 *lplf = pIC->lfFont.W;
1250 else
1251 LogFontAnsiToWide(&pIC->lfFont.A, lplf);
1252
1253 ret = TRUE;
1254 }
1255
1256 ImmUnlockIMC(hIMC);
1257 return ret;
1258}
VOID LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW)
Definition: utils.c:164

Referenced by ActiveIMMApp_GetCompositionFontW(), and ImeWnd_OnImeControl().

◆ ImmGetCompositionWindow()

BOOL WINAPI ImmGetCompositionWindow ( _In_ HIMC  hIMC,
_Out_ LPCOMPOSITIONFORM  lpCompForm 
)

Definition at line 1123 of file ime.c.

1126{
1127 LPINPUTCONTEXT pIC;
1128 BOOL ret = FALSE;
1129
1130 TRACE("(%p, %p)\n", hIMC, lpCompForm);
1131
1132 pIC = ImmLockIMC(hIMC);
1133 if (IS_NULL_UNEXPECTEDLY(pIC))
1134 return FALSE;
1135
1136 if (pIC->fdwInit & INIT_COMPFORM)
1137 {
1138 *lpCompForm = pIC->cfCompForm;
1139 ret = TRUE;
1140 }
1141
1142 ImmUnlockIMC(hIMC);
1143 return ret;
1144}
#define INIT_COMPFORM
Definition: immdev.h:155
COMPOSITIONFORM cfCompForm
Definition: immdev.h:117

Referenced by ActiveIMMApp_GetCompositionWindow(), ImeWnd_OnImeSystem(), test_ImmThreads(), and test_InvalidIMC().

◆ ImmGetConversionListA()

DWORD WINAPI ImmGetConversionListA ( _In_ HKL  hKL,
_In_ HIMC  hIMC,
_In_ LPCSTR  pSrc,
_Out_writes_bytes_(dwBufLen) LPCANDIDATELIST  lpDst,
_In_ DWORD  dwBufLen,
_In_ UINT  uFlag 
)

Definition at line 1382 of file ime.c.

1389{
1390 DWORD ret = 0;
1391 UINT cb;
1392 LPWSTR pszSrcW = NULL;
1393 LPCANDIDATELIST pCL = NULL;
1394 PIMEDPI pImeDpi;
1395
1396 TRACE("(%p, %p, %s, %p, %lu, 0x%lX)\n", hKL, hIMC, debugstr_a(pSrc), lpDst, dwBufLen, uFlag);
1397
1398 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
1399 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1400 return 0;
1401
1402 if (!ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
1403 {
1404 ret = pImeDpi->ImeConversionList(hIMC, pSrc, lpDst, dwBufLen, uFlag);
1405 ImmUnlockImeDpi(pImeDpi);
1406 return ret;
1407 }
1408
1409 if (pSrc)
1410 {
1411 pszSrcW = Imm32WideFromAnsi(pImeDpi->uCodePage, pSrc);
1412 if (IS_NULL_UNEXPECTEDLY(pszSrcW))
1413 goto Quit;
1414 }
1415
1416 cb = pImeDpi->ImeConversionList(hIMC, pszSrcW, NULL, 0, uFlag);
1418 goto Quit;
1419
1420 pCL = ImmLocalAlloc(0, cb);
1421 if (IS_NULL_UNEXPECTEDLY(pCL))
1422 goto Quit;
1423
1424 cb = pImeDpi->ImeConversionList(hIMC, pszSrcW, pCL, cb, uFlag);
1426 goto Quit;
1427
1428 ret = CandidateListWideToAnsi(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
1429
1430Quit:
1431 ImmLocalFree(pszSrcW);
1432 ImmLocalFree(pCL);
1433 ImmUnlockImeDpi(pImeDpi);
1434 TRACE("ret: 0x%X\n", ret);
1435 return ret;
1436}
DWORD CandidateListWideToAnsi(const CANDIDATELIST *pWideCL, LPCANDIDATELIST pAnsiCL, DWORD dwBufLen, UINT uCodePage)
Definition: candidate.c:15
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
#define debugstr_a
Definition: kernel32.h:31
#define IS_ZERO_UNEXPECTEDLY(p)
Definition: precomp.h:68

Referenced by ActiveIMMApp_GetConversionListA().

◆ ImmGetConversionListW()

DWORD WINAPI ImmGetConversionListW ( _In_ HKL  hKL,
_In_ HIMC  hIMC,
_In_ LPCWSTR  pSrc,
_Out_writes_bytes_(dwBufLen) LPCANDIDATELIST  lpDst,
_In_ DWORD  dwBufLen,
_In_ UINT  uFlag 
)

Definition at line 1442 of file ime.c.

1449{
1450 DWORD ret = 0;
1451 INT cb;
1452 PIMEDPI pImeDpi;
1453 LPCANDIDATELIST pCL = NULL;
1454 LPSTR pszSrcA = NULL;
1455
1456 TRACE("(%p, %p, %s, %p, %lu, 0x%lX)\n", hKL, hIMC, debugstr_w(pSrc), lpDst, dwBufLen, uFlag);
1457
1458 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
1459 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1460 return 0;
1461
1462 if (ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
1463 {
1464 ret = pImeDpi->ImeConversionList(hIMC, pSrc, lpDst, dwBufLen, uFlag);
1465 ImmUnlockImeDpi(pImeDpi);
1466 return ret;
1467 }
1468
1469 if (pSrc)
1470 {
1471 pszSrcA = Imm32AnsiFromWide(pImeDpi->uCodePage, pSrc);
1472 if (IS_NULL_UNEXPECTEDLY(pszSrcA))
1473 goto Quit;
1474 }
1475
1476 cb = pImeDpi->ImeConversionList(hIMC, pszSrcA, NULL, 0, uFlag);
1478 goto Quit;
1479
1480 pCL = ImmLocalAlloc(0, cb);
1481 if (IS_NULL_UNEXPECTEDLY(pCL))
1482 goto Quit;
1483
1484 cb = pImeDpi->ImeConversionList(hIMC, pszSrcA, pCL, cb, uFlag);
1486 goto Quit;
1487
1488 ret = CandidateListAnsiToWide(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
1489
1490Quit:
1491 ImmLocalFree(pszSrcA);
1492 ImmLocalFree(pCL);
1493 ImmUnlockImeDpi(pImeDpi);
1494 TRACE("ret: 0x%X\n", ret);
1495 return ret;
1496}
DWORD CandidateListAnsiToWide(const CANDIDATELIST *pAnsiCL, LPCANDIDATELIST pWideCL, DWORD dwBufLen, UINT uCodePage)
Definition: candidate.c:84

Referenced by ActiveIMMApp_GetConversionListW().

◆ ImmGetConversionStatus()

BOOL WINAPI ImmGetConversionStatus ( _In_ HIMC  hIMC,
_Out_opt_ LPDWORD  lpfdwConversion,
_Out_opt_ LPDWORD  lpfdwSentence 
)

Definition at line 1502 of file ime.c.

1506{
1507 LPINPUTCONTEXT pIC;
1508
1509 TRACE("(%p %p %p)\n", hIMC, lpfdwConversion, lpfdwSentence);
1510
1511 pIC = ImmLockIMC(hIMC);
1512 if (IS_NULL_UNEXPECTEDLY(pIC))
1513 return FALSE;
1514
1515 if (lpfdwConversion)
1516 {
1517 *lpfdwConversion = pIC->fdwConversion;
1518 TRACE("0x%X\n", *lpfdwConversion);
1519 }
1520
1521 if (lpfdwSentence)
1522 {
1523 *lpfdwSentence = pIC->fdwSentence;
1524 TRACE("0x%X\n", *lpfdwSentence);
1525 }
1526
1527 ImmUnlockIMC(hIMC);
1528 return TRUE;
1529}
DWORD fdwConversion
Definition: immdev.h:111
DWORD fdwSentence
Definition: immdev.h:112

Referenced by ActiveIMMApp_GetConversionStatus(), ConIme_OnNotifySetOpenStatus(), ConIme_SendImeStatus(), ImeWnd_OnImeControl(), ImeWnd_OnImeSystem(), ImeWnd_SwitchSoftKbdProc(), IntGetImeState(), OnTimer(), and test_ImmThreads().

◆ ImmGetDefaultIMEWnd()

◆ ImmGetDescriptionA()

UINT WINAPI ImmGetDescriptionA ( _In_ HKL  hKL,
_Out_writes_opt_(uBufLen) LPSTR  lpszDescription,
_In_ UINT  uBufLen 
)

Definition at line 641 of file ime.c.

645{
647 size_t cch;
648
649 TRACE("(%p,%p,%d)\n", hKL, lpszDescription, uBufLen);
650
652 {
653 ERR("\n");
654 return 0;
655 }
656
657 StringCchLengthW(info.wszImeDescription, _countof(info.wszImeDescription), &cch);
658 cch = WideCharToMultiByte(CP_ACP, 0, info.wszImeDescription, (INT)cch,
659 lpszDescription, uBufLen, NULL, NULL);
660 if (uBufLen)
661 lpszDescription[cch] = ANSI_NULL;
662 return (UINT)cch;
663}
STRSAFEAPI StringCchLengthW(STRSAFE_LPCWSTR psz, size_t cchMax, size_t *pcchLength)
Definition: strsafe.h:842

Referenced by ActiveIMMApp_GetDescriptionA(), and test_ImmGetDescription().

◆ ImmGetDescriptionW()

UINT WINAPI ImmGetDescriptionW ( _In_ HKL  hKL,
_Out_writes_opt_(uBufLen) LPWSTR  lpszDescription,
_In_ UINT  uBufLen 
)

Definition at line 669 of file ime.c.

673{
675 size_t cch;
676
677 TRACE("(%p, %p, %d)\n", hKL, lpszDescription, uBufLen);
678
680 {
681 ERR("\n");
682 return 0;
683 }
684
685 if (uBufLen != 0)
686 StringCchCopyW(lpszDescription, uBufLen, info.wszImeDescription);
687
688 StringCchLengthW(info.wszImeDescription, _countof(info.wszImeDescription), &cch);
689 return (UINT)cch;
690}

Referenced by ActiveIMMApp_GetDescriptionW(), GetHKLDesctription(), and test_ImmGetDescription().

◆ ImmGetIMEFileNameA()

UINT WINAPI ImmGetIMEFileNameA ( _In_ HKL  hKL,
_Out_writes_opt_(uBufLen) LPSTR  lpszFileName,
_In_ UINT  uBufLen 
)

Definition at line 696 of file ime.c.

700{
701 BOOL bDefUsed;
703 size_t cch;
704
705 TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
706
708 {
709 ERR("\n");
710 if (uBufLen > 0)
711 lpszFileName[0] = ANSI_NULL;
712 return 0;
713 }
714
715 StringCchLengthW(info.wszImeFile, _countof(info.wszImeFile), &cch);
716
717 cch = WideCharToMultiByte(CP_ACP, 0, info.wszImeFile, (INT)cch,
718 lpszFileName, uBufLen, NULL, &bDefUsed);
719 if (uBufLen == 0)
720 return (UINT)cch;
721
722 if (cch > uBufLen - 1)
723 cch = uBufLen - 1;
724
725 lpszFileName[cch] = ANSI_NULL;
726 return (UINT)cch;
727}

Referenced by ActiveIMMApp_GetIMEFileNameA().

◆ ImmGetIMEFileNameW()

UINT WINAPI ImmGetIMEFileNameW ( _In_ HKL  hKL,
_Out_writes_opt_(uBufLen) LPWSTR  lpszFileName,
_In_ UINT  uBufLen 
)

Definition at line 733 of file ime.c.

737{
739 size_t cch;
740
741 TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
742
744 {
745 ERR("\n");
746 if (uBufLen > 0)
747 lpszFileName[0] = UNICODE_NULL;
748 return 0;
749 }
750
751 StringCchLengthW(info.wszImeFile, _countof(info.wszImeFile), &cch);
752 if (uBufLen == 0)
753 return (UINT)cch;
754
755 StringCchCopyNW(lpszFileName, uBufLen, info.wszImeFile, cch);
756
757 if (cch > uBufLen - 1)
758 cch = uBufLen - 1;
759
760 lpszFileName[cch] = UNICODE_NULL;
761 return (UINT)cch;
762}
STRSAFEAPI StringCchCopyNW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, size_t cchToCopy)
Definition: strsafe.h:236

Referenced by ActiveIMMApp_GetIMEFileNameW(), GetHKLDesctription(), and IntGetImeLayoutText().

◆ ImmGetImeInfoEx()

BOOL WINAPI ImmGetImeInfoEx ( PIMEINFOEX  pImeInfoEx,
IMEINFOEXCLASS  SearchType,
PVOID  pvSearchKey 
)

Definition at line 492 of file ime.c.

493{
494 BOOL bTextServiceDisabled = FALSE;
495
496 if (SearchType == ImeInfoExKeyboardLayoutTFS)
497 {
498 SearchType = ImeInfoExKeyboardLayout;
499 bTextServiceDisabled = CtfImmIsTextFrameServiceDisabled();
500 }
501
502 if (SearchType == ImeInfoExKeyboardLayout)
503 {
504 HKL hKL = *(HKL *)pvSearchKey;
505 pImeInfoEx->hkl = hKL;
506
507 if (!IS_IME_HKL(hKL) &&
508 (!IS_CICERO_MODE() || IS_CICERO_COMPAT_DISABLED() || bTextServiceDisabled))
509 {
510 TRACE("IME is disabled\n");
511 return FALSE;
512 }
513
514 return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
515 }
516
517 if (SearchType == ImeInfoExImeFileName)
518 {
519 StringCchCopyW(pImeInfoEx->wszImeFile, _countof(pImeInfoEx->wszImeFile), pvSearchKey);
520 return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
521 }
522
523 /* NOTE: ImeInfoExImeWindow is ignored */
524 ERR("SearchType: %d\n", SearchType);
525 return FALSE;
526}
BOOL WINAPI CtfImmIsTextFrameServiceDisabled(VOID)
Definition: ctf.c:1079
@ ImeInfoExImeFileName
Definition: imm32_undoc.h:96
@ ImeInfoExKeyboardLayoutTFS
Definition: imm32_undoc.h:94
BOOL NTAPI NtUserGetImeInfoEx(_Inout_ PIMEINFOEX pImeInfoEx, _In_ IMEINFOEXCLASS SearchType)
Definition: ime.c:1069
UINT_PTR HKL
Definition: msctf.idl:125

Referenced by Imm32LoadImeDpi(), ImmGetDescriptionA(), ImmGetDescriptionW(), ImmGetIMEFileNameA(), ImmGetIMEFileNameW(), ImmGetProperty(), and ImmIsIME().

◆ ImmGetOpenStatus()

BOOL WINAPI ImmGetOpenStatus ( _In_ HIMC  hIMC)

Definition at line 997 of file ime.c.

998{
999 BOOL ret;
1000 LPINPUTCONTEXT pIC;
1001
1002 TRACE("(%p)\n", hIMC);
1003
1004 if (IS_NULL_UNEXPECTEDLY(hIMC))
1005 return FALSE;
1006
1007 pIC = ImmLockIMC(hIMC);
1008 if (IS_NULL_UNEXPECTEDLY(pIC))
1009 return FALSE;
1010
1011 ret = pIC->fOpen;
1012 ImmUnlockIMC(hIMC);
1013 TRACE("ret: %d\n", ret);
1014 return ret;
1015}

Referenced by ActiveIMMApp_GetOpenStatus(), ImeWnd_OnImeControl(), Imm32JCloseOpen(), IntIsImeOpen(), test_ImmThreads(), and test_InvalidIMC().

◆ ImmGetProperty()

DWORD WINAPI ImmGetProperty ( _In_ HKL  hKL,
_In_ DWORD  fdwIndex 
)

Definition at line 768 of file ime.c.

771{
772 IMEINFOEX ImeInfoEx;
773 LPIMEINFO pImeInfo;
774 DWORD dwValue;
775 PIMEDPI pImeDpi = NULL;
776
777 TRACE("(%p, %lu)\n", hKL, fdwIndex);
778
779 if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
780 {
781 ERR("\n");
782 return FALSE;
783 }
784
785 if (fdwIndex == IGP_GETIMEVERSION)
786 return ImeInfoEx.dwImeWinVersion;
787
788 if (ImeInfoEx.fLoadFlag != 2)
789 {
790 pImeDpi = Imm32FindOrLoadImeDpi(hKL);
791 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
792 return FALSE;
793
794 pImeInfo = &pImeDpi->ImeInfo;
795 }
796 else
797 {
798 pImeInfo = &ImeInfoEx.ImeInfo;
799 }
800
801 switch (fdwIndex)
802 {
803 case IGP_PROPERTY: dwValue = pImeInfo->fdwProperty; break;
804 case IGP_CONVERSION: dwValue = pImeInfo->fdwConversionCaps; break;
805 case IGP_SENTENCE: dwValue = pImeInfo->fdwSentenceCaps; break;
806 case IGP_UI: dwValue = pImeInfo->fdwUICaps; break;
807 case IGP_SETCOMPSTR: dwValue = pImeInfo->fdwSCSCaps; break;
808 case IGP_SELECT: dwValue = pImeInfo->fdwSelectCaps; break;
809 default: dwValue = 0; break;
810 }
811
812 if (pImeDpi)
813 ImmUnlockImeDpi(pImeDpi);
814 return dwValue;
815}
#define IGP_SELECT
Definition: imm.h:305
#define IGP_SETCOMPSTR
Definition: imm.h:304
#define IGP_GETIMEVERSION
Definition: imm.h:299
#define IGP_PROPERTY
Definition: imm.h:300
#define IGP_SENTENCE
Definition: imm.h:302
#define IGP_CONVERSION
Definition: imm.h:301
#define IGP_UI
Definition: imm.h:303
DWORD dwImeWinVersion
Definition: imm32_undoc.h:81

Referenced by ActiveIMMApp_GetProperty(), ConIme_OnChangeKeyboard(), ConIme_OnSwitchIme(), KbSwitch_OnPenIconMsg(), and test_ImmGetCompositionString().

◆ ImmGetStatusWindowPos()

BOOL WINAPI ImmGetStatusWindowPos ( _In_ HIMC  hIMC,
_Out_ LPPOINT  lpptPos 
)

Definition at line 1067 of file ime.c.

1070{
1071 LPINPUTCONTEXT pIC;
1072 BOOL ret;
1073
1074 TRACE("(%p, %p)\n", hIMC, lpptPos);
1075
1076 pIC = ImmLockIMC(hIMC);
1077 if (IS_NULL_UNEXPECTEDLY(pIC))
1078 return FALSE;
1079
1080 ret = !!(pIC->fdwInit & INIT_STATUSWNDPOS);
1081 if (ret)
1082 *lpptPos = pIC->ptStatusWndPos;
1083
1084 ImmUnlockIMC(hIMC);
1085 return ret;
1086}
#define INIT_STATUSWNDPOS
Definition: immdev.h:151
POINT ptStatusWndPos
Definition: immdev.h:109

Referenced by ActiveIMMApp_GetStatusWindowPos(), test_ImmThreads(), and test_InvalidIMC().

◆ ImmIsIME()

◆ ImmLoadIME()

BOOL WINAPI ImmLoadIME ( _In_ HKL  hKL)

Definition at line 612 of file ime.c.

613{
614 PIMEDPI pImeDpi;
615
616 if (!IS_IME_HKL(hKL) && (!IS_CICERO_MODE() || IS_16BIT_MODE()))
617 {
618 TRACE("\n");
619 return FALSE;
620 }
621
622 pImeDpi = Imm32FindImeDpi(hKL);
623 if (pImeDpi == NULL)
624 pImeDpi = Imm32LoadImeDpi(hKL, FALSE);
625 return (pImeDpi != NULL);
626}

Referenced by CtfImmTIMActivate(), CtfLoadThreadLayout(), and ImmActivateLayout().

◆ ImmLockImeDpi()

PIMEDPI WINAPI ImmLockImeDpi ( _In_ HKL  hKL)

Definition at line 532 of file ime.c.

533{
534 PIMEDPI pImeDpi = NULL;
535
536 TRACE("(%p)\n", hKL);
537
539
540 /* Find by hKL */
541 for (pImeDpi = gpImeDpiList; pImeDpi; pImeDpi = pImeDpi->pNext)
542 {
543 if (pImeDpi->hKL == hKL) /* found */
544 {
545 /* lock if possible */
546 if (pImeDpi->dwFlags & IMEDPI_FLAG_UNLOADED)
547 pImeDpi = NULL;
548 else
549 ++(pImeDpi->cLockObj);
550 break;
551 }
552 }
553
555 return pImeDpi;
556}

Referenced by Imm32CreateInputContext(), Imm32DestroyInputContext(), Imm32FindOrLoadImeDpi(), Imm32MakeIMENotify(), Imm32ProcessHotKey(), Imm32SelectInputContext(), ImmActivateLayout(), ImmCallImeConsoleIME(), ImmCreateSoftKeyboard(), ImmGetImeMenuItemsAW(), ImmNotifyIME(), ImmProcessKey(), ImmSetActiveContext(), ImmSetCompositionStringAW(), ImmTranslateMessage(), and User32CreateImeUIWindow().

◆ ImmNotifyIME()

BOOL WINAPI ImmNotifyIME ( _In_ HIMC  hIMC,
_In_ DWORD  dwAction,
_In_ DWORD  dwIndex,
_In_ DWORD_PTR  dwValue 
)

Definition at line 459 of file ime.c.

464{
465 HKL hKL;
466 PIMEDPI pImeDpi;
467 BOOL ret;
468
469 TRACE("(%p, %lu, %lu, %lu)\n", hIMC, dwAction, dwIndex, dwValue);
470
471 if (hIMC && IS_CROSS_THREAD_HIMC(hIMC))
472 return FALSE;
473
474 hKL = GetKeyboardLayout(0);
475 pImeDpi = ImmLockImeDpi(hKL);
476 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
477 return FALSE;
478
479 TRACE("NotifyIME(%p, %lu, %lu, %p)\n", hIMC, dwAction, dwIndex, dwValue);
480 ret = pImeDpi->NotifyIME(hIMC, dwAction, dwIndex, dwValue);
481 if (!ret)
482 WARN("NotifyIME(%p, %lu, %lu, %p) failed\n", hIMC, dwAction, dwIndex, dwValue);
483
484 ImmUnlockImeDpi(pImeDpi);
485 return ret;
486}
#define WARN(fmt,...)
Definition: precomp.h:61
#define IS_CROSS_THREAD_HIMC(hIMC)
Definition: precomp.h:73
HKL WINAPI GetKeyboardLayout(_In_ DWORD)

Referenced by ActiveIMMApp_NotifyIME(), EDIT_WindowProc(), editor_handle_message(), Imm32NotifyIMEProc(), ImmSystemHandler(), IntSendCandListCHS(), IntSendCandListCHT(), IntSendCandListJPNorKOR(), CicBridge::SetActiveContextAlways(), CicBridge::SetCompositionString(), test_edit_ime_messages(), test_ImmGetCompositionString(), test_ImmNotifyIME(), and User32ImeMenuItemSelected().

◆ ImmSetCompositionFontA()

BOOL WINAPI ImmSetCompositionFontA ( _In_ HIMC  hIMC,
_In_ LPLOGFONTA  lplf 
)

Definition at line 1264 of file ime.c.

1267{
1268 LOGFONTW lfW;
1269 PCLIENTIMC pClientImc;
1270 BOOL bWide;
1271 LPINPUTCONTEXTDX pIC;
1272 LANGID LangID;
1273 HWND hWnd;
1274
1275 TRACE("(%p, %p)\n", hIMC, lplf);
1276
1277 if (IS_CROSS_THREAD_HIMC(hIMC))
1278 return FALSE;
1279
1280 pClientImc = ImmLockClientImc(hIMC);
1281 if (IS_NULL_UNEXPECTEDLY(pClientImc))
1282 return FALSE;
1283
1284 bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
1285 ImmUnlockClientImc(pClientImc);
1286
1287 if (bWide)
1288 {
1289 LogFontAnsiToWide(lplf, &lfW);
1290 return ImmSetCompositionFontW(hIMC, &lfW);
1291 }
1292
1293 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
1294 if (IS_NULL_UNEXPECTEDLY(pIC))
1295 return FALSE;
1296
1297 if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */
1298 {
1301 !(pIC->dwUIFlags & _IME_UI_HIDDEN) &&
1302 pIC->cfCompForm.dwStyle != CFS_DEFAULT)
1303 {
1305 }
1306 }
1307
1308 pIC->lfFont.A = *lplf;
1309 pIC->fdwInit |= INIT_LOGFONT;
1310 hWnd = pIC->hWnd;
1311
1312 ImmUnlockIMC(hIMC);
1313
1316 return TRUE;
1317}
LCID WINAPI GetSystemDefaultLCID(void)
Definition: locale.c:1235
#define WM_IME_REPORT
Definition: ime.h:122
#define IR_CHANGECONVERT
Definition: ime.h:127
BOOL WINAPI ImmSetCompositionFontW(_In_ HIMC hIMC, _In_ LPLOGFONTW lplf)
Definition: ime.c:1323
#define _IME_UI_HIDDEN
Definition: imm32_undoc.h:214
struct INPUTCONTEXTDX * LPINPUTCONTEXTDX
#define IMN_SETCOMPOSITIONFONT
Definition: imm.h:381
#define CFS_DEFAULT
Definition: imm.h:323
#define IMC_SETCOMPOSITIONFONT
Definition: imm.h:151
#define NI_CONTEXTUPDATED
Definition: immdev.h:357
USHORT LANGID
Definition: mui.h:9
#define LANGIDFROMLCID(l)
Definition: nls.h:18
#define LANG_JAPANESE
Definition: nls.h:76
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define _WIN32_WINNT_NT4
Definition: sdkddkver.h:20
_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
Definition: wdfusb.h:1083
BOOL Imm32MakeIMENotify(_In_ HIMC hIMC, _In_ HWND hwnd, _In_ DWORD dwAction, _In_ DWORD dwIndex, _Inout_opt_ DWORD_PTR dwValue, _In_ DWORD dwCommand, _Inout_opt_ DWORD_PTR dwData)
Definition: utils.c:287
BOOL WINAPI PostMessageA(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by ActiveIMMApp_SetCompositionFontA(), ImeWnd_OnImeControl(), ImmSetCompositionFontW(), test_ImmThreads(), and test_InvalidIMC().

◆ ImmSetCompositionFontW()

BOOL WINAPI ImmSetCompositionFontW ( _In_ HIMC  hIMC,
_In_ LPLOGFONTW  lplf 
)

Definition at line 1323 of file ime.c.

1326{
1327 LOGFONTA lfA;
1328 PCLIENTIMC pClientImc;
1329 BOOL bWide;
1330 HWND hWnd;
1331 LPINPUTCONTEXTDX pIC;
1332 LANGID LangID;
1333
1334 TRACE("(%p, %p)\n", hIMC, lplf);
1335
1336 if (IS_CROSS_THREAD_HIMC(hIMC))
1337 return FALSE;
1338
1339 pClientImc = ImmLockClientImc(hIMC);
1340 if (IS_NULL_UNEXPECTEDLY(pClientImc))
1341 return FALSE;
1342
1343 bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
1344 ImmUnlockClientImc(pClientImc);
1345
1346 if (!bWide)
1347 {
1348 LogFontWideToAnsi(lplf, &lfA);
1349 return ImmSetCompositionFontA(hIMC, &lfA);
1350 }
1351
1352 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
1353 if (IS_NULL_UNEXPECTEDLY(pIC))
1354 return FALSE;
1355
1356 if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */
1357 {
1360 !(pIC->dwUIFlags & _IME_UI_HIDDEN) &&
1361 pIC->cfCompForm.dwStyle != CFS_DEFAULT)
1362 {
1364 }
1365 }
1366
1367 pIC->lfFont.W = *lplf;
1368 pIC->fdwInit |= INIT_LOGFONT;
1369 hWnd = pIC->hWnd;
1370
1371 ImmUnlockIMC(hIMC);
1372
1375 return TRUE;
1376}
BOOL WINAPI ImmSetCompositionFontA(_In_ HIMC hIMC, _In_ LPLOGFONTA lplf)
Definition: ime.c:1264
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by ActiveIMMApp_SetCompositionFontW(), EDIT_WM_SetFont(), editor_handle_message(), ImeWnd_OnImeControl(), ImeWnd_OnImeSystem(), ImmSetCompositionFontA(), and update_caret().

◆ ImmSetCompositionWindow()

BOOL WINAPI ImmSetCompositionWindow ( _In_ HIMC  hIMC,
_In_ LPCOMPOSITIONFORM  lpCompForm 
)

Definition at line 1150 of file ime.c.

1153{
1154 LPINPUTCONTEXTDX pIC;
1155 HWND hWnd;
1156
1157 if (Imm32IsCrossThreadAccess(hIMC))
1158 return FALSE;
1159
1160 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
1161 if (IS_NULL_UNEXPECTEDLY(pIC))
1162 return FALSE;
1163
1164 pIC->cfCompForm = *lpCompForm;
1165 pIC->fdwInit |= INIT_COMPFORM;
1166
1167 if (pIC->dwUIFlags & _IME_UI_NO_COMPFORM)
1168 pIC->dwUIFlags &= ~_IME_UI_NO_COMPFORM;
1169 else
1170 pIC->dwUIFlags &= ~_IME_UI_HIDDEN;
1171
1172 hWnd = pIC->hWnd;
1173
1174 ImmUnlockIMC(hIMC);
1175
1178 return TRUE;
1179}
#define _IME_UI_NO_COMPFORM
Definition: imm32_undoc.h:216
#define IMC_SETCOMPOSITIONWINDOW
Definition: imm.h:153
#define IMN_SETCOMPOSITIONWINDOW
Definition: imm.h:382
BOOL Imm32IsCrossThreadAccess(HIMC hIMC)
Definition: utils.c:25

Referenced by ActiveIMMApp_SetCompositionWindow(), ImeWnd_OnImeControl(), ImeWnd_OnImeSetContext(), ImeWnd_OnImeSystem(), ImmGetContextThreadFunc(), test_ImmThreads(), test_InvalidIMC(), and update_caret().

◆ ImmSetConversionStatus()

BOOL WINAPI ImmSetConversionStatus ( _In_ HIMC  hIMC,
_In_ DWORD  fdwConversion,
_In_ DWORD  fdwSentence 
)

Definition at line 1535 of file ime.c.

1539{
1540 HKL hKL;
1541 LPINPUTCONTEXT pIC;
1542 DWORD dwOldConversion = fdwConversion, dwOldSentence = fdwSentence;
1543 BOOL fOpen = FALSE, fConversionChange = FALSE, fSentenceChange = FALSE, fUseCicero = FALSE;
1544 HWND hWnd;
1545
1546 TRACE("(%p, 0x%lX, 0x%lX)\n", hIMC, fdwConversion, fdwSentence);
1547
1548 hKL = GetKeyboardLayout(0);
1550 fUseCicero = TRUE;
1551
1552 if (IS_CROSS_THREAD_HIMC(hIMC))
1553 return FALSE;
1554
1555 pIC = ImmLockIMC(hIMC);
1556 if (IS_NULL_UNEXPECTEDLY(pIC))
1557 return FALSE;
1558
1559 if (pIC->fdwConversion != fdwConversion)
1560 {
1561 dwOldConversion = pIC->fdwConversion;
1562 pIC->fdwConversion = fdwConversion;
1563 fConversionChange = TRUE;
1564 }
1565
1566 if (pIC->fdwSentence != fdwSentence)
1567 {
1568 dwOldSentence = pIC->fdwSentence;
1569 pIC->fdwSentence = fdwSentence;
1570 fSentenceChange = TRUE;
1571 }
1572
1573 hWnd = pIC->hWnd;
1574 fOpen = pIC->fOpen;
1575 ImmUnlockIMC(hIMC);
1576
1577 if (fConversionChange || fUseCicero)
1578 {
1579 Imm32MakeIMENotify(hIMC, hWnd, NI_CONTEXTUPDATED, dwOldConversion,
1581 if (fConversionChange)
1582 NtUserNotifyIMEStatus(hWnd, fOpen, fdwConversion);
1583 }
1584
1585 if (fSentenceChange || fUseCicero)
1586 {
1587 Imm32MakeIMENotify(hIMC, hWnd, NI_CONTEXTUPDATED, dwOldSentence,
1589 }
1590
1591 return TRUE;
1592}
#define IMN_SETSENTENCEMODE
Definition: imm.h:378
#define IMN_SETCONVERSIONMODE
Definition: imm.h:377
#define IMC_SETCONVERSIONMODE
Definition: immdev.h:352
#define IMC_SETSENTENCEMODE
Definition: immdev.h:353
DWORD NTAPI NtUserNotifyIMEStatus(_In_ HWND hwnd, _In_ BOOL fOpen, _In_ DWORD dwConversion)
Definition: ime.c:850

Referenced by ActiveIMMApp_SetConversionStatus(), ImeWnd_OnImeControl(), ImeWnd_SwitchSoftKbdProc(), Imm32CShapeToggle(), Imm32CSymbolToggle(), Imm32KEnglish(), Imm32KHanjaConvert(), Imm32KShapeToggle(), IntSetImeState(), OnTimer(), test_ImmThreads(), and test_InvalidIMC().

◆ ImmSetOpenStatus()

BOOL WINAPI ImmSetOpenStatus ( _In_ HIMC  hIMC,
_In_ BOOL  fOpen 
)

Definition at line 1021 of file ime.c.

1024{
1025 DWORD dwConversion;
1026 LPINPUTCONTEXT pIC;
1027 HWND hWnd;
1028 BOOL bHasChange = FALSE;
1029
1030 TRACE("(%p, %d)\n", hIMC, fOpen);
1031
1032 if (IS_CROSS_THREAD_HIMC(hIMC))
1033 return FALSE;
1034
1035 pIC = ImmLockIMC(hIMC);
1036 if (IS_NULL_UNEXPECTEDLY(pIC))
1037 return FALSE;
1038
1039 if (pIC->fOpen != fOpen)
1040 {
1041 pIC->fOpen = fOpen;
1042 hWnd = pIC->hWnd;
1043 dwConversion = pIC->fdwConversion;
1044 bHasChange = TRUE;
1045 }
1046
1047 ImmUnlockIMC(hIMC);
1048
1049 if (bHasChange)
1050 {
1053 NtUserNotifyIMEStatus(hWnd, fOpen, dwConversion);
1054 }
1055 else
1056 {
1057 TRACE("No change.\n");
1058 }
1059
1060 return TRUE;
1061}
#define IMN_SETOPENSTATUS
Definition: imm.h:379
#define IMC_SETOPENSTATUS
Definition: immdev.h:354

Referenced by ActiveIMMApp_SetOpenStatus(), ImeWnd_OnImeControl(), ImeWnd_OnImeSystem(), Imm32CImeNonImeToggle(), Imm32CShapeToggle(), Imm32CSymbolToggle(), Imm32JCloseOpen(), Imm32KEnglish(), Imm32KShapeToggle(), ImmGetContextThreadFunc(), IntFreeConsoleEntries(), IntSetImeState(), OnTimer(), Test1(), test_ime_processkey(), test_ImmDefaultHwnd(), test_ImmMessages(), test_ImmThreads(), and test_InvalidIMC().

◆ ImmSetStatusWindowPos()

BOOL WINAPI ImmSetStatusWindowPos ( _In_ HIMC  hIMC,
_In_ LPPOINT  lpptPos 
)

Definition at line 1092 of file ime.c.

1095{
1096 LPINPUTCONTEXT pIC;
1097 HWND hWnd;
1098
1099 TRACE("(%p, {%ld, %ld})\n", hIMC, lpptPos->x, lpptPos->y);
1100
1101 if (IS_CROSS_THREAD_HIMC(hIMC))
1102 return FALSE;
1103
1104 pIC = ImmLockIMC(hIMC);
1105 if (IS_NULL_UNEXPECTEDLY(pIC))
1106 return FALSE;
1107
1108 hWnd = pIC->hWnd;
1109 pIC->ptStatusWndPos = *lpptPos;
1110 pIC->fdwInit |= INIT_STATUSWNDPOS;
1111
1112 ImmUnlockIMC(hIMC);
1113
1116 return TRUE;
1117}
#define IMN_SETSTATUSWINDOWPOS
Definition: imm.h:383
#define IMC_SETSTATUSWINDOWPOS
Definition: imm.h:155

Referenced by ActiveIMMApp_SetStatusWindowPos(), ImeWnd_OnImeControl(), ImmGetContextThreadFunc(), test_ImmThreads(), and test_InvalidIMC().

◆ ImmUnlockImeDpi()

VOID WINAPI ImmUnlockImeDpi ( _Inout_opt_ PIMEDPI  pImeDpi)

Definition at line 562 of file ime.c.

564{
565 PIMEDPI *ppEntry;
566
567 TRACE("(%p)\n", pImeDpi);
568
569 if (pImeDpi == NULL)
570 return;
571
573
574 /* unlock */
575 --(pImeDpi->cLockObj);
576 if (pImeDpi->cLockObj != 0)
577 {
579 return;
580 }
581
582 if ((pImeDpi->dwFlags & IMEDPI_FLAG_UNLOADED) == 0)
583 {
584 if ((pImeDpi->dwFlags & IMEDPI_FLAG_LOCKED) == 0 ||
585 (pImeDpi->ImeInfo.fdwProperty & IME_PROP_END_UNLOAD) == 0)
586 {
588 return;
589 }
590 }
591
592 /* Remove from list */
593 for (ppEntry = &gpImeDpiList; *ppEntry; ppEntry = &((*ppEntry)->pNext))
594 {
595 if (*ppEntry == pImeDpi) /* found */
596 {
597 *ppEntry = pImeDpi->pNext;
598 break;
599 }
600 }
601
602 Imm32FreeIME(pImeDpi, TRUE);
603 ImmLocalFree(pImeDpi);
604
606}

Referenced by CtfImmGetGuidAtom(), CtfImmIsGuidMapEnable(), Imm32CreateInputContext(), Imm32DestroyInputContext(), Imm32MakeIMENotify(), Imm32ProcessHotKey(), Imm32SelectInputContext(), ImmActivateLayout(), ImmCallImeConsoleIME(), ImmConfigureIMEA(), ImmConfigureIMEW(), ImmCreateSoftKeyboard(), ImmEnumRegisterWordA(), ImmEnumRegisterWordW(), ImmEscapeA(), ImmEscapeW(), ImmGetConversionListA(), ImmGetConversionListW(), ImmGetImeMenuItemsAW(), ImmGetProperty(), ImmGetRegisterWordStyleA(), ImmGetRegisterWordStyleW(), ImmNotifyIME(), ImmProcessKey(), ImmRegisterWordA(), ImmRegisterWordW(), ImmSetActiveContext(), ImmSetCompositionStringAW(), ImmTranslateMessage(), ImmUnregisterWordA(), ImmUnregisterWordW(), and User32CreateImeUIWindow().

◆ ImmWINNLSEnableIME()

BOOL WINAPI ImmWINNLSEnableIME ( _In_opt_ HWND  hWnd,
_In_ BOOL  enable 
)

Definition at line 1718 of file ime.c.

1721{
1722 HIMC hIMC;
1723 PCLIENTIMC pClientImc;
1724 HWND hImeWnd;
1725 BOOL bImeWnd, ret;
1726
1727 TRACE("(%p, %d)\n", hWnd, enable);
1728
1730 {
1732 return FALSE;
1733 }
1734
1736 if (IS_NULL_UNEXPECTEDLY(hIMC))
1737 return FALSE;
1738
1739 pClientImc = ImmLockClientImc(hIMC);
1740 if (IS_NULL_UNEXPECTEDLY(pClientImc))
1741 return FALSE;
1742
1743 ret = !(pClientImc->dwFlags & CLIENTIMC_DISABLEIME);
1744 if (!!enable == ret)
1745 {
1746 TRACE("Same\n");
1747 ImmUnlockClientImc(pClientImc);
1748 return ret;
1749 }
1750
1751 if (!IsWindow(hWnd))
1752 hWnd = GetFocus();
1753
1754 hImeWnd = ImmGetDefaultIMEWnd(hWnd);
1755 bImeWnd = IsWindow(hImeWnd);
1756 if (bImeWnd)
1758
1759 if (enable)
1760 pClientImc->dwFlags &= ~CLIENTIMC_DISABLEIME;
1761 else
1762 pClientImc->dwFlags |= CLIENTIMC_DISABLEIME;
1763
1764 ImmUnlockClientImc(pClientImc);
1765
1766 if (bImeWnd)
1767 ImmSetActiveContext(hWnd, (enable ? hIMC : NULL), TRUE);
1768
1769 return ret;
1770}
DWORD HIMC
Definition: dimm.idl:75
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define SetLastError(x)
Definition: compat.h:752
GLboolean enable
Definition: glext.h:11120
HWND WINAPI ImmGetDefaultIMEWnd(_In_opt_ HWND hWnd)
Definition: ime.c:441
#define CLIENTIMC_DISABLEIME
Definition: imm32_undoc.h:186
BOOL WINAPI ImmSetActiveContext(_In_ HWND hwnd, _In_opt_ HIMC hIMC, _In_ BOOL fFlag)
Definition: imm.c:1165
@ THREADSTATE_DEFAULTINPUTCONTEXT
Definition: ntuser.h:2493
BOOL Imm32IsSystemJapaneseOrKorean(VOID)
Definition: utils.c:72
HWND WINAPI GetFocus(void)
Definition: window.c:1863
BOOL WINAPI IsWindow(_In_opt_ HWND)

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

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( imm  )

Variable Documentation

◆ gcsImeDpi

◆ gpImeDpiList

PIMEDPI gpImeDpiList = NULL