From: Christopher Thielen Subject: [PATCH] user32: Allow WM_CAPTURECHANGE indicating SetCapture() parameter. Message-Id: <5653FA2A.7000403@gmail.com> Date: Mon, 23 Nov 2015 21:48:26 -0800 Fixes https://bugs.winehq.org/show_bug.cgi?id=13683 A window may be notified with WM_CAPTURECHANGED about itself gaining mouse capture if it calls SetCapture() twice. Tested on Windows XP and Fedora Workstation 22. Re-submitting to simplify based on wine-devel feedback. Signed-off-by: Christopher Thielen From 99e0c0c9073606d44f6f404468cb7863e425bc90 Mon Sep 17 00:00:00 2001 From: Christopher Thielen Date: Sun, 22 Nov 2015 22:41:45 -0800 Subject: [PATCH] user32: Allow WM_CAPTURECHANGE indicating SetCapture() parameter. Fixes https://bugs.winehq.org/show_bug.cgi?id=13683 A window may be notified with WM_CAPTURECHANGED about itself gaining mouse capture if it calls SetCapture() twice. Tested on Windows XP and Fedora Workstation 22. Signed-off-by: Christopher Thielen --- dlls/user32/input.c | 2 +- dlls/user32/tests/msg.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 40e35a9..63fae67 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -108,7 +108,7 @@ BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret ) { USER_Driver->pSetCapture( hwnd, gui_flags ); - if (previous && previous != hwnd) + if (previous) SendMessageW( previous, WM_CAPTURECHANGED, 0, (LPARAM)hwnd ); if (prev_ret) *prev_ret = previous; diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index d92fbc7..687834c 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -14906,6 +14906,34 @@ else flush_sequence(); } +static const struct message DoubleSetCaptureSeq[] = +{ + { WM_CAPTURECHANGED, sent }, + { 0 } +}; + +static void test_DoubleSetCapture(void) +{ + HWND hwnd; + + hwnd = CreateWindowExA(0, "TestWindowClass", "Test DoubleSetCapture", + WS_OVERLAPPEDWINDOW | WS_VISIBLE, + 100, 100, 200, 200, 0, 0, 0, NULL); + ok (hwnd != 0, "Failed to create overlapped window\n"); + + ShowWindow( hwnd, SW_SHOW ); + flush_sequence(); + + trace("SetCapture( hwnd )\n"); + SetCapture( hwnd ); + trace("SetCapture( hwnd )\n"); + SetCapture( hwnd ); + ok_sequence(DoubleSetCaptureSeq, "SetCapture( hwnd ) twice", FALSE); + trace("done\n"); + + DestroyWindow(hwnd); +} + static void init_funcs(void) { HMODULE hKernel32 = GetModuleHandleA("kernel32.dll"); @@ -15045,6 +15073,7 @@ START_TEST(msg) test_layered_window(); test_TrackPopupMenu(); test_TrackPopupMenuEmpty(); + test_DoubleSetCapture(); /* keep it the last test, under Windows it tends to break the tests * which rely on active/foreground windows being correct. */ -- 2.5.0