ReactOS 0.4.15-dev-6068-g8061a6f
keymsg.c File Reference
#include "precomp.h"
#include <jpnvkeys.h>
Include dependency graph for keymsg.c:

Go to the source code of this file.

Classes

struct  IMM_DELAY_SET_LANG_BAND
 

Macros

#define MSG_COUNT   0x100
 

Typedefs

typedef struct IMM_DELAY_SET_LANG_BAND IMM_DELAY_SET_LANG_BAND
 
typedef struct IMM_DELAY_SET_LANG_BANDPIMM_DELAY_SET_LANG_BAND
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (imm)
 
BOOL APIENTRY Imm32ImeNonImeToggle (HIMC hIMC, HKL hKL, HWND hWnd, BOOL bNowIME, LANGID LangID)
 
BOOL APIENTRY Imm32CImeNonImeToggle (HIMC hIMC, HKL hKL, HWND hWnd, LANGID LangID)
 
BOOL APIENTRY Imm32CShapeToggle (HIMC hIMC, HKL hKL, HWND hWnd)
 
BOOL APIENTRY Imm32CSymbolToggle (HIMC hIMC, HKL hKL, HWND hWnd)
 
BOOL APIENTRY Imm32JCloseOpen (HIMC hIMC, HKL hKL, HWND hWnd)
 
BOOL APIENTRY Imm32KShapeToggle (HIMC hIMC)
 
BOOL APIENTRY Imm32KHanjaConvert (HIMC hIMC)
 
BOOL APIENTRY Imm32KEnglish (HIMC hIMC)
 
BOOL APIENTRY Imm32ProcessHotKey (HWND hWnd, HIMC hIMC, HKL hKL, DWORD dwHotKeyID)
 
static BOOL APIENTRY ImmIsUIMessageAW (HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam, BOOL bAnsi)
 
static DWORD APIENTRY Imm32DelaySetLangBandProc (LPVOID arg)
 
LRESULT APIENTRY CtfImmSetLangBand (HWND hWnd, BOOL fSet)
 
static BOOL CALLBACK Imm32SendNotificationProc (HIMC hIMC, LPARAM lParam)
 
BOOL APIENTRY Imm32SendNotification (BOOL bProcess)
 
LRESULT APIENTRY Imm32ProcessRequest (HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bAnsiAPI)
 
LRESULT APIENTRY ImmRequestMessageAW (HIMC hIMC, WPARAM wParam, LPARAM lParam, BOOL bAnsi)
 
BOOL WINAPI ImmIsUIMessageA (HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
 
BOOL WINAPI ImmIsUIMessageW (HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
 
BOOL WINAPI ImmGetHotKey (IN DWORD dwHotKey, OUT LPUINT lpuModifiers, OUT LPUINT lpuVKey, OUT LPHKL lphKL)
 
UINT WINAPI ImmWINNLSGetIMEHotkey (HWND hwndIme)
 
BOOL WINAPI ImmSimulateHotKey (HWND hWnd, DWORD dwHotKeyID)
 
UINT WINAPI ImmGetVirtualKey (HWND hWnd)
 
DWORD WINAPI ImmGetAppCompatFlags (HIMC hIMC)
 
DWORD WINAPI ImmProcessKey (HWND hWnd, HKL hKL, UINT vKey, LPARAM lParam, DWORD dwHotKeyID)
 
LRESULT WINAPI ImmSystemHandler (HIMC hIMC, WPARAM wParam, LPARAM lParam)
 
BOOL WINAPI ImmGenerateMessage (HIMC hIMC)
 
VOID APIENTRY ImmPostMessages (HWND hwnd, HIMC hIMC, DWORD dwCount, LPTRANSMSG lpTransMsg)
 
BOOL WINAPI ImmTranslateMessage (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lKeyData)
 
LRESULT WINAPI ImmRequestMessageA (HIMC hIMC, WPARAM wParam, LPARAM lParam)
 
LRESULT WINAPI ImmRequestMessageW (HIMC hIMC, WPARAM wParam, LPARAM lParam)
 
LRESULT WINAPI ImmSendMessageToActiveDefImeWndW (UINT uMsg, WPARAM wParam, LPARAM lParam)
 
DWORD WINAPI ImmCallImeConsoleIME (_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam, _Out_ LPUINT puVK)
 

Macro Definition Documentation

◆ MSG_COUNT

#define MSG_COUNT   0x100

Typedef Documentation

◆ IMM_DELAY_SET_LANG_BAND

◆ PIMM_DELAY_SET_LANG_BAND

Function Documentation

◆ CtfImmSetLangBand()

LRESULT APIENTRY CtfImmSetLangBand ( HWND  hWnd,
BOOL  fSet 
)

Definition at line 364 of file keymsg.c.

365{
367 PWND pWnd = NULL;
369 DWORD_PTR lResult = 0;
370
371 if (hWnd && gpsi)
372 pWnd = ValidateHwndNoErr(hWnd);
373
374 if (IS_NULL_UNEXPECTEDLY(pWnd))
375 return 0;
376
378 {
380 5000, &lResult);
381 return lResult;
382 }
383
384 pSetBand = ImmLocalAlloc(0, sizeof(IMM_DELAY_SET_LANG_BAND));
385 if (IS_NULL_UNEXPECTEDLY(pSetBand))
386 return 0;
387
388 pSetBand->hWnd = hWnd;
389 pSetBand->fSet = fSet;
390
392 if (hThread)
394 return 0;
395}
HWND hWnd
Definition: settings.c:17
#define NULL
Definition: types.h:112
#define CloseHandle
Definition: compat.h:739
PSERVERINFO gpsi
Definition: imm.c:18
LPVOID APIENTRY ImmLocalAlloc(DWORD dwFlags, DWORD dwBytes)
Definition: utils.c:415
#define ValidateHwndNoErr(hwnd)
Definition: precomp.h:84
#define IS_NULL_UNEXPECTEDLY(p)
Definition: precomp.h:120
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
#define WNDS2_WMCREATEMSGPROCESSED
Definition: ntuser.h:665
static DWORD APIENTRY Imm32DelaySetLangBandProc(LPVOID arg)
Definition: keymsg.c:342
HANDLE hThread
Definition: wizard.c:28
Definition: ntuser.h:689
DWORD state2
Definition: ntuser.h:697
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define SMTO_BLOCK
Definition: winuser.h:1214
LRESULT WINAPI SendMessageTimeoutW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM, _In_ UINT, _In_ UINT, _Out_opt_ PDWORD_PTR)
#define SMTO_ABORTIFHUNG
Definition: winuser.h:1213
#define WM_USER
Definition: winuser.h:1885

Referenced by ImmSystemHandler().

◆ Imm32CImeNonImeToggle()

BOOL APIENTRY Imm32CImeNonImeToggle ( HIMC  hIMC,
HKL  hKL,
HWND  hWnd,
LANGID  LangID 
)

Definition at line 68 of file keymsg.c.

69{
71 BOOL fOpen;
72
74 return FALSE;
75
76 if (LOWORD(hKL) != LangID || !ImmIsIME(hKL))
77 {
79 return TRUE;
80 }
81
82 pIC = ImmLockIMC(hIMC);
83 if (IS_NULL_UNEXPECTEDLY(pIC))
84 return TRUE;
85
86 fOpen = pIC->fOpen;
87 ImmUnlockIMC(hIMC);
88
89 if (fOpen)
90 Imm32ImeNonImeToggle(hIMC, hKL, hWnd, TRUE, 0);
91 else
93
94 return TRUE;
95}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOL WINAPI ImmIsIME(HKL hKL)
Definition: ime.c:880
BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
Definition: ime.c:1475
BOOL WINAPI ImmUnlockIMC(HIMC hIMC)
Definition: imm.c:1079
LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC hIMC)
Definition: imm.c:1070
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL APIENTRY Imm32ImeNonImeToggle(HIMC hIMC, HKL hKL, HWND hWnd, BOOL bNowIME, LANGID LangID)
Definition: keymsg.c:18
#define LOWORD(l)
Definition: pedump.c:82
_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

Referenced by Imm32ProcessHotKey().

◆ Imm32CShapeToggle()

BOOL APIENTRY Imm32CShapeToggle ( HIMC  hIMC,
HKL  hKL,
HWND  hWnd 
)

