This is a new try of mciqtz32's video window patch. Comparing to the previous !370, I added a lot of tests regarding the video window behavior. Some portion of the previous patch are dropped to avoid complexity, I'll add that part later.
-- v5: mciqtz32: Show the default video window when switching from another one. mciqtz32: Hide the default video window when switching to another one. mciqtz32: Reset the video size when changing video destination. mciqtz32: Fix MCI_DGV_WHERE_WINDOW behavior. mciqtz32: Correct video window behavior by creating default window. winmm/tests: Add tests for destination of video window. winmm/tests: Add tests for dimensions of video window. winmm/tests: Add tests for window style of video window. mciqtz32: Don't hide video window when stopping. winmm/tests: Add tests for visibility of video window.
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/winmm/tests/Makefile.in | 3 ++ dlls/winmm/tests/mci.c | 92 +++++++++++++++++++++++++++++++++++ dlls/winmm/tests/rsrc.rc | 25 ++++++++++ dlls/winmm/tests/test.mpg | Bin 0 -> 12288 bytes 4 files changed, 120 insertions(+) create mode 100644 dlls/winmm/tests/rsrc.rc create mode 100644 dlls/winmm/tests/test.mpg
diff --git a/dlls/winmm/tests/Makefile.in b/dlls/winmm/tests/Makefile.in index 1b191cb5747..2b475dd89c3 100644 --- a/dlls/winmm/tests/Makefile.in +++ b/dlls/winmm/tests/Makefile.in @@ -12,3 +12,6 @@ C_SRCS = \ mmio.c \ timer.c \ wave.c + +RC_SRCS = \ + rsrc.rc diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index 2e31cf51708..cc73e083b1f 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -23,6 +23,7 @@ #include "windows.h" #include "mmsystem.h" #include "mmreg.h" +#include "digitalv.h" #include "wine/test.h"
/* The tests use the MCI's own save capability to create the tempfile.wav to play. @@ -37,6 +38,7 @@ typedef union { MCI_GETDEVCAPS_PARMS caps; MCI_SYSINFO_PARMSA sys; MCI_SEEK_PARMS seek; + MCI_DGV_OPEN_PARMSW dgv_open; MCI_GENERIC_PARMS gen; } MCI_PARMS_UNION;
@@ -139,6 +141,31 @@ static BOOL spurious_message(LPMSG msg) return FALSE; }
+static WCHAR *load_resource(const WCHAR *name) +{ + static WCHAR pathW[MAX_PATH]; + DWORD written; + HANDLE file; + HRSRC res; + void *ptr; + + GetTempPathW(ARRAY_SIZE(pathW), pathW); + wcscat(pathW, name); + + file = CreateFileW(pathW, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %lu.\n", + wine_dbgstr_w(pathW), GetLastError()); + + res = FindResourceW(NULL, name, (LPCWSTR)RT_RCDATA); + ok(!!res, "Failed to load resource, error %lu.\n", GetLastError()); + ptr = LockResource(LoadResource(GetModuleHandleA(NULL), res)); + WriteFile(file, ptr, SizeofResource( GetModuleHandleA(NULL), res), &written, NULL); + ok(written == SizeofResource(GetModuleHandleA(NULL), res), "Failed to write resource.\n"); + CloseHandle(file); + + return pathW; +} + /* A single ok() in each code path allows us to prefix this with todo_wine */ #define test_notification(hwnd, command, type) test_notification_dbg(hwnd, command, type, __LINE__) static void test_notification_dbg(HWND hwnd, const char* command, WPARAM type, int line) @@ -1439,6 +1466,68 @@ static void test_threads(void) ok(mr == 0, "close gave: 0x%lx\n", mr); }
+static BOOL CALLBACK my_visible_window_proc(HWND hwnd, LPARAM param) +{ + HWND *ret = (HWND *)param; + DWORD pid; + + GetWindowThreadProcessId(hwnd, &pid); + if (pid != GetCurrentProcessId()) + return TRUE; + + if (GetWindowLongW(hwnd, GWL_STYLE) & WS_VISIBLE) + { + *ret = hwnd; + return FALSE; + } + + return TRUE; +} + +static void test_video_window(void) +{ + const WCHAR *filename = load_resource(L"test.mpg"); + MCI_PARMS_UNION parm; + HWND video_window; + 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)); + + todo_wine 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)); + + todo_wine 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)); + + ret = DeleteFileW(filename); + ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); +} + START_TEST(mci) { char curdir[MAX_PATH], tmpdir[MAX_PATH]; @@ -1463,6 +1552,9 @@ START_TEST(mci) test_asyncWaveTypeMpegvideo(hwnd); }else skip("No output devices available, skipping all output tests\n"); + + test_video_window(); + /* Win9X hangs when exiting with something still open. */ err = mciSendStringA("close all", NULL, 0, hwnd); ok(!err,"final close all returned %s\n", dbg_mcierr(err)); diff --git a/dlls/winmm/tests/rsrc.rc b/dlls/winmm/tests/rsrc.rc new file mode 100644 index 00000000000..b5fde1c39ba --- /dev/null +++ b/dlls/winmm/tests/rsrc.rc @@ -0,0 +1,25 @@ +/* + * Resource file for mci tests. + * + * Copyright 2022 Akihiro Sagawa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "windef.h" + +/* ffmpeg -f lavfi -i smptebars -f lavfi -i "sine=frequency=1000" -t 0.16 -r 25 -f mpeg -vcodec mpeg1video -vf scale=32x24 -acodec mp2 test.mpg */ +/* @makedep: test.mpg */ +test.mpg RCDATA "test.mpg" diff --git a/dlls/winmm/tests/test.mpg b/dlls/winmm/tests/test.mpg new file mode 100644 index 0000000000000000000000000000000000000000..97bb1abae1d6f0676b9f9484b9847c587bb7dd89 GIT binary patch literal 12288 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 Xt_%Ks{cC}LE%2`e{<XmWTMPU*9lmux
literal 0 HcmV?d00001
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 3 --- dlls/winmm/tests/mci.c | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index 5bde3f5dd14..05929d25680 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -528,9 +528,6 @@ static DWORD MCIQTZ_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa wma->thread = NULL; }
- if (!wma->parent) - IVideoWindow_put_Visible(wma->vidwin, OAFALSE); - return 0; }
diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index cc73e083b1f..c8ba5440287 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1509,7 +1509,7 @@ static void test_video_window(void) err = mciSendCommandW(id, MCI_STOP, 0, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err));
- todo_wine ok(IsWindowVisible(video_window), "Video window should be visible.\n"); + 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)); @@ -1519,7 +1519,7 @@ static void test_video_window(void) err = mciSendCommandW(id, MCI_SEEK, MCI_SEEK_TO_START, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err));
- todo_wine ok(IsWindowVisible(video_window), "Video window should be visible.\n"); + 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));
From: Akihiro Sagawa sagawa.aki@gmail.com
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 sagawa.aki@gmail.com --- 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());
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/winmm/tests/mci.c | 45 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+)
diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index bf609a9d26d..d7686ec54b1 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -39,6 +39,7 @@ typedef union { MCI_SYSINFO_PARMSA sys; MCI_SEEK_PARMS seek; MCI_DGV_OPEN_PARMSW dgv_open; + MCI_DGV_WHERE_PARMS where; MCI_GENERIC_PARMS gen; } MCI_PARMS_UNION;
@@ -1537,6 +1538,7 @@ static void test_video_window(void) { HWND parent_window = NULL, hwnd, video_window; DWORD style, expected; + RECT rc, src_rc, win_rc;
winetest_push_context("%u", i);
@@ -1585,6 +1587,49 @@ static void test_video_window(void) todo_wine_if (i != 3) ok(style == expected, "Got style %#lx for window %p, expected %#lx.\n", style, video_window, expected);
+ /* Get the source video size. */ + err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_SOURCE, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + SetRect(&rc, 0, 0, 32, 24); + ok(EqualRect(&parm.where.rc, &rc), "Got source rect %s, expected %s.\n", + wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&rc)); + src_rc = parm.where.rc; + + /* Test the default video destination size. */ + err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + if (style & (WS_POPUP | WS_CHILD)) + rc = src_rc; + else + /* The video destination is stretched to fit the window, + * in particular if the video width is less than SM_CXMIN. */ + GetClientRect(video_window, &rc); + + todo_wine_if (style & (WS_POPUP | WS_CHILD)) + ok(EqualRect(&parm.where.rc, &rc), "Got destination rect %s, expected %s.\n", + wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&rc)); + + /* Test the default video window size. */ + rc = src_rc; + /* Windows is broken and always uses WS_OVERLAPPEDWINDOW regardless of + * the window's actual style. */ + AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE); + OffsetRect(&rc, -rc.left, -rc.top); + rc.right = max(rc.right, GetSystemMetrics(SM_CXMIN)); + + GetWindowRect(video_window, &win_rc); + OffsetRect(&rc, win_rc.left, win_rc.top); + todo_wine_if (testcase[i].style & WS_CHILD) + ok(EqualRect(&rc, &win_rc), "Got window rect %s, expected %s.\n", + wine_dbgstr_rect(&win_rc), wine_dbgstr_rect(&rc)); + + err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_WINDOW, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + win_rc.right -= win_rc.left; + win_rc.bottom -= win_rc.top; + ok(EqualRect(&win_rc, &parm.where.rc), "Got rect %s, expected %s.\n", + wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&win_rc)); + err = mciSendCommandW(id, MCI_STOP, 0, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err));
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/winmm/tests/mci.c | 68 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-)
diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index d7686ec54b1..a0989d542c5 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -39,7 +39,9 @@ typedef union { MCI_SYSINFO_PARMSA sys; MCI_SEEK_PARMS seek; MCI_DGV_OPEN_PARMSW dgv_open; + MCI_DGV_PUT_PARMS put; MCI_DGV_WHERE_PARMS where; + MCI_DGV_WINDOW_PARMSW win; MCI_GENERIC_PARMS gen; } MCI_PARMS_UNION;
@@ -1536,12 +1538,14 @@ static void test_video_window(void)
for (i = 0; i < ARRAY_SIZE(testcase); ++i) { - HWND parent_window = NULL, hwnd, video_window; + HWND parent_window = NULL, hwnd, video_window, main_window; DWORD style, expected; RECT rc, src_rc, win_rc;
winetest_push_context("%u", i);
+ main_window = CreateWindowExA(0, "static", "main", + WS_POPUPWINDOW, 0, 0, 10, 10, 0, 0, 0, NULL); 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); @@ -1645,6 +1649,67 @@ static void test_video_window(void)
ok(IsWindowVisible(video_window), "Video window should be visible.\n");
+ /* Test MCI_DGV_WINDOW_HWND. */ + parm.win.hWnd = main_window; + err = mciSendCommandW(id, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + ok(!IsWindowVisible(main_window), "Main window should be hidden.\n"); + + hwnd = GetWindow(main_window, GW_CHILD); + todo_wine ok(hwnd != video_window, + "Video window (%p) and child window (%p) should be different.\n", video_window, hwnd); + style = GetWindowLongW(hwnd, GWL_STYLE); + expected = WS_CHILD | WS_VISIBLE; + todo_wine ok(style == expected, "Child window %p: got style %#lx, expected %#lx.\n", + hwnd, style, expected); + + style = GetWindowLongW(video_window, GWL_STYLE); + expected = testcase[i].expected_style; + todo_wine ok(style == expected, "Video window %p: got style %#lx, expected %#lx.\n", + video_window, style, expected); + + /* destination size is reset to the source video size */ + err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + todo_wine ok(EqualRect(&parm.where.rc, &src_rc), "Got destination rect %s, expected %s.\n", + wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&src_rc)); + + /* destination size isn't reset unless the destination window is changed */ + SetRect(&rc, 0, 0, src_rc.right * 2, src_rc.bottom / 2); + parm.put.rc = rc; + err = mciSendCommandW(id, MCI_PUT, MCI_DGV_PUT_DESTINATION | MCI_DGV_RECT, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + + parm.win.hWnd = main_window; + err = mciSendCommandW(id, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + ok(!IsWindowVisible(main_window), "Main window should be hidden.\n"); + + err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + todo_wine_if ((testcase[i].style & (WS_CHILD | WS_POPUP)) != WS_CHILD) + ok(EqualRect(&parm.where.rc, &rc), "Got destination rect %s, expected %s.\n", + wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&rc)); + + /* MCI_PLAY shows current video window */ + err = mciSendCommandW(id, MCI_PLAY, 0, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + todo_wine ok(IsWindowVisible(main_window), "Main window should be shown.\n"); + ok(IsWindow(video_window), "Video window should exist.\n"); + ok(!IsWindowVisible(video_window), "Video window should be hidden.\n"); + + /* video window is reset to the default window, which is visible again */ + parm.win.hWnd = NULL; + err = mciSendCommandW(id, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + todo_wine ok(IsWindowVisible(main_window), "Main window should be shown.\n"); + todo_wine ok(IsWindowVisible(video_window), "Video window should be shown.\n"); + + err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + todo_wine ok(EqualRect(&parm.where.rc, &src_rc), "Got destination rect %s, expected %s.\n", + wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&src_rc)); + next: err = mciSendCommandW(id, MCI_CLOSE, 0, 0); ok(!err, "Got %s.\n", dbg_mcierr(err)); @@ -1654,6 +1719,7 @@ next: ret = DestroyWindow(parent_window); ok(ret, "Failed to destroy parent window\n"); } + DestroyWindow(main_window);
winetest_pop_context(); }
From: Akihiro Sagawa sagawa.aki@gmail.com
Now the video renderer window by IVideoWindow always has WS_CHILD style regardless open parameters.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52448 Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 133 ++++++++++++++++++++++++--------- dlls/mciqtz32/mciqtz_private.h | 1 + dlls/winmm/tests/mci.c | 42 +++++------ 3 files changed, 117 insertions(+), 59 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index 05929d25680..2439bfeea62 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -19,6 +19,7 @@ */
#include <stdarg.h> +#include <stdbool.h> #include <math.h> #include "windef.h" #include "winbase.h" @@ -31,6 +32,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(mciqtz);
+static const WCHAR mciqtz_class[] = L"MCIQTZ_Window"; + static DWORD MCIQTZ_mciClose(UINT, DWORD, LPMCI_GENERIC_PARMS); static DWORD MCIQTZ_mciStop(UINT, DWORD, LPMCI_GENERIC_PARMS);
@@ -68,6 +71,24 @@ static WINE_MCIQTZ* MCIQTZ_mciGetOpenDev(UINT wDevID) return wma; }
+static void unregister_class(void) +{ + UnregisterClassW(mciqtz_class, MCIQTZ_hInstance); +} + +static bool register_class(void) +{ + WNDCLASSW class = {0}; + + class.lpfnWndProc = DefWindowProcW; + class.cbWndExtra = sizeof(MCIDEVICEID); + class.hInstance = MCIQTZ_hInstance; + class.hCursor = LoadCursorW(0, (const WCHAR *)IDC_ARROW); + class.lpszClassName = mciqtz_class; + + return RegisterClassW(&class) || GetLastError() == ERROR_CLASS_ALREADY_EXISTS; +} + /************************************************************************** * MCIQTZ_drvOpen [internal] */ @@ -81,6 +102,9 @@ static DWORD MCIQTZ_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp) if (!modp) return 0xFFFFFFFF;
+ if (!register_class()) + return 0; + wma = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MCIQTZ)); if (!wma) return 0; @@ -109,6 +133,7 @@ static DWORD MCIQTZ_drvClose(DWORD dwDevID) /* finish all outstanding things */ MCIQTZ_mciClose(dwDevID, MCI_WAIT, NULL);
+ unregister_class(); mciFreeCommandResource(wma->command_table); mciSetDriverData(dwDevID, 0); CloseHandle(wma->stop_event); @@ -139,6 +164,64 @@ static DWORD MCIQTZ_drvConfigure(DWORD dwDevID) return 1; }
+static bool create_window(WINE_MCIQTZ *wma, DWORD flags, const MCI_DGV_OPEN_PARMSW *params) +{ + DWORD style = (WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN) & ~WS_MAXIMIZEBOX; + LONG width, height, min_width; + HWND parent = NULL; + HRESULT hr; + RECT rc; + + if (flags & MCI_DGV_OPEN_PARENT) + parent = params->hWndParent; + if (flags & MCI_DGV_OPEN_WS) + style = params->dwStyle; + + hr = IBasicVideo_GetVideoSize(wma->vidbasic, &width, &height); + if (hr == E_NOINTERFACE) + return true; /* audio file */ + else if (FAILED(hr)) + { + ERR("Failed to get video size, hr %#lx.\n", hr); + return false; + } + + /* Native always assumes an overlapped window + * when calculating default video window size. */ + SetRect(&rc, 0, 0, width, height); + AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE); + min_width = GetSystemMetrics(SM_CXMIN); + width = max(rc.right - rc.left, min_width); + height = rc.bottom - rc.top; + + wma->window = CreateWindowW(mciqtz_class, params->lpstrElementName, style, + CW_USEDEFAULT, CW_USEDEFAULT, width, height, parent, NULL, MCIQTZ_hInstance, NULL); + + TRACE("device %#x, flags %#lx, style %#lx, parent %p, dimensions %ldx%ld, created window %p.\n", + wma->wDevID, flags, style, parent, width, height, wma->window); + + if (!wma->window) + { + ERR("Failed to create window, error %lu.\n", GetLastError()); + return false; + } + + IVideoWindow_put_AutoShow(wma->vidwin, OAFALSE); + IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)wma->window); + IVideoWindow_put_Owner(wma->vidwin, (OAHWND)wma->window); + IVideoWindow_put_WindowStyle(wma->vidwin, WS_CHILD); /* reset window style */ + + GetClientRect(wma->window, &rc); + width = rc.right; + height = rc.bottom; + + IVideoWindow_SetWindowPosition(wma->vidwin, 0, 0, width, height); + IVideoWindow_put_Visible(wma->vidwin, OATRUE); + wma->parent = wma->window; + + return true; +} + /************************************************************************** * MCIQTZ_mciNotify [internal] * @@ -161,8 +244,6 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags, { WINE_MCIQTZ* wma; HRESULT hr; - DWORD style = 0; - RECT rc = { 0, 0, 0, 0 };
TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpOpenParms);
@@ -238,22 +319,8 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags, goto err; }
- IVideoWindow_put_AutoShow(wma->vidwin, OAFALSE); - IVideoWindow_put_Visible(wma->vidwin, OAFALSE); - if (dwFlags & MCI_DGV_OPEN_WS) - style = lpOpenParms->dwStyle; - if (dwFlags & MCI_DGV_OPEN_PARENT) { - IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)lpOpenParms->hWndParent); - IVideoWindow_put_WindowState(wma->vidwin, SW_HIDE); - IVideoWindow_put_WindowStyle(wma->vidwin, style|WS_CHILD); - IVideoWindow_put_Owner(wma->vidwin, (OAHWND)lpOpenParms->hWndParent); - GetClientRect(lpOpenParms->hWndParent, &rc); - IVideoWindow_SetWindowPosition(wma->vidwin, rc.left, rc.top, rc.right - rc.top, rc.bottom - rc.top); - wma->parent = (HWND)lpOpenParms->hWndParent; - } - else if (style) - IVideoWindow_put_WindowStyle(wma->vidwin, style); - IBasicVideo_GetVideoSize(wma->vidbasic, &rc.right, &rc.bottom); + if (!create_window(wma, dwFlags, lpOpenParms)) + goto err; wma->opened = TRUE;
if (dwFlags & MCI_NOTIFY) @@ -307,6 +374,13 @@ static DWORD MCIQTZ_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL);
if (wma->opened) { + if (wma->window) + { + IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)NULL); + IVideoWindow_put_Owner(wma->vidwin, (OAHWND)NULL); + DestroyWindow(wma->window); + wma->window = NULL; + } IVideoWindow_Release(wma->vidwin); IBasicVideo_Release(wma->vidbasic); IBasicAudio_Release(wma->audio); @@ -447,7 +521,8 @@ static DWORD MCIQTZ_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms return MCIERR_INTERNAL; }
- IVideoWindow_put_Visible(wma->vidwin, OATRUE); + if (wma->parent) + ShowWindow(wma->parent, SW_SHOW);
if (!wma->thread) { @@ -919,21 +994,11 @@ static DWORD MCIQTZ_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMS return 0;
if (dwFlags & MCI_DGV_WINDOW_HWND && (IsWindow(lpParms->hWnd) || !lpParms->hWnd)) { - LONG visible = OATRUE; - LONG style = 0; - TRACE("Setting hWnd to %p\n", lpParms->hWnd); - IVideoWindow_get_Visible(wma->vidwin, &visible); - IVideoWindow_put_Visible(wma->vidwin, OAFALSE); - IVideoWindow_get_WindowStyle(wma->vidwin, &style); - style &= ~WS_CHILD; - if (lpParms->hWnd) - IVideoWindow_put_WindowStyle(wma->vidwin, style|WS_CHILD); - else - IVideoWindow_put_WindowStyle(wma->vidwin, style); - IVideoWindow_put_Owner(wma->vidwin, (OAHWND)lpParms->hWnd); - IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)lpParms->hWnd); - IVideoWindow_put_Visible(wma->vidwin, visible); - wma->parent = lpParms->hWnd; + HWND hwnd = lpParms->hWnd ? lpParms->hWnd : wma->window; + TRACE("Setting parent window to %p.\n", hwnd); + IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)hwnd); + IVideoWindow_put_Owner(wma->vidwin, (OAHWND)hwnd); + wma->parent = hwnd; } if (dwFlags & MCI_DGV_WINDOW_STATE) { TRACE("Setting nCmdShow to %d\n", lpParms->nCmdShow); diff --git a/dlls/mciqtz32/mciqtz_private.h b/dlls/mciqtz32/mciqtz_private.h index aa6fad99326..9206a88b3fa 100644 --- a/dlls/mciqtz32/mciqtz_private.h +++ b/dlls/mciqtz32/mciqtz_private.h @@ -42,6 +42,7 @@ typedef struct { REFERENCE_TIME seek_stop; UINT command_table; HWND parent; + HWND window; MCIDEVICEID notify_devid; HANDLE callback; HANDLE thread; diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index a0989d542c5..ee75a05d9c2 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1566,15 +1566,10 @@ static void test_video_window(void) { 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; + ok(video_window != NULL, "Video window should be shown.\n");
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); + ok(hwnd == parent_window, "Got owner %p, expected %p.\n", hwnd, parent_window); } else { @@ -1588,8 +1583,7 @@ static void test_video_window(void)
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); + ok(style == expected, "Got style %#lx for window %p, expected %#lx.\n", style, video_window, expected);
/* Get the source video size. */ err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_SOURCE, (DWORD_PTR)&parm); @@ -1623,16 +1617,16 @@ static void test_video_window(void)
GetWindowRect(video_window, &win_rc); OffsetRect(&rc, win_rc.left, win_rc.top); - todo_wine_if (testcase[i].style & WS_CHILD) - ok(EqualRect(&rc, &win_rc), "Got window rect %s, expected %s.\n", - wine_dbgstr_rect(&win_rc), wine_dbgstr_rect(&rc)); + ok(EqualRect(&rc, &win_rc), "Got window rect %s, expected %s.\n", + wine_dbgstr_rect(&win_rc), wine_dbgstr_rect(&rc));
err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_WINDOW, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err)); win_rc.right -= win_rc.left; win_rc.bottom -= win_rc.top; - ok(EqualRect(&win_rc, &parm.where.rc), "Got rect %s, expected %s.\n", - wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&win_rc)); + todo_wine_if (!(style & WS_CHILD)) + ok(EqualRect(&win_rc, &parm.where.rc), "Got rect %s, expected %s.\n", + wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&win_rc));
err = mciSendCommandW(id, MCI_STOP, 0, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err)); @@ -1656,11 +1650,11 @@ static void test_video_window(void) ok(!IsWindowVisible(main_window), "Main window should be hidden.\n");
hwnd = GetWindow(main_window, GW_CHILD); - todo_wine ok(hwnd != video_window, - "Video window (%p) and child window (%p) should be different.\n", video_window, hwnd); + ok(hwnd != video_window, "Video window (%p) and child window (%p) should be different.\n", + video_window, hwnd); style = GetWindowLongW(hwnd, GWL_STYLE); expected = WS_CHILD | WS_VISIBLE; - todo_wine ok(style == expected, "Child window %p: got style %#lx, expected %#lx.\n", + ok(style == expected, "Child window %p: got style %#lx, expected %#lx.\n", hwnd, style, expected);
style = GetWindowLongW(video_window, GWL_STYLE); @@ -1687,30 +1681,28 @@ static void test_video_window(void)
err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err)); - todo_wine_if ((testcase[i].style & (WS_CHILD | WS_POPUP)) != WS_CHILD) - ok(EqualRect(&parm.where.rc, &rc), "Got destination rect %s, expected %s.\n", - wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&rc)); + ok(EqualRect(&parm.where.rc, &rc), "Got destination rect %s, expected %s.\n", + wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&rc));
/* MCI_PLAY shows current video window */ err = mciSendCommandW(id, MCI_PLAY, 0, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err)); - todo_wine ok(IsWindowVisible(main_window), "Main window should be shown.\n"); + ok(IsWindowVisible(main_window), "Main window should be shown.\n"); ok(IsWindow(video_window), "Video window should exist.\n"); - ok(!IsWindowVisible(video_window), "Video window should be hidden.\n"); + todo_wine ok(!IsWindowVisible(video_window), "Video window should be hidden.\n");
/* video window is reset to the default window, which is visible again */ parm.win.hWnd = NULL; err = mciSendCommandW(id, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err)); - todo_wine ok(IsWindowVisible(main_window), "Main window should be shown.\n"); - todo_wine ok(IsWindowVisible(video_window), "Video window should be shown.\n"); + ok(IsWindowVisible(main_window), "Main window should be shown.\n"); + ok(IsWindowVisible(video_window), "Video window should be shown.\n");
err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err)); todo_wine ok(EqualRect(&parm.where.rc, &src_rc), "Got destination rect %s, expected %s.\n", wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&src_rc));
-next: err = mciSendCommandW(id, MCI_CLOSE, 0, 0); ok(!err, "Got %s.\n", dbg_mcierr(err));
From: Akihiro Sagawa sagawa.aki@gmail.com
Use parent window dimensions instead of IVideoWindow ones.
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 4 +++- dlls/winmm/tests/mci.c | 5 ++--- 2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index 2439bfeea62..fb941f26a86 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -966,7 +966,9 @@ static DWORD MCIQTZ_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lp rc.bottom -= rc.top; TRACE("MCI_DGV_WHERE_WINDOW_MAX %s\n", wine_dbgstr_rect(&rc)); } else { - IVideoWindow_GetWindowPosition(wma->vidwin, &rc.left, &rc.top, &rc.right, &rc.bottom); + GetWindowRect(wma->parent, &rc); + rc.right -= rc.left; + rc.bottom -= rc.top; TRACE("MCI_DGV_WHERE_WINDOW %s\n", wine_dbgstr_rect(&rc)); } } diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index ee75a05d9c2..c4a92221d0f 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1624,9 +1624,8 @@ static void test_video_window(void) ok(!err, "Got %s.\n", dbg_mcierr(err)); win_rc.right -= win_rc.left; win_rc.bottom -= win_rc.top; - todo_wine_if (!(style & WS_CHILD)) - ok(EqualRect(&win_rc, &parm.where.rc), "Got rect %s, expected %s.\n", - wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&win_rc)); + ok(EqualRect(&win_rc, &parm.where.rc), "Got rect %s, expected %s.\n", + wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&win_rc));
err = mciSendCommandW(id, MCI_STOP, 0, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err));
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 15 ++++++++++++--- dlls/winmm/tests/mci.c | 4 ++-- 2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index fb941f26a86..89f128831b6 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -998,9 +998,18 @@ static DWORD MCIQTZ_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMS if (dwFlags & MCI_DGV_WINDOW_HWND && (IsWindow(lpParms->hWnd) || !lpParms->hWnd)) { HWND hwnd = lpParms->hWnd ? lpParms->hWnd : wma->window; TRACE("Setting parent window to %p.\n", hwnd); - IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)hwnd); - IVideoWindow_put_Owner(wma->vidwin, (OAHWND)hwnd); - wma->parent = hwnd; + if (wma->parent != hwnd) + { + LONG width, height; + + IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)hwnd); + IVideoWindow_put_Owner(wma->vidwin, (OAHWND)hwnd); + + IBasicVideo_GetVideoSize(wma->vidbasic, &width, &height); + IVideoWindow_SetWindowPosition(wma->vidwin, 0, 0, width, height); + + wma->parent = hwnd; + } } if (dwFlags & MCI_DGV_WINDOW_STATE) { TRACE("Setting nCmdShow to %d\n", lpParms->nCmdShow); diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index c4a92221d0f..dc3a4973362 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1664,7 +1664,7 @@ static void test_video_window(void) /* destination size is reset to the source video size */ err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err)); - todo_wine ok(EqualRect(&parm.where.rc, &src_rc), "Got destination rect %s, expected %s.\n", + ok(EqualRect(&parm.where.rc, &src_rc), "Got destination rect %s, expected %s.\n", wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&src_rc));
/* destination size isn't reset unless the destination window is changed */ @@ -1699,7 +1699,7 @@ static void test_video_window(void)
err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err)); - todo_wine ok(EqualRect(&parm.where.rc, &src_rc), "Got destination rect %s, expected %s.\n", + ok(EqualRect(&parm.where.rc, &src_rc), "Got destination rect %s, expected %s.\n", wine_dbgstr_rect(&parm.where.rc), wine_dbgstr_rect(&src_rc));
err = mciSendCommandW(id, MCI_CLOSE, 0, 0);
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 3 +++ dlls/winmm/tests/mci.c | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index 89f128831b6..952015e4c9f 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -1008,6 +1008,9 @@ static DWORD MCIQTZ_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMS IBasicVideo_GetVideoSize(wma->vidbasic, &width, &height); IVideoWindow_SetWindowPosition(wma->vidwin, 0, 0, width, height);
+ if (wma->parent == wma->window) + ShowWindow(wma->window, SW_HIDE); + wma->parent = hwnd; } } diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index dc3a4973362..18dfdf1f74b 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1658,7 +1658,7 @@ static void test_video_window(void)
style = GetWindowLongW(video_window, GWL_STYLE); expected = testcase[i].expected_style; - todo_wine ok(style == expected, "Video window %p: got style %#lx, expected %#lx.\n", + ok(style == expected, "Video window %p: got style %#lx, expected %#lx.\n", video_window, style, expected);
/* destination size is reset to the source video size */ @@ -1688,14 +1688,14 @@ static void test_video_window(void) ok(!err, "Got %s.\n", dbg_mcierr(err)); ok(IsWindowVisible(main_window), "Main window should be shown.\n"); ok(IsWindow(video_window), "Video window should exist.\n"); - todo_wine ok(!IsWindowVisible(video_window), "Video window should be hidden.\n"); + ok(!IsWindowVisible(video_window), "Video window should be hidden.\n");
/* video window is reset to the default window, which is visible again */ parm.win.hWnd = NULL; err = mciSendCommandW(id, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err)); ok(IsWindowVisible(main_window), "Main window should be shown.\n"); - ok(IsWindowVisible(video_window), "Video window should be shown.\n"); + todo_wine ok(IsWindowVisible(video_window), "Video window should be shown.\n");
err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err));
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 2 ++ dlls/winmm/tests/mci.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index 952015e4c9f..ee130b078d5 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -1010,6 +1010,8 @@ static DWORD MCIQTZ_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMS
if (wma->parent == wma->window) ShowWindow(wma->window, SW_HIDE); + else if (hwnd == wma->window) + ShowWindow(wma->window, SW_SHOW);
wma->parent = hwnd; } diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index 18dfdf1f74b..a529b3080d2 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1695,7 +1695,7 @@ static void test_video_window(void) err = mciSendCommandW(id, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err)); ok(IsWindowVisible(main_window), "Main window should be shown.\n"); - todo_wine ok(IsWindowVisible(video_window), "Video window should be shown.\n"); + ok(IsWindowVisible(video_window), "Video window should be shown.\n");
err = mciSendCommandW(id, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (DWORD_PTR)&parm); ok(!err, "Got %s.\n", dbg_mcierr(err));
In v5, - accept Zebediah's some minor stylistic changes.
On Mon Aug 8 22:47:03 2022 +0000, **** wrote:
Zebediah Figura (she/her) replied on the mailing list:
On 8/6/22 04:25, Akihiro Sagawa (@sgwaki) wrote: > In v6, > - Explicitly test the source video size, > - Squash patches regarding the initial video window size (see https://gitlab.winehq.org/wine/wine/-/merge_requests/557#note_5762 for details), > - Swap expected/got message order for consistency. > Thanks. I've pushed this branch with some minor stylistic changes as <https://gitlab.winehq.org/zfigura/wine/-/commits/mciqtz>. If that's acceptable to you, would you mind pushing that over this branch? _______________________________________________ wine-gitlab mailing list -- wine-gitlab@winehq.org To unsubscribe send an email to wine-gitlab-leave@winehq.org
I pushed the branch. Thanks for reviewing and helping.
This merge request was approved by Zebediah Figura.