[PATCH 1/2] Added test to show EnableWindow cause wrong ReleaseCapture (try 2)
Guo Jian
orzhvs at gmail.com
Thu May 9 11:31:34 CDT 2013
A window will lose capture if it's disabled, but it's children should
not. Related to bug 33542.
It has been tested fine with newtestbot.
---
dlls/user32/tests/win.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 81 insertions(+)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index 37d210e..7c6654d 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -3105,6 +3105,86 @@ static void test_capture_4(void)
DestroyWindow(hwnd);
}
+/* test for that disabling a window should not release capture of child window */
+static void test_capture_5(void)
+{
+ HWND hwnd, child, cap;
+ POINT pnt;
+ MSG msg;
+ BOOL received_lbuttonup_flag;
+ WNDCLASS class;
+
+ class.style = CS_HREDRAW | CS_VREDRAW;
+ class.lpfnWndProc = DefWindowProcA;
+ class.cbClsExtra = 0;
+ class.cbWndExtra = 0;
+ class.hInstance = 0;
+ class.hIcon = NULL;
+ class.hCursor = NULL;
+ class.hbrBackground = GetStockObject(WHITE_BRUSH);
+ class.lpszMenuName = 0;
+ class.lpszClassName = "test_capture_5_class";
+ if (!RegisterClass (&class))
+ {
+ ok(FALSE, "RegisterClass failed\n");
+ return;
+ }
+
+ hwnd = CreateWindowEx(0, "test_capture_5_class", "test_capture_5 parent",
+ WS_OVERLAPPEDWINDOW,
+ 100, 100, 200, 200,
+ 0, 0, GetModuleHandle(0), NULL);
+ assert(hwnd);
+ trace("hwnd %p\n", hwnd);
+ child = CreateWindowExA(0, "Edit", "child",
+ WS_BORDER | WS_CHILD | WS_VISIBLE,
+ 10, 10, 50, 50, hwnd, 0,
+ GetModuleHandle(0), NULL);
+ assert(child);
+ trace("child %p\n", child);
+
+ ShowWindow(hwnd, SW_SHOW);
+ UpdateWindow(hwnd);
+ ShowWindow(child, SW_SHOW);
+ UpdateWindow(child);
+
+ /* hold left mouse button down in child */
+ pnt.x = pnt.y = 30;
+ ClientToScreen(hwnd, &pnt);
+ SetCursorPos(pnt.x, pnt.y);
+ mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
+
+ /* set capture to child */
+ ReleaseCapture();
+ SetCapture(child);
+ cap = GetCapture();
+ ok(cap == child, "SetCapture failed.\n");
+ /* disable the parent window */
+ EnableWindow(hwnd, FALSE);
+ cap = GetCapture();
+ todo_wine ok(cap != NULL, "Capture in child should not be released.\n");
+
+ /* move mouse out and release */
+ SetCursorPos(20, 20);
+ received_lbuttonup_flag = FALSE;
+ mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
+ flush_events(FALSE);
+
+ /* should receive BUTTONUP message when captured */
+ while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
+ {
+ if (msg.message == WM_LBUTTONUP)
+ if (msg.hwnd == child) received_lbuttonup_flag = TRUE;
+ DispatchMessage(&msg);
+ }
+ todo_wine ok(received_lbuttonup_flag, "WM_LBUTTONUP should have been received in child\n");
+ ReleaseCapture();
+
+ /* clean up */
+ DestroyWindow(child);
+ DestroyWindow(hwnd);
+}
+
/* PeekMessage wrapper that ignores the messages we don't care about */
static BOOL peek_message( MSG *msg )
{
@@ -7455,6 +7535,7 @@ START_TEST(win)
test_capture_2();
test_capture_3(hwndMain, hwndMain2);
test_capture_4();
+ test_capture_5();
test_rtl_layout();
test_FlashWindowEx();
--
1.8.1.5
More information about the wine-patches
mailing list