Definition at line 99 of file keymsg.c.

100{
101 LPINPUTCONTEXT pIC;
102 BOOL fOpen;
103 DWORD dwConversion, dwSentence;
104
105 if (hWnd == NULL || !ImmIsIME(hKL))
106 return FALSE;
107
108 pIC = ImmLockIMC(hIMC);
109 if (IS_NULL_UNEXPECTEDLY(pIC))
110 return TRUE;
111
112 fOpen = pIC->fOpen;
113 if (fOpen)
114 {
115 dwConversion = (pIC->fdwConversion ^ IME_CMODE_FULLSHAPE);
116 dwSentence = pIC->fdwSentence;
117 }
118
119 ImmUnlockIMC(hIMC);
120
121 if (fOpen)
122 ImmSetConversionStatus(hIMC, dwConversion, dwSentence);
123 else
124 ImmSetOpenStatus(hIMC, TRUE);
125
126 return TRUE;
127}
BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence)
Definition: ime.c:1950
unsigned long DWORD
Definition: ntddk_ex.h:95
#define IME_CMODE_FULLSHAPE
Definition: imm.h:493
DWORD fdwConversion
Definition: immdev.h:60
DWORD fdwSentence
Definition: immdev.h:61

Referenced by Imm32ProcessHotKey().

◆ Imm32CSymbolToggle()

BOOL APIENTRY Imm32CSymbolToggle ( HIMC  hIMC,
HKL  hKL,
HWND  hWnd 
)

Definition at line 130 of file keymsg.c.

131{
132 LPINPUTCONTEXT pIC;
133 BOOL fOpen;
134 DWORD dwConversion, dwSentence;
135
136 if (hWnd == NULL || !ImmIsIME(hKL))
137 return FALSE;
138
139 pIC = ImmLockIMC(hIMC);
140 if (IS_NULL_UNEXPECTEDLY(pIC))
141 return TRUE;
142
143 fOpen = pIC->fOpen;
144 if (fOpen)
145 {
146 dwConversion = (pIC->fdwConversion ^ IME_CMODE_SYMBOL);
147 dwSentence = pIC->fdwSentence;
148 }
149
150 ImmUnlockIMC(hIMC);
151
152 if (fOpen)
153 ImmSetConversionStatus(hIMC, dwConversion, dwSentence);
154 else
155 ImmSetOpenStatus(hIMC, TRUE);
156
157 return TRUE;
158}
#define IME_CMODE_SYMBOL
Definition: imm.h:500

Referenced by Imm32ProcessHotKey().

◆ Imm32DelaySetLangBandProc()

static DWORD APIENTRY Imm32DelaySetLangBandProc ( LPVOID  arg)
static

Definition at line 342 of file keymsg.c.

343{
344 HWND hwndDefIME;
346 DWORD_PTR lResult;
347 PIMM_DELAY_SET_LANG_BAND pSetBand = arg;
348
349 Sleep(3000); /* Delay 3 seconds! */
350
351 hwndDefIME = ImmGetDefaultIMEWnd(pSetBand->hWnd);
352 if (hwndDefIME)
353 {
355 SendMessageTimeoutW(hwndDefIME, WM_IME_SYSTEM, wParam, (LPARAM)pSetBand->hWnd,
356 SMTO_BLOCK | SMTO_ABORTIFHUNG, 5000, &lResult);
357 }
358 ImmLocalFree(pSetBand);
359 return FALSE;
360}
WPARAM wParam
Definition: combotst.c:138
HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd)
Definition: ime.c:890
#define ImmLocalFree(lpData)
Definition: precomp.h:89
#define IMS_SETLANGBAND
Definition: immdev.h:46
#define IMS_UNSETLANGBAND
Definition: immdev.h:47
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
#define WM_IME_SYSTEM
Definition: undocuser.h:60
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
void * arg
Definition: msvc.h:10

Referenced by CtfImmSetLangBand().

◆ Imm32ImeNonImeToggle()

BOOL APIENTRY Imm32ImeNonImeToggle ( HIMC  hIMC,
HKL  hKL,
HWND  hWnd,
BOOL  bNowIME,
LANGID  LangID 
)

Definition at line 18 of file keymsg.c.

19{
20 HKL hOldKL, LayoutList[32], hFoundKL = NULL;
21 UINT iLayout, nLayoutCount;
22
23 /* Get the previous layout */
25
26 /* Get the layout list */
27 nLayoutCount = GetKeyboardLayoutList(_countof(LayoutList), LayoutList);
28
29 /* Is there hOldKL in the list in the specified language ID? */
30 if (hOldKL && (LangID == 0 || LOWORD(hOldKL) == LangID))
31 {
32 for (iLayout = 0; iLayout < nLayoutCount; ++iLayout)
33 {
34 if (LayoutList[iLayout] == hOldKL)
35 {
36 hFoundKL = hOldKL;
37 break;
38 }
39 }
40 }
41
42 if (hFoundKL == NULL) /* Not found? */
43 {
44 /* Is there the keyboard layout of another kind in LangID? */
45 for (iLayout = 0; iLayout < nLayoutCount; ++iLayout)
46 {
47 if (bNowIME == ImmIsIME(LayoutList[iLayout])) /* Same kind? */
48 continue;
49
50 if (LangID == 0 || LangID == LOWORD(LayoutList[iLayout]))
51 {
52 hFoundKL = LayoutList[iLayout];
53 break;
54 }
55 }
56 }
57
58 if (hFoundKL && hKL != hFoundKL) /* Found and different layout */
59 {
60 PostMessageW(hWnd, WM_INPUTLANGCHANGEREQUEST, 1, (LPARAM)hFoundKL);
61 }
62
63 return ImmIsIME(hFoundKL);
64}
@ THREADSTATE_OLDKEYBOARDLAYOUT
Definition: ntuser.h:2609
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
Definition: misc.c:232
UINT_PTR HKL
Definition: msctf.idl:104
unsigned int UINT
Definition: ndis.h:50
#define _countof(array)
Definition: sndvol32.h:68
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
UINT WINAPI GetKeyboardLayoutList(_In_ int nBuff, _Out_writes_to_opt_(nBuff, return) HKL FAR *lpList)

Referenced by Imm32CImeNonImeToggle(), and Imm32JCloseOpen().

◆ Imm32JCloseOpen()

BOOL APIENTRY Imm32JCloseOpen ( HIMC  hIMC,
HKL  hKL,
HWND  hWnd 
)

Definition at line 162 of file keymsg.c.

163{
164 BOOL fOpen;
166
167 if (LOWORD(hKL) == LANGID_JAPANESE && ImmIsIME(hKL)) /* Japanese IME is selected */
168 {
169 fOpen = ImmGetOpenStatus(hIMC);
170 ImmSetOpenStatus(hIMC, !fOpen);
171 return TRUE;
172 }
173
174 /* Japanese IME is not selected. Select now */
176 {
177 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
178 if (pIC)
179 {
180 pIC->dwChange |= INPUTCONTEXTDX_CHANGE_OPEN; /* Notify open change */
181 ImmUnlockIMC(hIMC);
182 }
183 }
184
185 return TRUE;
186}
BOOL WINAPI ImmGetOpenStatus(HIMC hIMC)
Definition: ime.c:1452
#define LANGID_JAPANESE
Definition: precomp.h:58
#define INPUTCONTEXTDX_CHANGE_OPEN
Definition: immdev.h:157
struct INPUTCONTEXTDX * LPINPUTCONTEXTDX
DWORD dwChange
Definition: immdev.h:135

Referenced by Imm32ProcessHotKey().

◆ Imm32KEnglish()

BOOL APIENTRY Imm32KEnglish ( HIMC  hIMC)

Definition at line 230 of file keymsg.c.

