Piotr Caban : user32/tests: Add cross-process mouse click test.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Sep 29 13:35:41 CDT 2014


Module: wine
Branch: master
Commit: 0b273d279beaa8dd5df387b2c79adfa0d43deed5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0b273d279beaa8dd5df387b2c79adfa0d43deed5

Author: Piotr Caban <piotr at 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");
     }
 




More information about the wine-cvs mailing list