Module: wine Branch: master Commit: 8d10b5ceccf074390a8f267a774b7ed615dc0284 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8d10b5ceccf074390a8f267a77...
Author: Huw Davies huw@codeweavers.com Date: Mon Jun 5 13:05:14 2017 +0100
user32: Use the original message's wparam during the double-click comparison.
Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/message.c | 5 +++- dlls/user32/tests/win.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 3 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c index d13a9b0..61a1543 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -2490,6 +2490,7 @@ static BOOL process_mouse_message( MSG *msg, UINT hw_id, ULONG_PTR extra_info, H GUITHREADINFO info; MOUSEHOOKSTRUCTEX hook; BOOL eatMsg; + WPARAM wparam;
/* find the window to dispatch this mouse message to */
@@ -2523,13 +2524,14 @@ static BOOL process_mouse_message( MSG *msg, UINT hw_id, ULONG_PTR extra_info, H
pt = msg->pt; message = msg->message; + wparam = msg->wParam; /* Note: windows has no concept of a non-client wheel message */ if (message != WM_MOUSEWHEEL) { if (hittest != HTCLIENT) { message += WM_NCMOUSEMOVE - WM_MOUSEMOVE; - msg->wParam = hittest; + wparam = hittest; } else { @@ -2581,6 +2583,7 @@ static BOOL process_mouse_message( MSG *msg, UINT hw_id, ULONG_PTR extra_info, H { if (message < first || message > last) return FALSE; } + msg->wParam = wparam;
/* message is accepted now (but may still get dropped) */
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index 460ae93..2399228 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -3759,7 +3759,7 @@ static void test_mouse_input(HWND hwnd) RECT rc; POINT pt; int x, y; - HWND popup; + HWND popup, child = NULL; MSG msg; BOOL ret; LRESULT res; @@ -3948,10 +3948,72 @@ static void test_mouse_input(HWND hwnd) TEST_MOUSEACTIVATE(HTCLOSE,MA_ACTIVATE); TEST_MOUSEACTIVATE(HTHELP,MA_ACTIVATE);
+ ShowWindow(popup, SW_HIDE); + + /* Test sending double click to the non-client area, while capturing the window after + the first click has been processed. Use a child window to ensure that Wine's graphics + driver isn't managing the non-client area. */ + + GetWindowRect(hwnd, &rc); + child = CreateWindowExA(0, "MainWindowClass", NULL, WS_CHILD | WS_CAPTION | WS_SYSMENU | WS_VISIBLE, + rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, + hwnd, 0, 0, NULL); + GetWindowRect(child, &rc); + + UpdateWindow(child); + SetCursorPos( rc.left + 5, rc.top + 5 ); + flush_events( TRUE ); + + mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); + mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); + mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); + mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); + + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); +todo_wine + ok(msg.hwnd == child && msg.message == WM_NCMOUSEMOVE, "hwnd %p/%p message %04x\n", + msg.hwnd, child, msg.message); + + if (msg.message == WM_NCMOUSEMOVE) + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); + ok(msg.hwnd == child && msg.message == WM_NCLBUTTONDOWN, "hwnd %p/%p message %04x\n", + msg.hwnd, child, msg.message); + ok(msg.wParam == HTSYSMENU, "wparam %ld\n", msg.wParam); + + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); + ok(msg.hwnd == child && msg.message == WM_NCLBUTTONUP, "hwnd %p/%p message %04x\n", + msg.hwnd, child, msg.message); + + SetCapture( child ); + + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); + ok(msg.hwnd == child && msg.message == WM_LBUTTONDBLCLK, "hwnd %p/%p message %04x\n", + msg.hwnd, child, msg.message); + ok(msg.wParam == MK_LBUTTON, "wparam %ld\n", msg.wParam); + + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); +todo_wine + ok(msg.hwnd == child && (msg.message == WM_NCMOUSELEAVE || broken(msg.message == WM_LBUTTONUP)), + "hwnd %p/%p message %04x\n", msg.hwnd, child, msg.message); + + if (msg.message == WM_NCMOUSELEAVE) + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); + ok(msg.hwnd == child && msg.message == WM_LBUTTONUP, "hwnd %p/%p message %04x\n", + msg.hwnd, child, msg.message); + + ret = peek_message(&msg); + ok(!ret, "message %04x available\n", msg.message); + done: - /* Clear any messages left behind by WM_MOUSEACTIVATE tests */ flush_events( TRUE );
+ if (child) DestroyWindow(child); DestroyWindow(popup); }