From 34671bdcff1c99acfc8f887519054363bd483078 Mon Sep 17 00:00:00 2001 From: Akihiro Sagawa Date: Sat, 6 Aug 2022 17:45:36 +0900 Subject: [PATCH] winmm/tests: Add tests for window style of video window. The test shows that even if MCI_DGV_OPEN_PARENT is specified, the video window is shown. In other words, it doesn't imply the window is a child window. Signed-off-by: Akihiro Sagawa --- dlls/winmm/tests/mci.c | 151 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 120 insertions(+), 31 deletions(-) diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index c8ba5440287..bf609a9d26d 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1488,41 +1488,130 @@ static void test_video_window(void) { const WCHAR *filename = load_resource(L"test.mpg"); MCI_PARMS_UNION parm; - HWND video_window; + unsigned int i; MCIDEVICEID id; MCIERROR err; BOOL ret; - parm.dgv_open.lpstrDeviceType = (WCHAR *)L"MPEGVideo"; - parm.dgv_open.lpstrElementName = (WCHAR *)filename; - err = mciSendCommandW(0, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_OPEN_TYPE, (DWORD_PTR)&parm); - ok(!err, "Got %s.\n", dbg_mcierr(err)); - id = parm.dgv_open.wDeviceID; - - err = mciSendCommandW(id, MCI_PLAY, 0, (DWORD_PTR)&parm); - ok(!err, "Got %s.\n", dbg_mcierr(err)); - - video_window = NULL; - EnumWindows(my_visible_window_proc, (LPARAM)&video_window); - ok(video_window != NULL, "Video window should be shown.\n"); - - err = mciSendCommandW(id, MCI_STOP, 0, (DWORD_PTR)&parm); - ok(!err, "Got %s.\n", dbg_mcierr(err)); - - ok(IsWindowVisible(video_window), "Video window should be visible.\n"); - - err = mciSendCommandW(id, MCI_PLAY, 0, (DWORD_PTR)&parm); - ok(!err, "Got %s.\n", dbg_mcierr(err)); - - ok(IsWindowVisible(video_window), "Video window should be visible.\n"); - - err = mciSendCommandW(id, MCI_SEEK, MCI_SEEK_TO_START, (DWORD_PTR)&parm); - ok(!err, "Got %s.\n", dbg_mcierr(err)); - - ok(IsWindowVisible(video_window), "Video window should be visible.\n"); - - err = mciSendCommandW(id, MCI_CLOSE, 0, 0); - ok(!err, "Got %s.\n", dbg_mcierr(err)); + static const struct + { + DWORD open_flags; + DWORD style; + DWORD expected_style; + } + testcase[] = + { + { + 0, + 0, + (WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS) & ~WS_MAXIMIZEBOX, + }, + { + MCI_DGV_OPEN_PARENT, + 0, + (WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS) & ~WS_MAXIMIZEBOX, + }, + { + MCI_DGV_OPEN_WS, + 0, + WS_BORDER | WS_CLIPSIBLINGS | WS_BORDER | WS_DLGFRAME, + }, + { + MCI_DGV_OPEN_WS, + WS_POPUPWINDOW, + WS_POPUPWINDOW | WS_CLIPSIBLINGS, + }, + { + MCI_DGV_OPEN_PARENT | MCI_DGV_OPEN_WS, + WS_OVERLAPPEDWINDOW, + WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS, + }, + { + MCI_DGV_OPEN_PARENT | MCI_DGV_OPEN_WS, + WS_CHILDWINDOW, + WS_CHILD, + }, + }; + + for (i = 0; i < ARRAY_SIZE(testcase); ++i) + { + HWND parent_window = NULL, hwnd, video_window; + DWORD style, expected; + + winetest_push_context("%u", i); + + if (testcase[i].open_flags & MCI_DGV_OPEN_PARENT) + parent_window = CreateWindowExA(0, "static", "parent", + WS_POPUPWINDOW, 0, 0, 100, 100, 0, 0, 0, NULL); + + parm.dgv_open.lpstrDeviceType = (WCHAR *)L"MPEGVideo"; + parm.dgv_open.lpstrElementName = (WCHAR *)filename; + parm.dgv_open.hWndParent = parent_window; + parm.dgv_open.dwStyle = testcase[i].style; + err = mciSendCommandW(0, MCI_OPEN, + MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | testcase[i].open_flags, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + id = parm.dgv_open.wDeviceID; + + err = mciSendCommandW(id, MCI_PLAY, 0, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + + if (!(testcase[i].style & WS_CHILD)) + { + video_window = NULL; + EnumWindows(my_visible_window_proc, (LPARAM)&video_window); + todo_wine_if (testcase[i].open_flags & MCI_DGV_OPEN_PARENT) + ok(video_window != NULL, "Video window should be shown.\n"); + + /* FIXME: Remove once Wine is fixed */ + if (!video_window) goto next; + + hwnd = GetWindow(video_window, GW_OWNER); + todo_wine_if (testcase[i].open_flags & MCI_DGV_OPEN_PARENT) + ok(hwnd == parent_window, "Got owner %p, expected %p.\n", hwnd, parent_window); + } + else + { + ok(!IsWindowVisible(parent_window), "Parent window should be hidden.\n"); + ShowWindow(parent_window, SW_SHOWNA); + + hwnd = GetWindow(parent_window, GW_CHILD); + ok(hwnd != NULL, "Child video window should be shown.\n"); + video_window = hwnd; + } + + expected = testcase[i].expected_style | WS_VISIBLE; + style = GetWindowLongW(video_window, GWL_STYLE); + todo_wine_if (i != 3) + ok(style == expected, "Got style %#lx for window %p, expected %#lx.\n", style, video_window, expected); + + err = mciSendCommandW(id, MCI_STOP, 0, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + + ok(IsWindowVisible(video_window), "Video window should be visible.\n"); + + err = mciSendCommandW(id, MCI_PLAY, 0, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + + ok(IsWindowVisible(video_window), "Video window should be visible.\n"); + + err = mciSendCommandW(id, MCI_SEEK, MCI_SEEK_TO_START, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + + ok(IsWindowVisible(video_window), "Video window should be visible.\n"); + +next: + err = mciSendCommandW(id, MCI_CLOSE, 0, 0); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + + if (parent_window) + { + ret = DestroyWindow(parent_window); + ok(ret, "Failed to destroy parent window\n"); + } + + winetest_pop_context(); + } ret = DeleteFileW(filename); ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); -- 2.11.4.GIT