231{
232 LPINPUTCONTEXT pIC;
233 DWORD dwConversion, dwSentence;
234 BOOL fOpen;
235
236 pIC = ImmLockIMC(hIMC);
237 if (IS_NULL_UNEXPECTEDLY(pIC))
238 return FALSE;
239
240 dwConversion = (pIC->fdwConversion ^ IME_CMODE_NATIVE);
241 dwSentence = pIC->fdwSentence;
242 ImmSetConversionStatus(hIMC, dwConversion, dwSentence);
243
244 fOpen = ((pIC->fdwConversion & (IME_CMODE_FULLSHAPE | IME_CMODE_NATIVE)) != 0);
245 ImmSetOpenStatus(hIMC, fOpen);
246
247 ImmUnlockIMC(hIMC);
248 return TRUE;
249}
#define IME_CMODE_NATIVE
Definition: imm.h:485

Referenced by Imm32ProcessHotKey().

◆ Imm32KHanjaConvert()

BOOL APIENTRY Imm32KHanjaConvert ( HIMC  hIMC)

Definition at line 212 of file keymsg.c.

213{
214 LPINPUTCONTEXT pIC;
215 DWORD dwConversion, dwSentence;
216
217 pIC = ImmLockIMC(hIMC);
218 if (IS_NULL_UNEXPECTEDLY(pIC))
219 return FALSE;
220
221 dwConversion = (pIC->fdwConversion ^ IME_CMODE_HANJACONVERT);
222 dwSentence = pIC->fdwSentence;
223 ImmUnlockIMC(hIMC);
224
225 ImmSetConversionStatus(hIMC, dwConversion, dwSentence);
226 return TRUE;
227}
#define IME_CMODE_HANJACONVERT
Definition: imm.h:496

Referenced by Imm32ProcessHotKey().

◆ Imm32KShapeToggle()

BOOL APIENTRY Imm32KShapeToggle ( HIMC  hIMC)

Definition at line 189 of file keymsg.c.

190{
191 LPINPUTCONTEXT pIC;
192 DWORD dwConversion, dwSentence;
193
194 pIC = ImmLockIMC(hIMC);
195 if (IS_NULL_UNEXPECTEDLY(pIC))
196 return FALSE;
197
198 dwConversion = (pIC->fdwConversion ^ IME_CMODE_FULLSHAPE);
199 dwSentence = pIC->fdwSentence;
200 ImmSetConversionStatus(hIMC, dwConversion, dwSentence);
201
203 ImmSetOpenStatus(hIMC, TRUE);
204 else
205 ImmSetOpenStatus(hIMC, FALSE);
206
207 ImmUnlockIMC(hIMC);
208 return TRUE;
209}

Referenced by Imm32ProcessHotKey().

◆ Imm32ProcessHotKey()

BOOL APIENTRY Imm32ProcessHotKey ( HWND  hWnd,
HIMC  hIMC,
HKL  hKL,
DWORD  dwHotKeyID 
)

Definition at line 252 of file keymsg.c.

253{
254 PIMEDPI pImeDpi;
255 BOOL ret;
256
257 if (hIMC && IS_CROSS_THREAD_HIMC(hIMC))
258 return FALSE;
259
260 switch (dwHotKeyID)
261 {
264
266 return Imm32CShapeToggle(hIMC, hKL, hWnd);
267
269 return Imm32CSymbolToggle(hIMC, hKL, hWnd);
270
272 return Imm32JCloseOpen(hIMC, hKL, hWnd);
273
275 return Imm32KShapeToggle(hIMC);
276
278 return Imm32KHanjaConvert(hIMC);
279
281 return Imm32KEnglish(hIMC);
282
285
287 return Imm32CShapeToggle(hIMC, hKL, hWnd);
288
290 return Imm32CSymbolToggle(hIMC, hKL, hWnd);
291
292 default:
293 WARN("0x%X\n", dwHotKeyID);
294 break;
295 }
296
297 if (dwHotKeyID < IME_HOTKEY_PRIVATE_FIRST || IME_HOTKEY_PRIVATE_LAST < dwHotKeyID)
298 return FALSE;
299
300 pImeDpi = ImmLockImeDpi(hKL);
301 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
302 return FALSE;
303
304 ret = (BOOL)pImeDpi->ImeEscape(hIMC, IME_ESC_PRIVATE_HOTKEY, &dwHotKeyID);
305 ImmUnlockImeDpi(pImeDpi);
306 return ret;
307}
#define WARN(fmt,...)
Definition: debug.h:112
PIMEDPI WINAPI ImmLockImeDpi(HKL hKL)
Definition: ime.c:987
VOID WINAPI ImmUnlockImeDpi(PIMEDPI pImeDpi)
Definition: ime.c:1016
#define LANGID_CHINESE_SIMPLIFIED
Definition: precomp.h:56
#define IS_CROSS_THREAD_HIMC(hIMC)
Definition: precomp.h:143
#define LANGID_CHINESE_TRADITIONAL
Definition: precomp.h:57
#define IME_HOTKEY_PRIVATE_LAST
Definition: imm.h:357
#define IME_JHOTKEY_CLOSE_OPEN
Definition: imm.h:336
#define IME_KHOTKEY_HANJACONVERT
Definition: imm.h:340
#define IME_THOTKEY_IME_NONIME_TOGGLE
Definition: imm.h:343
#define IME_CHOTKEY_SYMBOL_TOGGLE
Definition: imm.h:333
#define IME_CHOTKEY_IME_NONIME_TOGGLE
Definition: imm.h:331
#define IME_ESC_PRIVATE_HOTKEY
Definition: imm.h:571
#define IME_KHOTKEY_SHAPE_TOGGLE
Definition: imm.h:339
#define IME_THOTKEY_SHAPE_TOGGLE
Definition: imm.h:344
#define IME_HOTKEY_PRIVATE_FIRST
Definition: imm.h:352
#define IME_KHOTKEY_ENGLISH
Definition: imm.h:341
#define IME_THOTKEY_SYMBOL_TOGGLE
Definition: imm.h:345
#define IME_CHOTKEY_SHAPE_TOGGLE
Definition: imm.h:332
BOOL APIENTRY Imm32JCloseOpen(HIMC hIMC, HKL hKL, HWND hWnd)
Definition: keymsg.c:162
BOOL APIENTRY Imm32CSymbolToggle(HIMC hIMC, HKL hKL, HWND hWnd)
Definition: keymsg.c:130
BOOL APIENTRY Imm32CShapeToggle(HIMC hIMC, HKL hKL, HWND hWnd)
Definition: keymsg.c:99
BOOL APIENTRY Imm32KEnglish(HIMC hIMC)
Definition: keymsg.c:230
BOOL APIENTRY Imm32KShapeToggle(HIMC hIMC)
Definition: keymsg.c:189
BOOL APIENTRY Imm32CImeNonImeToggle(HIMC hIMC, HKL hKL, HWND hWnd, LANGID LangID)
Definition: keymsg.c:68
BOOL APIENTRY Imm32KHanjaConvert(HIMC hIMC)
Definition: keymsg.c:212
#define BOOL
Definition: nt_native.h:43
int ret

Referenced by ImmProcessKey(), and ImmSimulateHotKey().

◆ Imm32ProcessRequest()

LRESULT APIENTRY Imm32ProcessRequest ( HIMC  hIMC,
PWND  pWnd,
DWORD  dwCommand,
LPVOID  pData,
BOOL  bAnsiAPI 
)

Definition at line 437 of file keymsg.c.

