Aric Stewart : imm32: Implement ImmProcessKey and ImmTranslateMessage.
Alexandre Julliard
julliard at winehq.org
Mon Apr 14 07:14:23 CDT 2008
Module: wine
Branch: master
Commit: 43dc41168d776cebd05bffffc17a2ebda33687fe
URL: http://source.winehq.org/git/wine.git/?a=commit;h=43dc41168d776cebd05bffffc17a2ebda33687fe
Author: Aric Stewart <aric at codeweavers.com>
Date: Fri Apr 11 10:59:01 2008 -0500
imm32: Implement ImmProcessKey and ImmTranslateMessage.
---
dlls/imm32/imm.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++
dlls/imm32/imm32.spec | 4 +-
2 files changed, 97 insertions(+), 2 deletions(-)
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index ff6398c..c03d6fd 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -78,6 +78,7 @@ typedef struct tagInputContextData
ImmHkl *immKbd;
HWND imeWnd;
+ UINT lastVK;
} InputContextData;
typedef struct _tagTRANSMSG {
@@ -2147,3 +2148,97 @@ BOOL WINAPI ImmGenerateMessage(HIMC hIMC)
return TRUE;
}
+
+/***********************************************************************
+* ImmTranslateMessage(IMM32.@)
+* ( Undocumented, call internally and from user32.dll )
+*/
+BOOL WINAPI ImmTranslateMessage(HWND hwnd, UINT msg, WCHAR chr, LPARAM lKeyData)
+{
+ InputContextData *data;
+ HIMC imc = ImmGetContext(hwnd);
+ BYTE state[256];
+ UINT scancode;
+ LPVOID list = 0;
+ UINT msg_count;
+ UINT uVirtKey;
+ static const int list_count = 10;
+
+ TRACE("%p %x '%c' %x\n",hwnd, msg, chr, (UINT)lKeyData);
+
+ if (imc)
+ data = (InputContextData*)imc;
+ else
+ return FALSE;
+
+ if (!data->immKbd->hIME || !data->immKbd->pImeToAsciiEx)
+ return FALSE;
+
+ GetKeyboardState(state);
+ scancode = lKeyData >> 0x10 & 0xff;
+
+ list = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, list_count * sizeof(TRANSMSG) + sizeof(DWORD));
+ ((DWORD*)list)[0] = list_count;
+
+ if (data->immKbd->imeInfo.fdwProperty & IME_PROP_KBD_CHAR_FIRST)
+ {
+ if (!is_himc_ime_unicode(data))
+ ToAscii(data->lastVK, scancode, state, &chr, 0);
+ uVirtKey = MAKELONG(data->lastVK,chr);
+ }
+ else
+ uVirtKey = data->lastVK;
+
+ msg_count = data->immKbd->pImeToAsciiEx(uVirtKey, scancode, state, list, 0, imc);
+ TRACE("%i messages generated\n",msg_count);
+ if (msg_count && msg_count <= list_count)
+ {
+ int i;
+ LPTRANSMSG msgs = (LPTRANSMSG)((LPBYTE)list + sizeof(DWORD));
+
+ for (i = 0; i < msg_count; i++)
+ ImmInternalPostIMEMessage(data, msgs[i].message, msgs[i].wParam, msgs[i].lParam);
+ }
+ else if (msg_count > list_count)
+ ImmGenerateMessage(imc);
+
+ HeapFree(GetProcessHeap(),0,list);
+
+ return (msg_count > 0);
+}
+
+/***********************************************************************
+* ImmProcessKey(IMM32.@)
+* ( Undocumented, called from user32.dll )
+*/
+BOOL WINAPI ImmProcessKey(HWND hwnd, HKL hKL, UINT vKey, LPARAM lKeyData, DWORD unknown)
+{
+ InputContextData *data;
+ HIMC imc = ImmGetContext(hwnd);
+ BYTE state[256];
+
+ TRACE("%p %p %x %x %x\n",hwnd, hKL, vKey, (UINT)lKeyData, unknown);
+
+ if (imc)
+ data = (InputContextData*)imc;
+ else
+ return FALSE;
+
+ if (!data->immKbd->hIME || !data->immKbd->pImeProcessKey)
+ return FALSE;
+
+ GetKeyboardState(state);
+ data->lastVK = vKey;
+
+ if (data->immKbd->pImeProcessKey(imc, vKey, lKeyData, state))
+ {
+ WCHAR key;
+ UINT scancode;
+
+ scancode = lKeyData >> 0x10 & 0xff;
+ ToUnicodeEx(vKey, scancode, state, &key, 1, 0, hKL);
+ return ImmTranslateMessage(hwnd, WM_KEYDOWN, key, lKeyData );
+ }
+
+ return FALSE;
+}
diff --git a/dlls/imm32/imm32.spec b/dlls/imm32/imm32.spec
index 0ecd1f9..4e0b023 100644
--- a/dlls/imm32/imm32.spec
+++ b/dlls/imm32/imm32.spec
@@ -72,7 +72,7 @@
@ stub ImmLockImeDpi
@ stdcall ImmNotifyIME(long long long long)
@ stub ImmPenAuxInput
-@ stub ImmProcessKey
+@ stdcall ImmProcessKey(long long long long long)
@ stub ImmPutImeMenuItemsIntoMappedFile
@ stdcall ImmReSizeIMCC(long long)
@ stub ImmRegisterClient
@@ -99,7 +99,7 @@
@ stub ImmShowSoftKeyboard
@ stdcall ImmSimulateHotKey(long long)
@ stub ImmSystemHandler
-@ stub ImmTranslateMessage
+@ stdcall ImmTranslateMessage(long long long long)
@ stub ImmUnlockClientImc
@ stdcall ImmUnlockIMC(long)
@ stdcall ImmUnlockIMCC(long)
More information about the wine-cvs
mailing list