From 64c772dcc28e8a6ea5608725de3272fc4c04f691 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Thu, 28 Jan 2016 20:36:30 -0600 Subject: [PATCH] imm32: Messages from ImmGenerateMessage are sent not posted. Signed-off-by: Aric Stewart Signed-off-by: Alexandre Julliard --- 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 3fab6fc8236..2d08378570c 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 b1f39131a31..d55503a29c0 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);