438{
439 HWND hWnd;
440 DWORD ret = 0, dwCharPos, cchCompStr, dwSize;
441 LPVOID pCS, pTempData = pData;
444 PCLIENTIMC pClientImc;
445 UINT uCodePage = CP_ACP;
446 BOOL bAnsiWnd = !!(pWnd->state & WNDS_ANSIWINDOWPROC);
447 static const size_t acbData[7 * 2] =
448 {
449 /* UNICODE */
450 sizeof(COMPOSITIONFORM), sizeof(CANDIDATEFORM), sizeof(LOGFONTW),
451 sizeof(RECONVERTSTRING), sizeof(RECONVERTSTRING),
452 sizeof(IMECHARPOSITION), sizeof(RECONVERTSTRING),
453 /* ANSI */
454 sizeof(COMPOSITIONFORM), sizeof(CANDIDATEFORM), sizeof(LOGFONTA),
455 sizeof(RECONVERTSTRING), sizeof(RECONVERTSTRING),
456 sizeof(IMECHARPOSITION), sizeof(RECONVERTSTRING),
457 };
458
459 if (dwCommand == 0 || dwCommand > IMR_DOCUMENTFEED)
460 {
461 ERR("Out of boundary\n");
462 return 0; /* Out of range */
463 }
464
465 dwSize = acbData[bAnsiAPI * 7 + dwCommand - 1];
467 {
468 ERR("\n");
469 return 0; /* Invalid pointer */
470 }
471
472 /* Sanity check */
473 switch (dwCommand)
474 {
476 pRS = pData;
477 if (pRS && (pRS->dwVersion != 0 || pRS->dwSize < sizeof(RECONVERTSTRING)))
478 {
479 ERR("Invalid pRS\n");
480 return 0;
481 }
482 break;
483
485 pRS = pData;
486 if (!pRS || pRS->dwVersion != 0)
487 {
488 ERR("Invalid pRS\n");
489 return 0;
490 }
491 break;
492
493 default:
495 return 0;
496 break;
497 }
498
499 pClientImc = ImmLockClientImc(hIMC);
500 if (pClientImc)
501 {
502 uCodePage = pClientImc->uCodePage;
503 ImmUnlockClientImc(pClientImc);
504 }
505
506 /* Prepare */
507 switch (dwCommand)
508 {
510 if (bAnsiAPI == bAnsiWnd)
511 goto DoIt; /* No conversion needed */
512
513 if (bAnsiWnd)
514 pTempData = ImmLocalAlloc(0, sizeof(LOGFONTA));
515 else
516 pTempData = ImmLocalAlloc(0, sizeof(LOGFONTW));
517
518 if (IS_NULL_UNEXPECTEDLY(pTempData))
519 return 0;
520 break;
521
523 if (bAnsiAPI == bAnsiWnd || !pData)
524 goto DoIt; /* No conversion needed */
525
526 if (bAnsiWnd)
528 else
530
531 pTempData = ImmLocalAlloc(0, ret + sizeof(WCHAR));
532 if (IS_NULL_UNEXPECTEDLY(pTempData))
533 return 0;
534
535 pRS = pTempData;
536 pRS->dwSize = ret;
537 pRS->dwVersion = 0;
538
539 if (dwCommand == IMR_CONFIRMRECONVERTSTRING)
540 {
541 if (bAnsiWnd)
542 ret = Imm32ReconvertAnsiFromWide(pTempData, pData, uCodePage);
543 else
544 ret = Imm32ReconvertWideFromAnsi(pTempData, pData, uCodePage);
545 }
546 break;
547
549 if (bAnsiAPI == bAnsiWnd)
550 goto DoIt; /* No conversion needed */
551
552 pICP = pData;
553 dwCharPos = pICP->dwCharPos;
554
555 if (bAnsiAPI)
556 {
557 cchCompStr = ImmGetCompositionStringA(hIMC, GCS_COMPSTR, NULL, 0);
558 if (IS_ZERO_UNEXPECTEDLY(cchCompStr))
559 return 0;
560
561 pCS = ImmLocalAlloc(0, (cchCompStr + 1) * sizeof(CHAR));
562 if (IS_NULL_UNEXPECTEDLY(pCS))
563 return 0;
564
565 ImmGetCompositionStringA(hIMC, GCS_COMPSTR, pCS, cchCompStr);
566 pICP->dwCharPos = IchWideFromAnsi(pICP->dwCharPos, pCS, uCodePage);
567 }
568 else
569 {
570 cchCompStr = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, NULL, 0);
571 if (IS_ZERO_UNEXPECTEDLY(cchCompStr))
572 return 0;
573
574 pCS = ImmLocalAlloc(0, (cchCompStr + 1) * sizeof(WCHAR));
575 if (IS_NULL_UNEXPECTEDLY(pCS))
576 return 0;
577
578 ImmGetCompositionStringW(hIMC, GCS_COMPSTR, pCS, cchCompStr);
579 pICP->dwCharPos = IchAnsiFromWide(pICP->dwCharPos, pCS, uCodePage);
580 }
581
582 ImmLocalFree(pCS);
583 break;
584
585 default:
586 WARN("0x%X\n", dwCommand);
587 break;
588 }
589
590DoIt:
591 /* The main task */
592 hWnd = pWnd->head.h;
593 if (bAnsiWnd)
594 ret = SendMessageA(hWnd, WM_IME_REQUEST, dwCommand, (LPARAM)pTempData);
595 else
596 ret = SendMessageW(hWnd, WM_IME_REQUEST, dwCommand, (LPARAM)pTempData);
597
598 if (bAnsiAPI == bAnsiWnd)
599 goto Quit; /* No conversion needed */
600
601 /* Get back to caller */
602 switch (dwCommand)
603 {
605 if (bAnsiAPI)
606 LogFontWideToAnsi(pTempData, pData);
607 else
608 LogFontAnsiToWide(pTempData, pData);
609 break;
610
612 if (!ret)
613 break;
614
615 if (ret < sizeof(RECONVERTSTRING))
616 {
617 ret = 0;
618 break;
619 }
620
621 if (pTempData)
622 {
623 if (bAnsiWnd)
624 ret = Imm32ReconvertWideFromAnsi(pData, pTempData, uCodePage);
625 else
626 ret = Imm32ReconvertAnsiFromWide(pData, pTempData, uCodePage);
627 }
628 break;
629
631 pICP->dwCharPos = dwCharPos;
632 break;
633
634 default:
635 WARN("0x%X\n", dwCommand);
636 break;
637 }
638
639Quit:
640 if (pTempData != pData)
641 ImmLocalFree(pTempData);
642 return ret;
643}
#define ERR(fmt,...)
Definition: debug.h:110
LONG WINAPI ImmGetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
Definition: compstr.c:899
LONG WINAPI ImmGetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
Definition: compstr.c:856
#define CP_ACP
Definition: compat.h:109
VOID WINAPI ImmUnlockClientImc(PCLIENTIMC pClientImc)
Definition: imm.c:996
PCLIENTIMC WINAPI ImmLockClientImc(HIMC hImc)
Definition: imm.c:950
VOID APIENTRY LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW)
Definition: utils.c:299
#define IS_ZERO_UNEXPECTEDLY(p)
Definition: precomp.h:124
VOID APIENTRY LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA)
Definition: utils.c:312
LONG APIENTRY IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
Definition: utils.c:252
DWORD APIENTRY Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
Definition: utils.c:691
LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
Definition: utils.c:273
DWORD APIENTRY Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
Definition: utils.c:628
BOOL NTAPI IsBadWritePtr(IN LPVOID lp, IN UINT_PTR ucb)
Definition: except.c:881
#define IMR_DOCUMENTFEED
Definition: imm.h:544
struct tagRECONVERTSTRING RECONVERTSTRING
#define IMR_RECONVERTSTRING
Definition: imm.h:541
struct tagIMECHARPOSITION IMECHARPOSITION
#define GCS_COMPSTR
Definition: imm.h:367
#define IMR_CONFIRMRECONVERTSTRING
Definition: imm.h:542
#define IMR_QUERYCHARPOSITION
Definition: imm.h:543
#define IMR_COMPOSITIONFONT
Definition: imm.h:540
#define WNDS_ANSIWINDOWPROC
Definition: ntuser.h:619
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
THRDESKHEAD head
Definition: ntuser.h:690
DWORD state
Definition: ntuser.h:696
UINT uCodePage
Definition: ntuser.h:1339
DWORD dwCharPos
Definition: imm.h:141
DWORD dwSize
Definition: imm.h:97
DWORD dwVersion
Definition: imm.h:98
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
#define WM_IME_REQUEST
Definition: winuser.h:1826
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
__wchar_t WCHAR
Definition: xmlstorage.h:180
char CHAR
Definition: xmlstorage.h:175

Referenced by ImmRequestMessageAW().

◆ Imm32SendNotification()

BOOL APIENTRY Imm32SendNotification ( BOOL  bProcess)

Definition at line 431 of file keymsg.c.

432{
433 return ImmEnumInputContext((bProcess ? -1 : 0), Imm32SendNotificationProc, 0);
434}
BOOL WINAPI ImmEnumInputContext(DWORD dwThreadId, IMCENUMPROC lpfn, LPARAM lParam)
Definition: imm.c:1148
static BOOL CALLBACK Imm32SendNotificationProc(HIMC hIMC, LPARAM lParam)
Definition: keymsg.c:398

