Aric Stewart : imm32: Messages from ImmGenerateMessage are sent not posted.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Feb 1 09:24:46 CST 2016
Module: wine
Branch: master
Commit: 64c772dcc28e8a6ea5608725de3272fc4c04f691
URL: http://source.winehq.org/git/wine.git/?a=commit;h=64c772dcc28e8a6ea5608725de3272fc4c04f691
Author: Aric Stewart <aric at codeweavers.com>
Date: Thu Jan 28 20:36:30 2016 -0600
imm32: Messages from ImmGenerateMessage are sent not posted.
Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/imm32/imm.c | 12 ++++++++-
dlls/imm32/tests/imm32.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 79 insertions(+), 2 deletions(-)
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index 3fab6fc..2d08378 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -439,6 +439,16 @@ static void ImmInternalPostIMEMessage(InputContextData *data, UINT msg, WPARAM w
PostMessageW(target, msg, wParam, lParam);
}
+/* for sending messages as the IME */
+static void ImmInternalSendIMEMessage(InputContextData *data, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ HWND target = GetFocus();
+ if (!target)
+ SendMessageW(data->IMC.hWnd,msg,wParam,lParam);
+ else
+ SendMessageW(target, msg, wParam, lParam);
+}
+
static LRESULT ImmInternalSendIMENotify(InputContextData *data, WPARAM notify, LPARAM lParam)
{
HWND target;
@@ -2887,7 +2897,7 @@ BOOL WINAPI ImmGenerateMessage(HIMC hIMC)
lpTransMsg = ImmLockIMCC(data->IMC.hMsgBuf);
for (i = 0; i < data->IMC.dwNumMsgBuf; i++)
- ImmInternalPostIMEMessage(data, lpTransMsg[i].message, lpTransMsg[i].wParam, lpTransMsg[i].lParam);
+ ImmInternalSendIMEMessage(data, lpTransMsg[i].message, lpTransMsg[i].wParam, lpTransMsg[i].lParam);
ImmUnlockIMCC(data->IMC.hMsgBuf);
diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c
index b1f3913..d55503a 100644
--- a/dlls/imm32/tests/imm32.c
+++ b/dlls/imm32/tests/imm32.c
@@ -44,7 +44,7 @@ static struct _msg_spy {
HWND hwnd;
HHOOK get_msg_hook;
HHOOK call_wnd_proc_hook;
- imm_msgs msgs[32];
+ imm_msgs msgs[64];
unsigned int i_msg;
} msg_spy;
@@ -59,6 +59,12 @@ typedef struct
} u;
} TEST_INPUT;
+typedef struct _tagTRANSMSG {
+ UINT message;
+ WPARAM wParam;
+ LPARAM lParam;
+} TRANSMSG, *LPTRANSMSG;
+
static UINT (WINAPI *pSendInput) (UINT, INPUT*, size_t);
static LRESULT CALLBACK get_msg_filter(int nCode, WPARAM wParam, LPARAM lParam)
@@ -1015,6 +1021,9 @@ static void test_ImmMessages(void)
HIMC imc;
UINT idx = 0;
+ LPINPUTCONTEXT lpIMC;
+ LPTRANSMSG lpTransMsg;
+
HWND hwnd = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "Wine imm32.dll test",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
240, 120, NULL, NULL, GetModuleHandleA(NULL), NULL);
@@ -1032,6 +1041,64 @@ static void test_ImmMessages(void)
if (msg) ok(!msg->post, "Message should not be posted\n");
} while (msg);
msg_spy_flush_msgs();
+
+ lpIMC = ImmLockIMC(imc);
+ lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf, (lpIMC->dwNumMsgBuf + 1) * sizeof(TRANSMSG));
+ lpTransMsg = ImmLockIMCC(lpIMC->hMsgBuf);
+ lpTransMsg += lpIMC->dwNumMsgBuf;
+ lpTransMsg->message = WM_IME_STARTCOMPOSITION;
+ lpTransMsg->wParam = 0;
+ lpTransMsg->lParam = 0;
+ ImmUnlockIMCC(lpIMC->hMsgBuf);
+ lpIMC->dwNumMsgBuf++;
+ ImmUnlockIMC(imc);
+ ImmGenerateMessage(imc);
+ idx = 0;
+ do
+ {
+ msg = msg_spy_find_next_msg(WM_IME_STARTCOMPOSITION, &idx);
+ if (msg) ok(!msg->post, "Message should not be posted\n");
+ } while (msg);
+ msg_spy_flush_msgs();
+
+ lpIMC = ImmLockIMC(imc);
+ lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf, (lpIMC->dwNumMsgBuf + 1) * sizeof(TRANSMSG));
+ lpTransMsg = ImmLockIMCC(lpIMC->hMsgBuf);
+ lpTransMsg += lpIMC->dwNumMsgBuf;
+ lpTransMsg->message = WM_IME_COMPOSITION;
+ lpTransMsg->wParam = 0;
+ lpTransMsg->lParam = 0;
+ ImmUnlockIMCC(lpIMC->hMsgBuf);
+ lpIMC->dwNumMsgBuf++;
+ ImmUnlockIMC(imc);
+ ImmGenerateMessage(imc);
+ idx = 0;
+ do
+ {
+ msg = msg_spy_find_next_msg(WM_IME_COMPOSITION, &idx);
+ if (msg) ok(!msg->post, "Message should not be posted\n");
+ } while (msg);
+ msg_spy_flush_msgs();
+
+ lpIMC = ImmLockIMC(imc);
+ lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf, (lpIMC->dwNumMsgBuf + 1) * sizeof(TRANSMSG));
+ lpTransMsg = ImmLockIMCC(lpIMC->hMsgBuf);
+ lpTransMsg += lpIMC->dwNumMsgBuf;
+ lpTransMsg->message = WM_IME_ENDCOMPOSITION;
+ lpTransMsg->wParam = 0;
+ lpTransMsg->lParam = 0;
+ ImmUnlockIMCC(lpIMC->hMsgBuf);
+ lpIMC->dwNumMsgBuf++;
+ ImmUnlockIMC(imc);
+ ImmGenerateMessage(imc);
+ idx = 0;
+ do
+ {
+ msg = msg_spy_find_next_msg(WM_IME_ENDCOMPOSITION, &idx);
+ if (msg) ok(!msg->post, "Message should not be posted\n");
+ } while (msg);
+ msg_spy_flush_msgs();
+
ImmSetOpenStatus(imc, FALSE);
ImmReleaseContext(hwnd, imc);
DestroyWindow(hwnd);
More information about the wine-cvs
mailing list