imm32/tests: Test showing that communication to the IME window is done via SendMessage.

This commit is contained in:
Aric Stewart 2012-11-20 14:07:07 -06:00 committed by Alexandre Julliard
parent ad6272486b
commit 203b4fbff0

View File

@ -33,11 +33,16 @@ static BOOL (WINAPI *pImmIsUIMessageA)(HWND,UINT,WPARAM,LPARAM);
/*
* msgspy - record and analyse message traces sent to a certain window
*/
typedef struct _msgs {
CWPSTRUCT msg;
BOOL post;
} imm_msgs;
static struct _msg_spy {
HWND hwnd;
HHOOK get_msg_hook;
HHOOK call_wnd_proc_hook;
CWPSTRUCT msgs[32];
imm_msgs msgs[32];
unsigned int i_msg;
} msg_spy;
@ -46,13 +51,14 @@ static LRESULT CALLBACK get_msg_filter(int nCode, WPARAM wParam, LPARAM lParam)
if (HC_ACTION == nCode) {
MSG *msg = (MSG*)lParam;
if ((msg->hwnd == msg_spy.hwnd) &&
if ((msg->hwnd == msg_spy.hwnd || msg_spy.hwnd == NULL) &&
(msg_spy.i_msg < NUMELEMS(msg_spy.msgs)))
{
msg_spy.msgs[msg_spy.i_msg].hwnd = msg->hwnd;
msg_spy.msgs[msg_spy.i_msg].message = msg->message;
msg_spy.msgs[msg_spy.i_msg].wParam = msg->wParam;
msg_spy.msgs[msg_spy.i_msg].lParam = msg->lParam;
msg_spy.msgs[msg_spy.i_msg].msg.hwnd = msg->hwnd;
msg_spy.msgs[msg_spy.i_msg].msg.message = msg->message;
msg_spy.msgs[msg_spy.i_msg].msg.wParam = msg->wParam;
msg_spy.msgs[msg_spy.i_msg].msg.lParam = msg->lParam;
msg_spy.msgs[msg_spy.i_msg].post = TRUE;
msg_spy.i_msg++;
}
}
@ -66,10 +72,11 @@ static LRESULT CALLBACK call_wnd_proc_filter(int nCode, WPARAM wParam,
if (HC_ACTION == nCode) {
CWPSTRUCT *cwp = (CWPSTRUCT*)lParam;
if ((cwp->hwnd == msg_spy.hwnd) &&
if (((cwp->hwnd == msg_spy.hwnd || msg_spy.hwnd == NULL)) &&
(msg_spy.i_msg < NUMELEMS(msg_spy.msgs)))
{
memcpy(&msg_spy.msgs[msg_spy.i_msg], cwp, sizeof(msg_spy.msgs[0]));
memcpy(&msg_spy.msgs[msg_spy.i_msg].msg, cwp, sizeof(msg_spy.msgs[0].msg));
msg_spy.msgs[msg_spy.i_msg].post = FALSE;
msg_spy.i_msg++;
}
}
@ -93,7 +100,7 @@ static void msg_spy_flush_msgs(void) {
msg_spy.i_msg = 0;
}
static CWPSTRUCT* msg_spy_find_msg(UINT message) {
static imm_msgs* msg_spy_find_next_msg(UINT message, UINT *start) {
UINT i;
msg_spy_pump_msg_queue();
@ -102,13 +109,22 @@ static CWPSTRUCT* msg_spy_find_msg(UINT message) {
fprintf(stdout, "%s:%d: msg_spy: message buffer overflow!\n",
__FILE__, __LINE__);
for (i = 0; i < msg_spy.i_msg; i++)
if (msg_spy.msgs[i].message == message)
for (i = *start; i < msg_spy.i_msg; i++)
if (msg_spy.msgs[i].msg.message == message)
{
*start = i+1;
return &msg_spy.msgs[i];
}
return NULL;
}
static imm_msgs* msg_spy_find_msg(UINT message) {
UINT i = 0;
return msg_spy_find_next_msg(message, &i);
}
static void msg_spy_init(HWND hwnd) {
msg_spy.hwnd = hwnd;
msg_spy.get_msg_hook =
@ -655,6 +671,36 @@ static void test_ImmDefaultHwnd(void)
DestroyWindow(hwnd);
}
static void test_ImmMessages(void)
{
CANDIDATEFORM cf;
imm_msgs *msg;
HWND defwnd;
HIMC imc;
UINT idx = 0;
HWND hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "Wine imm32.dll test",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
240, 120, NULL, NULL, GetModuleHandle(0), NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
defwnd = ImmGetDefaultIMEWnd(hwnd);
imc = ImmGetContext(hwnd);
ImmSetOpenStatus(imc, TRUE);
msg_spy_flush_msgs();
SendMessage(defwnd, WM_IME_CONTROL, IMC_GETCANDIDATEPOS, (LPARAM)&cf );
do
{
msg = msg_spy_find_next_msg(WM_IME_CONTROL,&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);
}
START_TEST(imm32) {
if (init())
{
@ -668,6 +714,11 @@ START_TEST(imm32) {
test_ImmGetContext();
test_ImmGetDescription();
test_ImmDefaultHwnd();
msg_spy_cleanup();
/* Reinitialize the hooks to capture all windows */
msg_spy_init(NULL);
test_ImmMessages();
msg_spy_cleanup();
}
cleanup();
}