Referenced by ImmSystemHandler().

◆ Imm32SendNotificationProc()

static BOOL CALLBACK Imm32SendNotificationProc ( HIMC  hIMC,
LPARAM  lParam 
)
static

Definition at line 398 of file keymsg.c.

399{
400 HWND hWnd;
402
403 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
404 if (IS_NULL_UNEXPECTEDLY(pIC))
405 return TRUE;
406
407 hWnd = pIC->hWnd;
408 if (hWnd == NULL || !IsWindow(hWnd))
409 {
410 ERR("\n");
411 goto Quit;
412 }
413
414 TRACE("dwChange: 0x%08X\n", pIC->dwChange);
415
421 NtUserNotifyIMEStatus(hWnd, pIC->fOpen, pIC->fdwConversion);
424Quit:
425 pIC->dwChange = 0;
426 ImmUnlockIMC(hIMC); // ??? Windows doesn't unlock here
427 return TRUE;
428}
#define IMN_SETSENTENCEMODE
Definition: imm.h:527
#define IMN_SETOPENSTATUS
Definition: imm.h:528
#define IMN_SETCONVERSIONMODE
Definition: imm.h:526
#define INPUTCONTEXTDX_CHANGE_SENTENCE
Definition: immdev.h:159
#define INPUTCONTEXTDX_CHANGE_CONVERSION
Definition: immdev.h:158
DWORD NTAPI NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion)
Definition: ime.c:803
#define TRACE(s)
Definition: solgame.cpp:4
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_IME_NOTIFY
Definition: winuser.h:1820

Referenced by Imm32SendNotification().

◆ ImmCallImeConsoleIME()

DWORD WINAPI ImmCallImeConsoleIME ( _In_ HWND  hWnd,
_In_ UINT  uMsg,
_In_ WPARAM  wParam,
_In_ LPARAM  lParam,
_Out_ LPUINT  puVK 
)

Definition at line 1204 of file keymsg.c.

1210{
1211 DWORD dwThreadId, ret = 0;
1212 HKL hKL;
1213 PWND pWnd = NULL;
1214 HIMC hIMC;
1215 PIMEDPI pImeDpi;
1216 UINT uVK;
1217 PIMC pIMC;
1218
1219 switch (uMsg)
1220 {
1221 case WM_KEYDOWN:
1222 case WM_KEYUP:
1223 case WM_SYSKEYDOWN:
1224 case WM_SYSKEYUP:
1225 break;
1226
1227 default:
1228 return 0;
1229 }
1230
1233
1234 if (hWnd && gpsi)
1235 pWnd = ValidateHwndNoErr(hWnd);
1236 if (IS_NULL_UNEXPECTEDLY(pWnd))
1237 return 0;
1238
1239 hIMC = ImmGetContext(hWnd);
1240 if (IS_NULL_UNEXPECTEDLY(hIMC))
1241 return 0;
1242
1243 uVK = *puVK = (wParam & 0xFF);
1244
1246 if (IS_NULL_UNEXPECTEDLY(pIMC))
1247 return 0;
1248
1249 pImeDpi = ImmLockImeDpi(hKL);
1250 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1251 return 0;
1252
1254 goto Quit;
1255
1256 switch (uVK)
1257 {
1258 case VK_DBE_ROMAN:
1259 case VK_DBE_NOROMAN:
1260 case VK_DBE_HIRAGANA:
1261 case VK_DBE_KATAKANA:
1262 case VK_DBE_CODEINPUT:
1263 case VK_DBE_NOCODEINPUT:
1266 break;
1267
1268 default:
1269 {
1270 if (uMsg == WM_SYSKEYDOWN || uMsg == WM_SYSKEYUP)
1271 {
1272 if (uVK != VK_MENU && uVK != VK_F10)
1273 goto Quit;
1274 }
1275
1276 if (!(pImeDpi->ImeInfo.fdwProperty & IME_PROP_NEED_ALTKEY))
1277 {
1278 if (uVK == VK_MENU || (lParam & MAKELPARAM(0, KF_ALTDOWN)))
1279 goto Quit;
1280 }
1281 }
1282 }
1283
1285
1286Quit:
1287 ImmUnlockImeDpi(pImeDpi);
1288 return ret;
1289}
LPARAM lParam
Definition: combotst.c:139
DWORD HIMC
Definition: dimm.idl:75
HIMC WINAPI ImmGetContext(HWND hWnd)
Definition: imm.c:1057
LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
Definition: utils.c:338
#define INVALID_HOTKEY_ID
Definition: precomp.h:52
DWORD dwThreadId
Definition: fdebug.c:31
#define IME_PROP_NEED_ALTKEY
Definition: imm.h:216
#define IME_PROP_IGNORE_UPKEYS
Definition: imm.h:215
@ TYPE_INPUTCONTEXT
Definition: ntuser.h:57
#define VK_DBE_ROMAN
Definition: jpnvkeys.h:19
#define VK_DBE_HIRAGANA
Definition: jpnvkeys.h:16
#define VK_DBE_CODEINPUT
Definition: jpnvkeys.h:24
#define VK_DBE_NOROMAN
Definition: jpnvkeys.h:20
#define VK_DBE_KATAKANA
Definition: jpnvkeys.h:15
#define VK_DBE_ENTERCONFIGMODE
Definition: jpnvkeys.h:22
#define VK_DBE_ENTERWORDREGISTERMODE
Definition: jpnvkeys.h:21
#define VK_DBE_NOCODEINPUT
Definition: jpnvkeys.h:25
DWORD WINAPI ImmProcessKey(HWND hWnd, HKL hKL, UINT vKey, LPARAM lParam, DWORD dwHotKeyID)
Definition: keymsg.c:774
IMEINFO ImeInfo
Definition: ntuser.h:1284
DWORD fdwProperty
Definition: imm.h:158
Definition: ntuser.h:199
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
#define MAKELPARAM(l, h)
Definition: winuser.h:3998
#define WM_KEYUP
Definition: winuser.h:1706
#define VK_F10
Definition: winuser.h:2254
#define KF_ALTDOWN
Definition: winuser.h:2439
#define KF_UP
Definition: winuser.h:2441
#define WM_SYSKEYUP
Definition: winuser.h:1710
#define WM_KEYDOWN
Definition: winuser.h:1705
#define WM_SYSKEYDOWN
Definition: winuser.h:1709
#define VK_MENU
Definition: winuser.h:2194

◆ ImmGenerateMessage()

BOOL WINAPI ImmGenerateMessage ( HIMC  hIMC)

Definition at line 893 of file keymsg.c.

