Module: wine Branch: master Commit: 0b273d279beaa8dd5df387b2c79adfa0d43deed5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0b273d279beaa8dd5df387b2c7...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Sep 29 18:03:07 2014 +0200
user32/tests: Add cross-process mouse click test.
---
dlls/user32/tests/win.c | 71 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 14 deletions(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index 1392c9b..ad983df 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -7216,12 +7216,45 @@ todo_wine ok(ret, "UnregisterClass(my_window) failed\n"); }
+static void simulate_click(int x, int y) +{ + INPUT input[2]; + UINT events_no; + + SetCursorPos(x, y); + memset(input, 0, sizeof(input)); + input[0].type = INPUT_MOUSE; + U(input[0]).mi.dx = x; + U(input[0]).mi.dy = y; + U(input[0]).mi.dwFlags = MOUSEEVENTF_LEFTDOWN; + input[1].type = INPUT_MOUSE; + U(input[1]).mi.dx = x; + U(input[1]).mi.dy = y; + U(input[1]).mi.dwFlags = MOUSEEVENTF_LEFTUP; + events_no = SendInput(2, input, sizeof(input[0])); + ok(events_no == 2, "SendInput returned %d\n", events_no); +} + +static WNDPROC def_static_proc; +static BOOL got_hittest; +static LRESULT WINAPI static_hook_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) +{ + if(msg == WM_NCHITTEST) + got_hittest = TRUE; + if(msg == WM_LBUTTONDOWN) + ok(0, "unexpected call\n"); + + return def_static_proc(hwnd, msg, wp, lp); +} + static void window_from_point_proc(HWND parent) { HANDLE start_event, end_event; HANDLE win, child_static, child_button; + BOOL got_click; DWORD ret; POINT pt; + MSG msg;
start_event = OpenEventA(EVENT_ALL_ACCESS, FALSE, "test_wfp_start"); ok(start_event != 0, "OpenEvent failed\n"); @@ -7242,8 +7275,28 @@ static void window_from_point_proc(HWND parent) win = WindowFromPoint(pt); ok(win == child_button, "WindowFromPoint returned %p, expected %p\n", win, child_button);
+ /* without this window simulate click test keeps sending WM_NCHITTEST + * message to child_static in an infinite loop */ + win = CreateWindowExA(0, "button", "button", WS_CHILD | WS_VISIBLE, + 0, 0, 100, 100, parent, 0, NULL, NULL); + ok(win != 0, "CreateWindowEx failed\n"); + def_static_proc = (void*)SetWindowLongPtrA(child_static, + GWLP_WNDPROC, (LONG_PTR)static_hook_proc); + flush_events(TRUE); SetEvent(start_event);
+ got_hittest = FALSE; + got_click = FALSE; + while(!got_click && wait_for_message(&msg)) { + if(msg.message == WM_LBUTTONUP) { + ok(msg.hwnd == win, "msg.hwnd = %p, expected %p\n", msg.hwnd, win); + got_click = TRUE; + } + DispatchMessageA(&msg); + } + ok(got_hittest, "transparent window didn't get WM_NCHITTEST message\n"); + todo_wine ok(got_click, "button under static window didn't get WM_LBUTTONUP\n"); + ret = WaitForSingleObject(end_event, 5000); ok(ret == WAIT_OBJECT_0, "WaitForSingleObject returned %x\n", ret);
@@ -7306,6 +7359,9 @@ static void test_window_from_point(const char *argv0) win = WindowFromPoint(pt); ok(win == child, "WindowFromPoint returned %p, expected %p\n", win, child);
+ simulate_click(150, 150); + flush_events(TRUE); + child = GetWindow(child, GW_HWNDNEXT); pt.x = 250; win = WindowFromPoint(pt); @@ -7838,20 +7894,7 @@ START_TEST(win)
if(!SetForegroundWindow(hwndMain)) { /* workaround for foreground lock timeout */ - INPUT input[2]; - UINT events_no; - - memset(input, 0, sizeof(input)); - input[0].type = INPUT_MOUSE; - U(input[0]).mi.dx = 101; - U(input[0]).mi.dy = 101; - U(input[0]).mi.dwFlags = MOUSEEVENTF_LEFTDOWN; - input[0].type = INPUT_MOUSE; - U(input[0]).mi.dx = 101; - U(input[0]).mi.dy = 101; - U(input[0]).mi.dwFlags = MOUSEEVENTF_LEFTUP; - events_no = SendInput(2, input, sizeof(input[0])); - ok(events_no == 2, "SendInput returned %d\n", events_no); + simulate_click(101, 101); ok(SetForegroundWindow(hwndMain), "SetForegroundWindow failed\n"); }