894{
895 PCLIENTIMC pClientImc;
896 LPINPUTCONTEXT pIC;
897 LPTRANSMSG pMsgs, pTrans = NULL, pItem;
898 HWND hWnd;
899 DWORD dwIndex, dwCount, cbTrans;
900 HIMCC hMsgBuf = NULL;
901 BOOL bAnsi;
902
903 TRACE("(%p)\n", hIMC);
904
905 if (IS_CROSS_THREAD_HIMC(hIMC))
906 return FALSE;
907
908 pClientImc = ImmLockClientImc(hIMC);
909 if (IS_NULL_UNEXPECTEDLY(pClientImc))
910 return FALSE;
911
912 bAnsi = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
913 ImmUnlockClientImc(pClientImc);
914
915 pIC = ImmLockIMC(hIMC);
916 if (IS_NULL_UNEXPECTEDLY(pIC))
917 return FALSE;
918
919 dwCount = pIC->dwNumMsgBuf;
920 if (dwCount == 0)
921 goto Quit;
922
923 hMsgBuf = pIC->hMsgBuf;
924 pMsgs = ImmLockIMCC(hMsgBuf);
925 if (IS_NULL_UNEXPECTEDLY(pMsgs))
926 goto Quit;
927
928 cbTrans = dwCount * sizeof(TRANSMSG);
929 pTrans = ImmLocalAlloc(0, cbTrans);
930 if (IS_NULL_UNEXPECTEDLY(pTrans))
931 goto Quit;
932
933 RtlCopyMemory(pTrans, pMsgs, cbTrans);
934
935#ifdef IMM_WIN3_SUPPORT
936 if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */
937 {
939 WORD wLang = PRIMARYLANGID(LangID);
940
941 /* translate the messages if Japanese or Korean */
942 if (wLang == LANG_JAPANESE ||
943 (wLang == LANG_KOREAN && NtUserGetAppImeLevel(pIC->hWnd) == 3))
944 {
945 dwCount = WINNLSTranslateMessage(dwCount, pTrans, hIMC, bAnsi, wLang);
946 }
947 }
948#endif
949
950 /* send them */
951 hWnd = pIC->hWnd;
952 pItem = pTrans;
953 for (dwIndex = 0; dwIndex < dwCount; ++dwIndex, ++pItem)
954 {
955 if (bAnsi)
956 SendMessageA(hWnd, pItem->message, pItem->wParam, pItem->lParam);
957 else
958 SendMessageW(hWnd, pItem->message, pItem->wParam, pItem->lParam);
959 }
960
961Quit:
962 ImmLocalFree(pTrans);
963 if (hMsgBuf)
964 ImmUnlockIMCC(hMsgBuf);
965 pIC->dwNumMsgBuf = 0; /* done */
966 ImmUnlockIMC(hIMC);
967 return TRUE;
968}
DWORD HIMCC
Definition: dimm.idl:76
BOOL WINAPI ImmUnlockIMCC(HIMCC imcc)
Definition: utils.c:1208
LPVOID WINAPI ImmLockIMCC(HIMCC imcc)
Definition: utils.c:1198
unsigned short WORD
Definition: ntddk_ex.h:93
struct _tagTRANSMSG TRANSMSG
DWORD NTAPI NtUserGetAppImeLevel(HWND hWnd)
Definition: ime.c:921
#define GetWin32ClientInfo()
Definition: ntuser.h:347
#define CLIENTIMC_WIDE
Definition: ntuser.h:1356
LCID WINAPI GetSystemDefaultLCID(void)
Definition: lang.c:791
#define LANGIDFROMLCID(l)
Definition: nls.h:18
#define LANG_JAPANESE
Definition: nls.h:76
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define LANG_KOREAN
Definition: nls.h:84
#define _WIN32_WINNT_NT4
Definition: sdkddkver.h:20
HIMCC hMsgBuf
Definition: immdev.h:73
DWORD dwNumMsgBuf
Definition: immdev.h:72
DWORD dwFlags
Definition: ntuser.h:1336
WORD LANGID
Definition: typedefs.h:81
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

Referenced by test_ImmMessages(), and test_InvalidIMC().

◆ ImmGetAppCompatFlags()

DWORD WINAPI ImmGetAppCompatFlags ( HIMC  hIMC)

Definition at line 755 of file keymsg.c.

756{
757 PCLIENTIMC pClientIMC;
759
760 pClientIMC = ImmLockClientImc(hIMC);
761 if (IS_NULL_UNEXPECTEDLY(pClientIMC))
762 return 0;
763
764 dwFlags = pClientIMC->dwCompatFlags;
765 ImmUnlockClientImc(pClientIMC);
766 return dwFlags;
767}
DWORD dwCompatFlags
Definition: ntuser.h:1337
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176

Referenced by ImmProcessKey().

◆ ImmGetHotKey()

BOOL WINAPI ImmGetHotKey ( IN DWORD  dwHotKey,
OUT LPUINT  lpuModifiers,
OUT LPUINT  lpuVKey,
OUT LPHKL  lphKL 
)

Definition at line 693 of file keymsg.c.

695{
696 TRACE("(0x%lX, %p, %p, %p)\n", dwHotKey, lpuModifiers, lpuVKey, lphKL);
697 if (lpuModifiers && lpuVKey)
698 return NtUserGetImeHotKey(dwHotKey, lpuModifiers, lpuVKey, lphKL);
699 return FALSE;
700}
BOOL NTAPI NtUserGetImeHotKey(DWORD dwHotKeyId, LPUINT lpuModifiers, LPUINT lpuVirtualKey, LPHKL lphKL)
Definition: ime.c:406

◆ ImmGetVirtualKey()

UINT WINAPI ImmGetVirtualKey ( HWND  hWnd)

Definition at line 735 of file keymsg.c.

736{
737 HIMC hIMC;
740
741 TRACE("(%p)\n", hWnd);
742
743 hIMC = ImmGetContext(hWnd);
744 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
745 if (IS_NULL_UNEXPECTEDLY(pIC))
746 return ret;
747
748 if (pIC->bNeedsTrans)
749 ret = pIC->nVKey;
750
751 ImmUnlockIMC(hIMC);
752 return ret;
753}
UINT nVKey
Definition: immdev.h:129
BOOL bNeedsTrans
Definition: immdev.h:130
#define VK_PROCESSKEY
Definition: winuser.h:2317

Referenced by ActiveIMMApp_GetVirtualKey().

◆ ImmIsUIMessageA()

BOOL WINAPI ImmIsUIMessageA ( HWND  hWndIME,
UINT  msg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 674 of file keymsg.c.

675{
676 TRACE("(%p, 0x%X, %p, %p)\n", hWndIME, msg, wParam, lParam);
677 return ImmIsUIMessageAW(hWndIME, msg, wParam, lParam, TRUE);
678}
#define msg(x)
Definition: auth_time.c:54
static BOOL APIENTRY ImmIsUIMessageAW(HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam, BOOL bAnsi)
Definition: keymsg.c:311

Referenced by ActiveIMMApp_IsUIMessageA(), and START_TEST().

◆ ImmIsUIMessageAW()

static BOOL APIENTRY ImmIsUIMessageAW ( HWND  hWndIME,
UINT  msg,
WPARAM  wParam,
LPARAM  lParam,
BOOL  bAnsi 
)
static

Definition at line 311 of file keymsg.c.

312{
313 switch (msg)
314 {
315 case WM_IME_STARTCOMPOSITION: case WM_IME_ENDCOMPOSITION:
316 case WM_IME_COMPOSITION: case WM_IME_SETCONTEXT: case WM_IME_NOTIFY:
318 break;
319 default:
320 return FALSE;
321 }
322
323 if (IS_NULL_UNEXPECTEDLY(hWndIME))
324 return TRUE;
325
326 if (bAnsi)
327 SendMessageA(hWndIME, msg, wParam, lParam);
328 else
329 SendMessageW(hWndIME, msg, wParam, lParam);
330
331 return TRUE;
332}
#define WM_IME_SETCONTEXT
Definition: winuser.h:1819
#define WM_IME_COMPOSITIONFULL
Definition: winuser.h:1822
#define WM_IME_SELECT
Definition: winuser.h:1823

Referenced by ImmIsUIMessageA(), and ImmIsUIMessageW().

◆ ImmIsUIMessageW()

BOOL WINAPI ImmIsUIMessageW ( HWND  hWndIME,
UINT  msg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 683 of file keymsg.c.

684{
685 TRACE("(%p, 0x%X, %p, %p)\n", hWndIME, msg, wParam, lParam);
686 return ImmIsUIMessageAW(hWndIME, msg, wParam, lParam, FALSE);
687}

Referenced by ActiveIMMApp_IsUIMessageW().

◆ ImmPostMessages()

VOID APIENTRY ImmPostMessages ( HWND  hwnd,
HIMC  hIMC,
DWORD  dwCount,
LPTRANSMSG  lpTransMsg 
)

Definition at line 971 of file keymsg.c.

972{
973 DWORD dwIndex;
974 PCLIENTIMC pClientImc;
975 LPTRANSMSG pNewTransMsg = lpTransMsg, pItem;
976 BOOL bAnsi;
977
978 pClientImc = ImmLockClientImc(hIMC);
979 if (IS_NULL_UNEXPECTEDLY(pClientImc))
980 return;
981
982 bAnsi = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
983 ImmUnlockClientImc(pClientImc);
984
985#ifdef IMM_WIN3_SUPPORT
986 if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */
987 {
989 WORD Lang = PRIMARYLANGID(LangID);
990
991 /* translate the messages if Japanese or Korean */
992 if (Lang == LANG_JAPANESE ||
993 (Lang == LANG_KOREAN && NtUserGetAppImeLevel(hwnd) == 3))
994 {
995 DWORD cbTransMsg = dwCount * sizeof(TRANSMSG);
996 pNewTransMsg = ImmLocalAlloc(0, cbTransMsg);
997 if (pNewTransMsg)
998 {
999 RtlCopyMemory(pNewTransMsg, lpTransMsg, cbTransMsg);
1000 dwCount = WINNLSTranslateMessage(dwCount, pNewTransMsg, hIMC, bAnsi, Lang);
1001 }
1002 else
1003 {
1004 pNewTransMsg = lpTransMsg;
1005 }
1006 }
1007 }
1008#endif
1009
1010 /* post them */
1011 pItem = pNewTransMsg;
1012 for (dwIndex = 0; dwIndex < dwCount; ++dwIndex, ++pItem)
1013 {
1014 if (bAnsi)
1015 PostMessageA(hwnd, pItem->message, pItem->wParam, pItem->lParam);
1016 else
1017 PostMessageW(hwnd, pItem->message, pItem->wParam, pItem->lParam);
1018 }
1019
1020#ifdef IMM_WIN3_SUPPORT
1021 if (pNewTransMsg != lpTransMsg)
1022 ImmLocalFree(pNewTransMsg);
1023#endif
1024}
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
BOOL WINAPI PostMessageA(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by ImmTranslateMessage().

◆ ImmProcessKey()

DWORD WINAPI ImmProcessKey ( HWND  hWnd,
HKL  hKL,
UINT  vKey,
LPARAM  lParam,
DWORD  dwHotKeyID 
)

Definition at line 774 of file keymsg.c.

775{
776 DWORD ret = 0;
777 HIMC hIMC;
778 PIMEDPI pImeDpi;
780 BYTE KeyState[256];
781 UINT vk;
782 BOOL bUseIme = TRUE, bSkipThisKey = FALSE, bLowWordOnly = FALSE;
783
784 TRACE("(%p, %p, 0x%X, %p, 0x%lX)\n", hWnd, hKL, vKey, lParam, dwHotKeyID);
785
786 hIMC = ImmGetContext(hWnd);
787 pImeDpi = ImmLockImeDpi(hKL);
788 if (pImeDpi)
789 {
790 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
791 if (pIC)
792 {
793 if (LOBYTE(vKey) == VK_PACKET &&
795 {
796 if (ImeDpi_IsUnicode(pImeDpi))
797 {
798 bLowWordOnly = TRUE;
799 }
800 else
801 {
802 bUseIme = FALSE;
803 if (pIC->fOpen)
804 bSkipThisKey = TRUE;
805 }
806 }
807
808 if (bUseIme)
809 {
810 if (GetKeyboardState(KeyState))
811 {
812 vk = (bLowWordOnly ? LOWORD(vKey) : vKey);
813 if (pImeDpi->ImeProcessKey(hIMC, vk, lParam, KeyState))
814 {
815 pIC->bNeedsTrans = TRUE;
816 pIC->nVKey = vKey;
818 }
819 }
820 }
821 else if (bSkipThisKey)
822 {
824 }
825
826 ImmUnlockIMC(hIMC);
827 }
828
829 ImmUnlockImeDpi(pImeDpi);
830 }
831
832 if (dwHotKeyID != INVALID_HOTKEY_ID) /* Valid Hot-key */
833 {
834 if (Imm32ProcessHotKey(hWnd, hIMC, hKL, dwHotKeyID))
835 {
836 if (vKey != VK_KANJI || dwHotKeyID != IME_JHOTKEY_CLOSE_OPEN)
837 ret |= IPHK_HOTKEY;
838 }
839 }
840
841 if ((ret & IPHK_PROCESSBYIME) && (ImmGetAppCompatFlags(hIMC) & 0x10000))
842 {
843 /* The key has been processed by IME's ImeProcessKey */
845 if (PRIMARYLANGID(wLangID) == LANG_KOREAN &&
846 (vKey == VK_PROCESSKEY || (ret & IPHK_HOTKEY)))
847 {
848 /* Korean don't want VK_PROCESSKEY and IME hot-keys */
849 }
850 else
851 {
852 /* Add WM_KEYDOWN:VK_PROCESSKEY message */
854 ret &= ~IPHK_PROCESSBYIME;
856 }
857 }
858
859 ImmReleaseContext(hWnd, hIMC);
860 return ret; /* Returns IPHK_... flags */
861}
BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
Definition: imm.c:1098
#define ImeDpi_IsUnicode(pImeDpi)
Definition: precomp.h:145
#define IME_PROP_ACCEPT_WIDE_VKEY
Definition: imm.h:218
#define LOBYTE(W)
Definition: jmemdos.c:487
BOOL WINAPI ImmTranslateMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lKeyData)
Definition: keymsg.c:1030
DWORD WINAPI ImmGetAppCompatFlags(HIMC hIMC)
Definition: keymsg.c:755
BOOL APIENTRY Imm32ProcessHotKey(HWND hWnd, HIMC hIMC, HKL hKL, DWORD dwHotKeyID)
Definition: keymsg.c:252
WORD vk
Definition: input.c:77
#define IPHK_SKIPTHISKEY
Definition: undocuser.h:142
#define IPHK_HOTKEY
Definition: undocuser.h:139
#define IPHK_PROCESSBYIME
Definition: undocuser.h:140
_Check_return_ BOOL WINAPI GetKeyboardState(_Out_writes_(256) PBYTE lpKeyState)
#define VK_KANJI
Definition: winuser.h:2203
unsigned char BYTE
Definition: xxhash.c:193

Referenced by ImmCallImeConsoleIME(), and User32CallImmProcessKeyFromKernel().

◆ ImmRequestMessageA()

LRESULT WINAPI ImmRequestMessageA ( HIMC  hIMC,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1167 of file keymsg.c.

1168{
1169 TRACE("(%p, %p, %p)\n", hIMC, wParam, lParam);
1170 return ImmRequestMessageAW(hIMC, wParam, lParam, TRUE);
1171}
LRESULT APIENTRY ImmRequestMessageAW(HIMC hIMC, WPARAM wParam, LPARAM lParam, BOOL bAnsi)
Definition: keymsg.c:646

Referenced by test_InvalidIMC().

◆ ImmRequestMessageAW()

LRESULT APIENTRY ImmRequestMessageAW ( HIMC  hIMC,
WPARAM  wParam,
LPARAM  lParam,
BOOL  bAnsi 
)

Definition at line 646 of file keymsg.c.

647{
648 LRESULT ret = 0;
649 LPINPUTCONTEXT pIC;
650 HWND hWnd;
651 PWND pWnd = NULL;
652
654 return FALSE;
655
656 pIC = ImmLockIMC(hIMC);
657 if (IS_NULL_UNEXPECTEDLY(pIC))
658 return FALSE;
659
660 hWnd = pIC->hWnd;
661 if (hWnd)
662 pWnd = ValidateHwnd(hWnd);
663
664 if (pWnd && pWnd->head.pti == Imm32CurrentPti())
665 ret = Imm32ProcessRequest(hIMC, pWnd, (DWORD)wParam, (LPVOID)lParam, bAnsi);
666
667 ImmUnlockIMC(hIMC);
668 return ret;
669}
#define ValidateHwnd(hwnd)
Definition: precomp.h:85
PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
Definition: utils.c:19
LRESULT APIENTRY Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bAnsiAPI)
Definition: keymsg.c:437
LONG_PTR LRESULT
Definition: windef.h:209

Referenced by ImmRequestMessageA(), and ImmRequestMessageW().

◆ ImmRequestMessageW()

LRESULT WINAPI ImmRequestMessageW ( HIMC  hIMC,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1176 of file keymsg.c.

1177{
1178 TRACE("(%p, %p, %p)\n", hIMC, wParam, lParam);
1179 return ImmRequestMessageAW(hIMC, wParam, lParam, FALSE);
1180}

◆ ImmSendMessageToActiveDefImeWndW()

LRESULT WINAPI ImmSendMessageToActiveDefImeWndW ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1186 of file keymsg.c.

1187{
1188 HWND hwndIME;
1189
1190 if (uMsg != WM_COPYDATA)
1191 return 0;
1192
1194 if (IS_NULL_UNEXPECTEDLY(hwndIME))
1195 return 0;
1196
1197 return SendMessageW(hwndIME, uMsg, wParam, lParam);
1198}
HANDLE HWND
Definition: compat.h:19
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
Definition: window.c:4184
#define QUERY_WINDOW_DEFAULT_IME
Definition: ntuser.h:2957
#define WM_COPYDATA
Definition: winuser.h:1654

◆ ImmSimulateHotKey()

BOOL WINAPI ImmSimulateHotKey ( HWND  hWnd,
DWORD  dwHotKeyID 
)

Definition at line 715 of file keymsg.c.

716{
717 HIMC hIMC;
719 HKL hKL;
720 BOOL ret;
721
722 TRACE("(%p, 0x%lX)\n", hWnd, dwHotKeyID);
723
724 hIMC = ImmGetContext(hWnd);
727 ret = Imm32ProcessHotKey(hWnd, hIMC, hKL, dwHotKeyID);
728 ImmReleaseContext(hWnd, hIMC);
729 return ret;
730}

Referenced by ActiveIMMApp_SimulateHotKey().

◆ ImmSystemHandler()

LRESULT WINAPI ImmSystemHandler ( HIMC  hIMC,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 866 of file keymsg.c.

867{
868 TRACE("(%p, %p, %p)\n", hIMC, wParam, lParam);
869
870 switch (wParam)
871 {
874 return 0;
875
878 return 0;
879
880 case IMS_SETLANGBAND:
883
884 default:
885 WARN("%p\n", wParam);
886 return 0;
887 }
888}
BOOL WINAPI ImmNotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
Definition: ime.c:907
#define NI_COMPOSITIONSTR
Definition: imm.h:298
#define CPS_COMPLETE
Definition: imm.h:312
#define IMS_COMPLETECOMPSTR
Definition: immdev.h:44
#define IMS_SENDNOTIFICATION
Definition: immdev.h:43
BOOL APIENTRY Imm32SendNotification(BOOL bProcess)
Definition: keymsg.c:431
LRESULT APIENTRY CtfImmSetLangBand(HWND hWnd, BOOL fSet)
Definition: keymsg.c:364

Referenced by ImeWnd_OnImeSystem().

◆ ImmTranslateMessage()

BOOL WINAPI ImmTranslateMessage ( HWND  hwnd,
UINT  msg,
WPARAM  wParam,
LPARAM  lKeyData 
)

Definition at line 1030 of file keymsg.c.

1031{
1032#define MSG_COUNT 0x100
1033 BOOL ret = FALSE;
1034 INT kret;
1035 LPINPUTCONTEXTDX pIC;
1036 PIMEDPI pImeDpi = NULL;
1038 LPTRANSMSG pTransMsg;
1039 BYTE abKeyState[256];
1040 HIMC hIMC;
1041 HKL hKL;
1042 UINT vk;
1043 DWORD dwThreadId, dwCount, cbList;
1044 WCHAR wch;
1045 WORD wChar;
1046
1047 TRACE("(%p, 0x%X, %p, %p)\n", hwnd, msg, wParam, lKeyData);
1048
1049 /* filter the message */
1050 switch (msg)
1051 {
1052 case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP:
1053 break;
1054 default:
1055 return FALSE;
1056 }
1057
1058 hIMC = ImmGetContext(hwnd);
1059 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
1060 if (IS_NULL_UNEXPECTEDLY(pIC))
1061 {
1062 ImmReleaseContext(hwnd, hIMC);
1063 return FALSE;
1064 }
1065
1066 if (!pIC->bNeedsTrans) /* is translation needed? */
1067 {
1068 /* directly post them */
1069 dwCount = pIC->dwNumMsgBuf;
1070 if (dwCount == 0)
1071 goto Quit;
1072
1073 pTransMsg = ImmLockIMCC(pIC->hMsgBuf);
1074 if (pTransMsg)
1075 {
1076 ImmPostMessages(hwnd, hIMC, dwCount, pTransMsg);
1077 ImmUnlockIMCC(pIC->hMsgBuf);
1078 ret = TRUE;
1079 }
1080 pIC->dwNumMsgBuf = 0; /* done */
1081 goto Quit;
1082 }
1083 pIC->bNeedsTrans = FALSE; /* clear the flag */
1084
1087 pImeDpi = ImmLockImeDpi(hKL);
1088 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1089 goto Quit;
1090
1091 if (!GetKeyboardState(abKeyState)) /* get keyboard ON/OFF status */
1092 {
1093 WARN("\n");
1094 goto Quit;
1095 }
1096
1097 /* convert a virtual key if IME_PROP_KBD_CHAR_FIRST */
1098 vk = pIC->nVKey;
1100 {
1101 if (ImeDpi_IsUnicode(pImeDpi))
1102 {
1103 wch = 0;
1104 kret = ToUnicode(vk, HIWORD(lKeyData), abKeyState, &wch, 1, 0);
1105 if (kret == 1)
1106 vk = MAKELONG(LOBYTE(vk), wch);
1107 }
1108 else
1109 {
1110 wChar = 0;
1111 kret = ToAsciiEx(vk, HIWORD(lKeyData), abKeyState, &wChar, 0, hKL);
1112 if (kret > 0)
1113 {
1114 if ((BYTE)vk == VK_PACKET)
1115 {
1116 vk &= 0xFF;
1117 vk |= (wChar << 8);
1118 }
1119 else
1120 {
1121 vk = MAKEWORD(vk, wChar);
1122 }
1123 }
1124 }
1125 }
1126
1127 /* allocate a list */
1128 cbList = offsetof(TRANSMSGLIST, TransMsg) + MSG_COUNT * sizeof(TRANSMSG);
1129 pList = ImmLocalAlloc(0, cbList);
1131 goto Quit;
1132
1133 /* use IME conversion engine and convert the list */
1134 pList->uMsgCount = MSG_COUNT;
1135 kret = pImeDpi->ImeToAsciiEx(vk, HIWORD(lKeyData), abKeyState, pList, 0, hIMC);
1136 if (kret <= 0)
1137 goto Quit;
1138
1139 /* post them */
1140 if (kret <= MSG_COUNT)
1141 {
1142 ImmPostMessages(hwnd, hIMC, kret, pList->TransMsg);
1143 ret = TRUE;
1144 }
1145 else
1146 {
1147 pTransMsg = ImmLockIMCC(pIC->hMsgBuf);
1148 if (IS_NULL_UNEXPECTEDLY(pTransMsg))
1149 goto Quit;
1150 ImmPostMessages(hwnd, hIMC, kret, pTransMsg);
1151 ImmUnlockIMCC(pIC->hMsgBuf);
1152 }
1153
1154Quit:
1156 ImmUnlockImeDpi(pImeDpi);
1157 ImmUnlockIMC(hIMC);
1158 ImmReleaseContext(hwnd, hIMC);
1159 TRACE("ret: %d\n", ret);
1160 return ret;
1161#undef MSG_COUNT
1162}
FxChildList * pList
#define IME_PROP_KBD_CHAR_FIRST
Definition: imm.h:214
VOID APIENTRY ImmPostMessages(HWND hwnd, HIMC hIMC, DWORD dwCount, LPTRANSMSG lpTransMsg)
Definition: keymsg.c:971
#define MSG_COUNT
#define offsetof(TYPE, MEMBER)
#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
int WINAPI ToUnicode(_In_ UINT wVirtKey, _In_ UINT wScanCode, _In_reads_bytes_opt_(256) CONST BYTE *lpKeyState, _Out_writes_(cchBuff) LPWSTR pwszBuff, _In_ int cchBuff, _In_ UINT wFlags)
int WINAPI ToAsciiEx(_In_ UINT, _In_ UINT, _In_reads_opt_(256) CONST BYTE *, _Out_ LPWORD, _In_ UINT, _In_opt_ HKL)

Referenced by ImmProcessKey(), and TranslateMessage().

◆ ImmWINNLSGetIMEHotkey()

UINT WINAPI ImmWINNLSGetIMEHotkey ( HWND  hwndIme)

Definition at line 705 of file keymsg.c.

706{
707 TRACE("(%p)\n", hwndIme);
708 UNREFERENCED_PARAMETER(hwndIme);
709 return 0; /* This is correct. This function of Windows just returns zero. */
710}
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( imm  )