Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=43367 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=43765 Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/videorenderer.c | 40 +++++++++++++++++++++++++++++-- dlls/strmbase/window.c | 24 +++++++++++++++---- 2 files changed, 57 insertions(+), 7 deletions(-)
diff --git a/dlls/quartz/tests/videorenderer.c b/dlls/quartz/tests/videorenderer.c index a9f938074b..320d8920d1 100644 --- a/dlls/quartz/tests/videorenderer.c +++ b/dlls/quartz/tests/videorenderer.c @@ -1888,10 +1888,27 @@ static void test_video_window_owner(IVideoWindow *window, HWND hwnd, HWND our_hw ok(state == OATRUE, "Got state %d.\n", state); }
+struct notify_message_params +{ + IVideoWindow *window; + HWND hwnd; + UINT message; +}; + +static DWORD CALLBACK notify_message_proc(void *arg) +{ + const struct notify_message_params *params = arg; + HRESULT hr = IVideoWindow_NotifyOwnerMessage(params->window, (OAHWND)params->hwnd, params->message, 0, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + return 0; +} + static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our_hwnd) { + struct notify_message_params params; unsigned int i; OAHWND oahwnd; + HANDLE thread; HRESULT hr; BOOL ret; MSG msg; @@ -1962,14 +1979,33 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); - todo_wine ok(!ret, "Got unexpected status %#x.\n", ret); + ok(!ret, "Got unexpected status %#x.\n", ret);
hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_SETCURSOR, (WPARAM)hwnd, MAKELONG(HTCLIENT, WM_MOUSEMOVE)); ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); - todo_wine ok(!ret, "Got unexpected status %#x.\n", ret); + ok(!ret, "Got unexpected status %#x.\n", ret); + + params.window = window; + params.hwnd = our_hwnd; + params.message = WM_SYSCOLORCHANGE; + thread = CreateThread(NULL, 0, notify_message_proc, ¶ms, 0, NULL); + ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block.\n"); + ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); + ok(ret == ((QS_SENDMESSAGE << 16) | QS_SENDMESSAGE), "Got unexpected status %#x.\n", ret); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + ok(!WaitForSingleObject(thread, 100), "Wait timed out.\n"); + CloseHandle(thread); + + params.message = WM_SETCURSOR; + thread = CreateThread(NULL, 0, notify_message_proc, ¶ms, 0, NULL); + ok(!WaitForSingleObject(thread, 100), "Thread should not block.\n"); + CloseHandle(thread); + ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); + ok(!ret, "Got unexpected status %#x.\n", ret);
hr = IVideoWindow_put_Owner(window, 0); ok(hr == S_OK, "Got hr %#x.\n", hr); diff --git a/dlls/strmbase/window.c b/dlls/strmbase/window.c index be6646c27a..04132aaab1 100644 --- a/dlls/strmbase/window.c +++ b/dlls/strmbase/window.c @@ -654,14 +654,28 @@ HRESULT WINAPI BaseControlWindowImpl_GetWindowPosition(IVideoWindow *iface, LONG return S_OK; }
-HRESULT WINAPI BaseControlWindowImpl_NotifyOwnerMessage(IVideoWindow *iface, OAHWND hwnd, LONG uMsg, LONG_PTR wParam, LONG_PTR lParam) +HRESULT WINAPI BaseControlWindowImpl_NotifyOwnerMessage(IVideoWindow *iface, + OAHWND hwnd, LONG message, LONG_PTR wparam, LONG_PTR lparam) { - BaseControlWindow* This = impl_from_IVideoWindow(iface); + BaseControlWindow *window = impl_from_IVideoWindow(iface);
- TRACE("(%p/%p)->(%08lx, %d, %08lx, %08lx)\n", This, iface, hwnd, uMsg, wParam, lParam); + TRACE("window %p, hwnd %#lx, message %#x, wparam %#lx, lparam %#lx.\n", + window, hwnd, message, wparam, lparam);
- if (!PostMessageW(This->baseWindow.hWnd, uMsg, wParam, lParam)) - return E_FAIL; + /* That these messages are forwarded, and no others, is stated by the + * DirectX documentation, and supported by manual testing. */ + switch (message) + { + case WM_ACTIVATEAPP: + case WM_DEVMODECHANGE: + case WM_DISPLAYCHANGE: + case WM_PALETTECHANGED: + case WM_PALETTEISCHANGING: + case WM_QUERYNEWPALETTE: + case WM_SYSCOLORCHANGE: + SendMessageW(window->baseWindow.hWnd, message, wparam, lparam); + break; + }
return S_OK; }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/vmr7.c | 2 +- dlls/quartz/tests/vmr9.c | 2 +- dlls/quartz/vmr9.c | 50 +++++++++++++--------------------------- 3 files changed, 18 insertions(+), 36 deletions(-)
diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c index d8c22bede5..93c16caede 100644 --- a/dlls/quartz/tests/vmr7.c +++ b/dlls/quartz/tests/vmr7.c @@ -1557,7 +1557,7 @@ static void test_overlay(void) hwnd = (HWND)0xdeadbeef; hr = IOverlay_GetWindowHandle(overlay, &hwnd); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(hwnd && hwnd != (HWND)0xdeadbeef, "Got invalid window %p.\n", hwnd); + ok(hwnd && hwnd != (HWND)0xdeadbeef, "Got invalid window %p.\n", hwnd);
IOverlay_Release(overlay); IPin_Release(pin); diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c index 4acf7cb1d8..128d4abbc6 100644 --- a/dlls/quartz/tests/vmr9.c +++ b/dlls/quartz/tests/vmr9.c @@ -1554,7 +1554,7 @@ static void test_overlay(void) hwnd = (HWND)0xdeadbeef; hr = IOverlay_GetWindowHandle(overlay, &hwnd); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(hwnd && hwnd != (HWND)0xdeadbeef, "Got invalid window %p.\n", hwnd); + ok(hwnd && hwnd != (HWND)0xdeadbeef, "Got invalid window %p.\n", hwnd);
IOverlay_Release(overlay); IPin_Release(pin); diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index adf7d6e11a..98e1822593 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -294,7 +294,7 @@ static HRESULT WINAPI VMR9_DoRenderSample(struct strmbase_renderer *iface, IMedi info.dwFlags |= VMR9Sample_SyncPoint;
/* If we render ourselves, and this is a preroll sample, discard it */ - if (This->baseControlWindow.baseWindow.hWnd && (info.dwFlags & VMR9Sample_Preroll)) + if (info.dwFlags & VMR9Sample_Preroll) { return S_OK; } @@ -374,7 +374,7 @@ static HRESULT VMR9_maybe_init(struct quartz_vmr *This, BOOL force) HRESULT hr;
TRACE("my mode: %u, my window: %p, my last window: %p\n", This->mode, This->baseControlWindow.baseWindow.hWnd, This->hWndClippingWindow); - if (This->baseControlWindow.baseWindow.hWnd || !This->renderer.sink.pin.peer) + if (This->num_surfaces || !This->renderer.sink.pin.peer) return S_OK;
if (This->mode == VMR9Mode_Windowless && !This->hWndClippingWindow) @@ -516,6 +516,7 @@ static void vmr_destroy(struct strmbase_renderer *iface)
CloseHandle(filter->run_event); FreeLibrary(filter->hD3d9); + BaseControlWindow_Destroy(&filter->baseControlWindow); strmbase_renderer_cleanup(&filter->renderer); CoTaskMemFree(filter); } @@ -1506,13 +1507,10 @@ static HRESULT WINAPI VMR7WindowlessControl_SetVideoPosition(IVMRWindowlessContr if (dest) { This->target_rect = *dest; - if (This->baseControlWindow.baseWindow.hWnd) - { - FIXME("Output rectangle: %s\n", wine_dbgstr_rect(dest)); - SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL, - dest->left, dest->top, dest->right - dest->left, dest->bottom-dest->top, - SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOOWNERZORDER|SWP_NOREDRAW); - } + FIXME("Output rectangle: %s.\n", wine_dbgstr_rect(dest)); + SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL, + dest->left, dest->top, dest->right - dest->left, dest->bottom-dest->top, + SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOOWNERZORDER | SWP_NOREDRAW); }
LeaveCriticalSection(&This->renderer.filter.csFilter); @@ -1710,12 +1708,10 @@ static HRESULT WINAPI VMR9WindowlessControl_SetVideoPosition(IVMRWindowlessContr if (dest) { This->target_rect = *dest; - if (This->baseControlWindow.baseWindow.hWnd) - { - FIXME("Output rectangle: %s\n", wine_dbgstr_rect(dest)); - SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL, dest->left, dest->top, dest->right - dest->left, - dest->bottom-dest->top, SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOOWNERZORDER|SWP_NOREDRAW); - } + FIXME("Output rectangle: %s.\n", wine_dbgstr_rect(dest)); + SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL, + dest->left, dest->top, dest->right - dest->left, dest->bottom - dest->top, + SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOOWNERZORDER | SWP_NOREDRAW); }
LeaveCriticalSection(&This->renderer.filter.csFilter); @@ -2247,6 +2243,9 @@ static HRESULT vmr_create(IUnknown *outer, void **out, const CLSID *clsid) if (FAILED(hr)) goto fail;
+ if (FAILED(hr = BaseWindowImpl_PrepareWindow(&pVMR->baseControlWindow.baseWindow))) + goto fail; + hr = strmbase_video_init(&pVMR->baseControlVideo, &pVMR->renderer.filter, &pVMR->renderer.sink.pin, &renderer_BaseControlVideoFuncTable); if (FAILED(hr)) @@ -2261,6 +2260,7 @@ static HRESULT vmr_create(IUnknown *outer, void **out, const CLSID *clsid) return hr;
fail: + BaseWindowImpl_DoneWithWindow(&pVMR->baseControlWindow.baseWindow); strmbase_renderer_cleanup(&pVMR->renderer); FreeLibrary(pVMR->hD3d9); CoTaskMemFree(pVMR); @@ -2590,9 +2590,6 @@ static BOOL CreateRenderingWindow(VMR9DefaultAllocatorPresenterImpl *This, VMR9A
TRACE("(%p)->()\n", This);
- if (FAILED(BaseWindowImpl_PrepareWindow(&This->pVMR9->baseControlWindow.baseWindow))) - return FALSE; - /* Obtain a monitor and d3d9 device */ d3d9_adapter = d3d9_adapter_from_hwnd(This->d3d9_ptr, This->pVMR9->baseControlWindow.baseWindow.hWnd, &This->hMon);
@@ -2608,7 +2605,6 @@ static BOOL CreateRenderingWindow(VMR9DefaultAllocatorPresenterImpl *This, VMR9A if (FAILED(hr)) { ERR("Could not create device: %08x\n", hr); - BaseWindowImpl_DoneWithWindow(&This->pVMR9->baseControlWindow.baseWindow); return FALSE; } IVMRSurfaceAllocatorNotify9_SetD3DDevice(This->SurfaceAllocatorNotify, This->d3d9_dev, This->hMon); @@ -2630,7 +2626,6 @@ static BOOL CreateRenderingWindow(VMR9DefaultAllocatorPresenterImpl *This, VMR9A if (FAILED(hr)) { IVMRSurfaceAllocatorEx9_TerminateDevice(This->pVMR9->allocator, This->pVMR9->cookie); - BaseWindowImpl_DoneWithWindow(&This->pVMR9->baseControlWindow.baseWindow); return FALSE; }
@@ -2662,14 +2657,7 @@ static HRESULT WINAPI VMR9_SurfaceAllocator_InitializeDevice(IVMRSurfaceAllocato
static HRESULT WINAPI VMR9_SurfaceAllocator_TerminateDevice(IVMRSurfaceAllocatorEx9 *iface, DWORD_PTR id) { - VMR9DefaultAllocatorPresenterImpl *This = impl_from_IVMRSurfaceAllocatorEx9(iface); - - if (!This->pVMR9->baseControlWindow.baseWindow.hWnd) - { - return S_OK; - } - - BaseWindowImpl_DoneWithWindow(&This->pVMR9->baseControlWindow.baseWindow); + TRACE("iface %p, id %#lx.\n", iface, id);
return S_OK; } @@ -2684,12 +2672,6 @@ static HRESULT VMR9_SurfaceAllocator_UpdateDeviceReset(VMR9DefaultAllocatorPrese D3DPRESENT_PARAMETERS d3dpp; HRESULT hr;
- if (!This->pVMR9->baseControlWindow.baseWindow.hWnd) - { - ERR("No window\n"); - return E_FAIL; - } - if (!This->d3d9_surfaces || !This->reset) return S_OK;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/vmr7.c | 808 +++++++++++++++++++++++++++++++++++++++ dlls/quartz/tests/vmr9.c | 807 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 1615 insertions(+)
diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c index 93c16caede..fa1ae99856 100644 --- a/dlls/quartz/tests/vmr7.c +++ b/dlls/quartz/tests/vmr7.c @@ -1565,6 +1565,813 @@ static void test_overlay(void) ok(!ref, "Got outstanding refcount %d.\n", ref); }
+/* try to make sure pending X events have been processed before continuing */ +static void flush_events(void) +{ + int diff = 200; + DWORD time; + MSG msg; + + time = GetTickCount() + diff; + while (diff > 0) + { + if (MsgWaitForMultipleObjects(0, NULL, FALSE, 100, QS_ALLINPUT) == WAIT_TIMEOUT) + break; + while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) + DispatchMessageA(&msg); + diff = time - GetTickCount(); + } +} + +static LRESULT CALLBACK window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + if (winetest_debug > 1) + trace("hwnd %p, msg %#x, wparam %#lx, lparam %#lx.\n", hwnd, msg, wparam, lparam); + + if (wparam == 0xdeadbeef) + return 0; + + return DefWindowProcA(hwnd, msg, wparam, lparam); +} + +static void test_video_window_caption(IVideoWindow *window, HWND hwnd) +{ + WCHAR text[50]; + BSTR caption; + HRESULT hr; + + hr = IVideoWindow_get_Caption(window, &caption); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!wcscmp(caption, L"ActiveMovie Window"), "Got caption %s.\n", wine_dbgstr_w(caption)); + SysFreeString(caption); + + GetWindowTextW(hwnd, text, ARRAY_SIZE(text)); + ok(!wcscmp(text, L"ActiveMovie Window"), "Got caption %s.\n", wine_dbgstr_w(text)); + + caption = SysAllocString(L"foo"); + hr = IVideoWindow_put_Caption(window, caption); + ok(hr == S_OK, "Got hr %#x.\n", hr); + SysFreeString(caption); + + hr = IVideoWindow_get_Caption(window, &caption); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!wcscmp(caption, L"foo"), "Got caption %s.\n", wine_dbgstr_w(caption)); + SysFreeString(caption); + + GetWindowTextW(hwnd, text, ARRAY_SIZE(text)); + ok(!wcscmp(text, L"foo"), "Got caption %s.\n", wine_dbgstr_w(text)); +} + +static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hwnd) +{ + HRESULT hr; + LONG style; + + hr = IVideoWindow_get_WindowStyle(window, &style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), + "Got style %#x.\n", style); + + style = GetWindowLongA(hwnd, GWL_STYLE); + todo_wine ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), + "Got style %#x.\n", style); + + hr = IVideoWindow_put_WindowStyle(window, style | WS_DISABLED); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + hr = IVideoWindow_put_WindowStyle(window, style | WS_HSCROLL); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + hr = IVideoWindow_put_WindowStyle(window, style | WS_VSCROLL); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + hr = IVideoWindow_put_WindowStyle(window, style | WS_MAXIMIZE); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + hr = IVideoWindow_put_WindowStyle(window, style | WS_MINIMIZE); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + + hr = IVideoWindow_put_WindowStyle(window, style & ~WS_CLIPCHILDREN); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowStyle(window, &style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); + + style = GetWindowLongA(hwnd, GWL_STYLE); + todo_wine ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); + + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_get_WindowStyleEx(window, &style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == WS_EX_WINDOWEDGE, "Got style %#x.\n", style); + + style = GetWindowLongA(hwnd, GWL_EXSTYLE); + ok(style == WS_EX_WINDOWEDGE, "Got style %#x.\n", style); + + hr = IVideoWindow_put_WindowStyleEx(window, style | WS_EX_TRANSPARENT); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowStyleEx(window, &style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#x.\n", style); + + style = GetWindowLongA(hwnd, GWL_EXSTYLE); + ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#x.\n", style); +} + +static BOOL CALLBACK top_window_cb(HWND hwnd, LPARAM ctx) +{ + DWORD pid; + GetWindowThreadProcessId(hwnd, &pid); + if (pid == GetCurrentProcessId() && (GetWindowLongW(hwnd, GWL_STYLE) & WS_VISIBLE)) + { + *(HWND *)ctx = hwnd; + return FALSE; + } + return TRUE; +} + +static HWND get_top_window(void) +{ + HWND hwnd; + EnumWindows(top_window_cb, (LPARAM)&hwnd); + return hwnd; +} + +static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hwnd) +{ + HRESULT hr; + LONG state; + HWND top; + + SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OAFALSE, "Got state %d.\n", state); + + ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + + hr = IVideoWindow_put_WindowState(window, SW_SHOWNA); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OATRUE, "Got state %d.\n", state); + + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + top = get_top_window(); + ok(top == hwnd, "Got top window %p.\n", top); + + hr = IVideoWindow_put_WindowState(window, SW_MINIMIZE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_MINIMIZE, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OATRUE, "Got state %d.\n", state); + + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + ok(IsIconic(hwnd), "Window should be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_WindowState(window, SW_RESTORE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OATRUE, "Got state %d.\n", state); + + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_WindowState(window, SW_MAXIMIZE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_MAXIMIZE, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OATRUE, "Got state %d.\n", state); + + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + ok(!IsIconic(hwnd), "Window should be minimized.\n"); + ok(IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_WindowState(window, SW_RESTORE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_put_WindowState(window, SW_HIDE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OAFALSE, "Got state %d.\n", state); + + ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_Visible(window, OATRUE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OATRUE, "Got state %d.\n", state); + + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_Visible(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OAFALSE, "Got state %d.\n", state); + + ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_WindowState(window, SW_SHOWNA); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_SetWindowForeground(window, TRUE); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + + SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + hr = IVideoWindow_SetWindowForeground(window, OATRUE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + ok(GetFocus() == hwnd, "Got focus window %p.\n", GetFocus()); + ok(GetForegroundWindow() == hwnd, "Got foreground window %p.\n", GetForegroundWindow()); + top = get_top_window(); + ok(top == hwnd, "Got top window %p.\n", top); + + hr = IVideoWindow_SetWindowForeground(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + ok(GetFocus() == hwnd, "Got focus window %p.\n", GetFocus()); + ok(GetForegroundWindow() == hwnd, "Got foreground window %p.\n", GetForegroundWindow()); + top = get_top_window(); + ok(top == hwnd, "Got top window %p.\n", top); + + SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + hr = IVideoWindow_SetWindowForeground(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + ok(GetFocus() == our_hwnd, "Got focus window %p.\n", GetFocus()); + ok(GetForegroundWindow() == our_hwnd, "Got foreground window %p.\n", GetForegroundWindow()); + top = get_top_window(); + ok(top == hwnd, "Got top window %p.\n", top); +} + +static void test_video_window_position(IVideoWindow *window, HWND hwnd, HWND our_hwnd) +{ + LONG left, width, top, height, expect_width, expect_height; + RECT rect = {0, 0, 600, 400}; + HWND top_hwnd; + HRESULT hr; + + SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + + AdjustWindowRect(&rect, GetWindowLongA(hwnd, GWL_STYLE), FALSE); + expect_width = rect.right - rect.left; + expect_height = rect.bottom - rect.top; + + hr = IVideoWindow_put_Left(window, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IVideoWindow_put_Top(window, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Left(window, &left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 0, "Got left %d.\n", left); + hr = IVideoWindow_get_Top(window, &top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); + hr = IVideoWindow_get_Width(window, &width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + hr = IVideoWindow_get_Height(window, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(height == expect_height, "Got height %d.\n", height); + hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 0, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + todo_wine ok(height == expect_height, "Got height %d.\n", height); + GetWindowRect(hwnd, &rect); + ok(rect.left == 0, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + todo_wine ok(rect.right == expect_width, "Got window right %d.\n", rect.right); + todo_wine ok(rect.bottom == expect_height, "Got window bottom %d.\n", rect.bottom); + + hr = IVideoWindow_put_Left(window, 10); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Left(window, &left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + hr = IVideoWindow_get_Top(window, &top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); + hr = IVideoWindow_get_Width(window, &width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + hr = IVideoWindow_get_Height(window, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(height == expect_height, "Got height %d.\n", height); + hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + todo_wine ok(height == expect_height, "Got height %d.\n", height); + GetWindowRect(hwnd, &rect); + ok(rect.left == 10, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + todo_wine ok(rect.right == 10 + expect_width, "Got window right %d.\n", rect.right); + todo_wine ok(rect.bottom == expect_height, "Got window bottom %d.\n", rect.bottom); + + hr = IVideoWindow_put_Height(window, 200); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Left(window, &left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + hr = IVideoWindow_get_Top(window, &top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); + hr = IVideoWindow_get_Width(window, &width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + hr = IVideoWindow_get_Height(window, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == 200, "Got height %d.\n", height); + hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + ok(height == 200, "Got height %d.\n", height); + GetWindowRect(hwnd, &rect); + ok(rect.left == 10, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + todo_wine ok(rect.right == 10 + expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == 200, "Got window bottom %d.\n", rect.bottom); + + hr = IVideoWindow_SetWindowPosition(window, 100, 200, 300, 400); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Left(window, &left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 100, "Got left %d.\n", left); + hr = IVideoWindow_get_Top(window, &top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 200, "Got top %d.\n", top); + hr = IVideoWindow_get_Width(window, &width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 300, "Got width %d.\n", width); + hr = IVideoWindow_get_Height(window, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == 400, "Got height %d.\n", height); + hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 100, "Got left %d.\n", left); + ok(top == 200, "Got top %d.\n", top); + ok(width == 300, "Got width %d.\n", width); + ok(height == 400, "Got height %d.\n", height); + GetWindowRect(hwnd, &rect); + ok(rect.left == 100, "Got window left %d.\n", rect.left); + ok(rect.top == 200, "Got window top %d.\n", rect.top); + ok(rect.right == 400, "Got window right %d.\n", rect.right); + ok(rect.bottom == 600, "Got window bottom %d.\n", rect.bottom); + + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + top_hwnd = get_top_window(); + ok(top_hwnd == our_hwnd, "Got top window %p.\n", top_hwnd); +} + +static void test_video_window_owner(IVideoWindow *window, HWND hwnd, HWND our_hwnd) +{ + HWND parent, top_hwnd; + LONG style, state; + OAHWND oahwnd; + HRESULT hr; + + SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + + hr = IVideoWindow_get_Owner(window, &oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got owner %#lx.\n", oahwnd); + + parent = GetAncestor(hwnd, GA_PARENT); + ok(parent == GetDesktopWindow(), "Got parent %p.\n", parent); + style = GetWindowLongA(hwnd, GWL_STYLE); + ok(!(style & WS_CHILD), "Got style %#x.\n", style); + + hr = IVideoWindow_put_Owner(window, (OAHWND)our_hwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Owner(window, &oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(oahwnd == (OAHWND)our_hwnd, "Got owner %#lx.\n", oahwnd); + + parent = GetAncestor(hwnd, GA_PARENT); + ok(parent == our_hwnd, "Got parent %p.\n", parent); + style = GetWindowLongA(hwnd, GWL_STYLE); + ok((style & WS_CHILD), "Got style %#x.\n", style); + + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + top_hwnd = get_top_window(); + ok(top_hwnd == our_hwnd, "Got top window %p.\n", top_hwnd); + + ShowWindow(our_hwnd, SW_HIDE); + + hr = IVideoWindow_put_Visible(window, OATRUE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Visible(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == OAFALSE, "Got state %d.\n", state); + + hr = IVideoWindow_put_Owner(window, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Owner(window, &oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got owner %#lx.\n", oahwnd); + + parent = GetAncestor(hwnd, GA_PARENT); + ok(parent == GetDesktopWindow(), "Got parent %p.\n", parent); + style = GetWindowLongA(hwnd, GWL_STYLE); + ok(!(style & WS_CHILD), "Got style %#x.\n", style); + + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + top_hwnd = get_top_window(); + ok(top_hwnd == hwnd, "Got top window %p.\n", top_hwnd); + + hr = IVideoWindow_get_Visible(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == OATRUE, "Got state %d.\n", state); +} + +struct notify_message_params +{ + IVideoWindow *window; + HWND hwnd; + UINT message; +}; + +static DWORD CALLBACK notify_message_proc(void *arg) +{ + const struct notify_message_params *params = arg; + HRESULT hr = IVideoWindow_NotifyOwnerMessage(params->window, (OAHWND)params->hwnd, params->message, 0, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + return 0; +} + +static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our_hwnd) +{ + struct notify_message_params params; + unsigned int i; + OAHWND oahwnd; + HANDLE thread; + HRESULT hr; + BOOL ret; + MSG msg; + + static UINT drain_tests[] = + { + WM_MOUSEACTIVATE, + WM_NCLBUTTONDOWN, + WM_NCLBUTTONUP, + WM_NCLBUTTONDBLCLK, + WM_NCRBUTTONDOWN, + WM_NCRBUTTONUP, + WM_NCRBUTTONDBLCLK, + WM_NCMBUTTONDOWN, + WM_NCMBUTTONUP, + WM_NCMBUTTONDBLCLK, + WM_KEYDOWN, + WM_KEYUP, + WM_MOUSEMOVE, + WM_LBUTTONDOWN, + WM_LBUTTONUP, + WM_LBUTTONDBLCLK, + WM_RBUTTONDOWN, + WM_RBUTTONUP, + WM_RBUTTONDBLCLK, + WM_MBUTTONDOWN, + WM_MBUTTONUP, + WM_MBUTTONDBLCLK, + }; + + flush_events(); + + hr = IVideoWindow_get_MessageDrain(window, &oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got window %#lx.\n", oahwnd); + + hr = IVideoWindow_put_MessageDrain(window, (OAHWND)our_hwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_MessageDrain(window, &oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(oahwnd == (OAHWND)our_hwnd, "Got window %#lx.\n", oahwnd); + + for (i = 0; i < ARRAY_SIZE(drain_tests); ++i) + { + SendMessageA(hwnd, drain_tests[i], 0xdeadbeef, 0); + ret = PeekMessageA(&msg, 0, drain_tests[i], drain_tests[i], PM_REMOVE); + ok(ret, "Expected a message.\n"); + ok(msg.hwnd == our_hwnd, "Got hwnd %p.\n", msg.hwnd); + ok(msg.message == drain_tests[i], "Got message %#x.\n", msg.message); + ok(msg.wParam == 0xdeadbeef, "Got wparam %#lx.\n", msg.wParam); + ok(!msg.lParam, "Got lparam %#lx.\n", msg.lParam); + DispatchMessageA(&msg); + + ret = PeekMessageA(&msg, 0, drain_tests[i], drain_tests[i], PM_REMOVE); + ok(!ret, "Got unexpected message %#x.\n", msg.message); + } + + hr = IVideoWindow_put_MessageDrain(window, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_put_Owner(window, (OAHWND)our_hwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + flush_events(); + + hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_SYSCOLORCHANGE, 0, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); + ok(!ret, "Got unexpected status %#x.\n", ret); + + hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_SETCURSOR, + (WPARAM)hwnd, MAKELONG(HTCLIENT, WM_MOUSEMOVE)); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); + ok(!ret, "Got unexpected status %#x.\n", ret); + + params.window = window; + params.hwnd = our_hwnd; + params.message = WM_SYSCOLORCHANGE; + thread = CreateThread(NULL, 0, notify_message_proc, ¶ms, 0, NULL); + ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block.\n"); + ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); + ok(ret == ((QS_SENDMESSAGE << 16) | QS_SENDMESSAGE), "Got unexpected status %#x.\n", ret); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + ok(!WaitForSingleObject(thread, 100), "Wait timed out.\n"); + CloseHandle(thread); + + params.message = WM_SETCURSOR; + thread = CreateThread(NULL, 0, notify_message_proc, ¶ms, 0, NULL); + ok(!WaitForSingleObject(thread, 100), "Thread should not block.\n"); + CloseHandle(thread); + ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); + ok(!ret, "Got unexpected status %#x.\n", ret); + + hr = IVideoWindow_put_Owner(window, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); +} + +static void test_video_window_autoshow(IVideoWindow *window, IFilterGraph2 *graph, HWND hwnd) +{ + IMediaControl *control; + HRESULT hr; + LONG l; + + IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + + hr = IVideoWindow_get_AutoShow(window, &l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); + + hr = IVideoWindow_put_Visible(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IMediaControl_Pause(control); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Visible(window, &l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(l == OATRUE, "Got %d.\n", l); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Visible(window, &l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(l == OATRUE, "Got %d.\n", l); + + hr = IVideoWindow_put_AutoShow(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_put_Visible(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IMediaControl_Pause(control); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Visible(window, &l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OAFALSE, "Got %d.\n", l); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + IMediaControl_Release(control); +} + +static void test_video_window(void) +{ + ALLOCATOR_PROPERTIES req_props = {1, 600 * 400 * 4, 1, 0}, ret_props; + VIDEOINFOHEADER vih = + { + .bmiHeader.biSize = sizeof(BITMAPINFOHEADER), + .bmiHeader.biBitCount = 32, + .bmiHeader.biWidth = 600, + .bmiHeader.biHeight = 400, + .bmiHeader.biPlanes = 1, + .bmiHeader.biCompression = BI_RGB, + }; + AM_MEDIA_TYPE req_mt = + { + .majortype = MEDIATYPE_Video, + .subtype = MEDIASUBTYPE_RGB32, + .formattype = FORMAT_VideoInfo, + .cbFormat = sizeof(vih), + .pbFormat = (BYTE *)&vih, + }; + IFilterGraph2 *graph = create_graph(); + WNDCLASSA window_class = {0}; + struct testfilter source; + IMemAllocator *allocator; + IMediaControl *control; + LONG width, height, l; + IVideoWindow *window; + IMemInputPin *input; + IBaseFilter *filter; + HWND hwnd, our_hwnd; + IOverlay *overlay; + BSTR caption; + HRESULT hr; + DWORD tid; + ULONG ref; + IPin *pin; + RECT rect; + + window_class.lpszClassName = "wine_test_class"; + window_class.lpfnWndProc = window_proc; + RegisterClassA(&window_class); + our_hwnd = CreateWindowA("wine_test_class", "test window", WS_VISIBLE | WS_OVERLAPPEDWINDOW, + 100, 200, 300, 400, NULL, NULL, NULL, NULL); + flush_events(); + + filter = create_vmr7(0); + flush_events(); + + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + IBaseFilter_FindPin(filter, L"VMR Input0", &pin); + IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&input); + + hr = IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IOverlay_GetWindowHandle(overlay, &hwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + if (winetest_debug > 1) trace("ours %p, theirs %p\n", our_hwnd, hwnd); + GetWindowRect(hwnd, &rect); + + tid = GetWindowThreadProcessId(hwnd, NULL); + ok(tid == GetCurrentThreadId(), "Expected tid %#x, got %#x.\n", GetCurrentThreadId(), tid); + + hr = IBaseFilter_QueryInterface(filter, &IID_IVideoWindow, (void **)&window); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Caption(window, &caption); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowStyle(window, &l); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_AutoShow(window, &l); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); + + testfilter_init(&source); + IFilterGraph2_AddFilter(graph, &source.filter.IBaseFilter_iface, NULL); + IFilterGraph2_AddFilter(graph, filter, NULL); + hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); + if (hr == VFW_E_TYPE_NOT_ACCEPTED) /* w7u */ + { + req_mt.subtype = MEDIASUBTYPE_RGB24; + vih.bmiHeader.biBitCount = 24; + req_props.cbBuffer = 32 * 16 * 3; + hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); + } + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IMemInputPin_GetAllocator(input, &allocator); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + if (hr == S_OK) + { + hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); + hr = IMemAllocator_Commit(allocator); + ok(hr == S_OK, "Got hr %#x.\n", hr); + IMemAllocator_Release(allocator); + } + + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + test_video_window_caption(window, hwnd); + test_video_window_style(window, hwnd, our_hwnd); + test_video_window_state(window, hwnd, our_hwnd); + test_video_window_position(window, hwnd, our_hwnd); + test_video_window_autoshow(window, graph, hwnd); + test_video_window_owner(window, hwnd, our_hwnd); + test_video_window_messages(window, hwnd, our_hwnd); + + hr = IVideoWindow_put_FullScreenMode(window, OATRUE); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); + hr = IVideoWindow_get_FullScreenMode(window, &l); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); + + hr = IVideoWindow_GetMinIdealImageSize(window, &width, &height); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); + hr = IVideoWindow_GetMaxIdealImageSize(window, &width, &height); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); + + IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + + hr = IMediaControl_Pause(control); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IVideoWindow_GetMinIdealImageSize(window, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 600, "Got width %d.\n", width); + ok(height == 400, "Got height %d.\n", height); + hr = IVideoWindow_GetMaxIdealImageSize(window, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 600, "Got width %d.\n", width); + ok(height == 400, "Got height %d.\n", height); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + IMediaControl_Release(control); + IFilterGraph2_Release(graph); + IVideoWindow_Release(window); + IOverlay_Release(overlay); + IMemInputPin_Release(input); + IPin_Release(pin); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); + ok(!ref, "Got outstanding refcount %d.\n", ref); + DestroyWindow(our_hwnd); +} + START_TEST(vmr7) { CoInitialize(NULL); @@ -1580,6 +2387,7 @@ START_TEST(vmr7) test_unconnected_filter_state(); test_connect_pin(); test_overlay(); + test_video_window();
CoUninitialize(); } diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c index 128d4abbc6..3c5986e1f5 100644 --- a/dlls/quartz/tests/vmr9.c +++ b/dlls/quartz/tests/vmr9.c @@ -1562,6 +1562,812 @@ static void test_overlay(void) ok(!ref, "Got outstanding refcount %d.\n", ref); }
+/* try to make sure pending X events have been processed before continuing */ +static void flush_events(void) +{ + int diff = 200; + DWORD time; + MSG msg; + + time = GetTickCount() + diff; + while (diff > 0) + { + if (MsgWaitForMultipleObjects(0, NULL, FALSE, 100, QS_ALLINPUT) == WAIT_TIMEOUT) + break; + while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) + DispatchMessageA(&msg); + diff = time - GetTickCount(); + } +} + +static LRESULT CALLBACK window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + if (winetest_debug > 1) + trace("hwnd %p, msg %#x, wparam %#lx, lparam %#lx.\n", hwnd, msg, wparam, lparam); + + if (wparam == 0xdeadbeef) + return 0; + + return DefWindowProcA(hwnd, msg, wparam, lparam); +} + +static void test_video_window_caption(IVideoWindow *window, HWND hwnd) +{ + WCHAR text[50]; + BSTR caption; + HRESULT hr; + + hr = IVideoWindow_get_Caption(window, &caption); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!wcscmp(caption, L"ActiveMovie Window"), "Got caption %s.\n", wine_dbgstr_w(caption)); + SysFreeString(caption); + + GetWindowTextW(hwnd, text, ARRAY_SIZE(text)); + ok(!wcscmp(text, L"ActiveMovie Window"), "Got caption %s.\n", wine_dbgstr_w(text)); + + caption = SysAllocString(L"foo"); + hr = IVideoWindow_put_Caption(window, caption); + ok(hr == S_OK, "Got hr %#x.\n", hr); + SysFreeString(caption); + + hr = IVideoWindow_get_Caption(window, &caption); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!wcscmp(caption, L"foo"), "Got caption %s.\n", wine_dbgstr_w(caption)); + SysFreeString(caption); + + GetWindowTextW(hwnd, text, ARRAY_SIZE(text)); + ok(!wcscmp(text, L"foo"), "Got caption %s.\n", wine_dbgstr_w(text)); +} + +static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hwnd) +{ + HRESULT hr; + LONG style; + + hr = IVideoWindow_get_WindowStyle(window, &style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), + "Got style %#x.\n", style); + + style = GetWindowLongA(hwnd, GWL_STYLE); + todo_wine ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), + "Got style %#x.\n", style); + + hr = IVideoWindow_put_WindowStyle(window, style | WS_DISABLED); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + hr = IVideoWindow_put_WindowStyle(window, style | WS_HSCROLL); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + hr = IVideoWindow_put_WindowStyle(window, style | WS_VSCROLL); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + hr = IVideoWindow_put_WindowStyle(window, style | WS_MAXIMIZE); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + hr = IVideoWindow_put_WindowStyle(window, style | WS_MINIMIZE); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + + hr = IVideoWindow_put_WindowStyle(window, style & ~WS_CLIPCHILDREN); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowStyle(window, &style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); + + style = GetWindowLongA(hwnd, GWL_STYLE); + todo_wine ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); + + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_get_WindowStyleEx(window, &style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == WS_EX_WINDOWEDGE, "Got style %#x.\n", style); + + style = GetWindowLongA(hwnd, GWL_EXSTYLE); + ok(style == WS_EX_WINDOWEDGE, "Got style %#x.\n", style); + + hr = IVideoWindow_put_WindowStyleEx(window, style | WS_EX_TRANSPARENT); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowStyleEx(window, &style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#x.\n", style); + + style = GetWindowLongA(hwnd, GWL_EXSTYLE); + ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#x.\n", style); +} + +static BOOL CALLBACK top_window_cb(HWND hwnd, LPARAM ctx) +{ + DWORD pid; + GetWindowThreadProcessId(hwnd, &pid); + if (pid == GetCurrentProcessId() && (GetWindowLongW(hwnd, GWL_STYLE) & WS_VISIBLE)) + { + *(HWND *)ctx = hwnd; + return FALSE; + } + return TRUE; +} + +static HWND get_top_window(void) +{ + HWND hwnd; + EnumWindows(top_window_cb, (LPARAM)&hwnd); + return hwnd; +} + +static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hwnd) +{ + HRESULT hr; + LONG state; + HWND top; + + SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OAFALSE, "Got state %d.\n", state); + + ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + + hr = IVideoWindow_put_WindowState(window, SW_SHOWNA); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OATRUE, "Got state %d.\n", state); + + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + top = get_top_window(); + ok(top == hwnd, "Got top window %p.\n", top); + + hr = IVideoWindow_put_WindowState(window, SW_MINIMIZE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_MINIMIZE, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OATRUE, "Got state %d.\n", state); + + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + ok(IsIconic(hwnd), "Window should be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_WindowState(window, SW_RESTORE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OATRUE, "Got state %d.\n", state); + + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_WindowState(window, SW_MAXIMIZE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_MAXIMIZE, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OATRUE, "Got state %d.\n", state); + + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + ok(!IsIconic(hwnd), "Window should be minimized.\n"); + ok(IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_WindowState(window, SW_RESTORE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_put_WindowState(window, SW_HIDE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OAFALSE, "Got state %d.\n", state); + + ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_Visible(window, OATRUE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OATRUE, "Got state %d.\n", state); + + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_Visible(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowState(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); + + hr = IVideoWindow_get_Visible(window, &state); + ok(state == OAFALSE, "Got state %d.\n", state); + + ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); + ok(!IsIconic(hwnd), "Window should not be minimized.\n"); + ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + hr = IVideoWindow_put_WindowState(window, SW_SHOWNA); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_SetWindowForeground(window, TRUE); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + + SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + hr = IVideoWindow_SetWindowForeground(window, OATRUE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + ok(GetFocus() == hwnd, "Got focus window %p.\n", GetFocus()); + ok(GetForegroundWindow() == hwnd, "Got foreground window %p.\n", GetForegroundWindow()); + top = get_top_window(); + ok(top == hwnd, "Got top window %p.\n", top); + + hr = IVideoWindow_SetWindowForeground(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + ok(GetFocus() == hwnd, "Got focus window %p.\n", GetFocus()); + ok(GetForegroundWindow() == hwnd, "Got foreground window %p.\n", GetForegroundWindow()); + top = get_top_window(); + ok(top == hwnd, "Got top window %p.\n", top); + + SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + hr = IVideoWindow_SetWindowForeground(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + ok(GetFocus() == our_hwnd, "Got focus window %p.\n", GetFocus()); + ok(GetForegroundWindow() == our_hwnd, "Got foreground window %p.\n", GetForegroundWindow()); + top = get_top_window(); + ok(top == hwnd, "Got top window %p.\n", top); +} + +static void test_video_window_position(IVideoWindow *window, HWND hwnd, HWND our_hwnd) +{ + LONG left, width, top, height, expect_width, expect_height; + RECT rect = {0, 0, 600, 400}; + HWND top_hwnd; + HRESULT hr; + + SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + + AdjustWindowRect(&rect, GetWindowLongA(hwnd, GWL_STYLE), FALSE); + expect_width = rect.right - rect.left; + expect_height = rect.bottom - rect.top; + + hr = IVideoWindow_put_Left(window, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IVideoWindow_put_Top(window, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Left(window, &left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 0, "Got left %d.\n", left); + hr = IVideoWindow_get_Top(window, &top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); + hr = IVideoWindow_get_Width(window, &width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + hr = IVideoWindow_get_Height(window, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(height == expect_height, "Got height %d.\n", height); + hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 0, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + todo_wine ok(height == expect_height, "Got height %d.\n", height); + GetWindowRect(hwnd, &rect); + ok(rect.left == 0, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + todo_wine ok(rect.right == expect_width, "Got window right %d.\n", rect.right); + todo_wine ok(rect.bottom == expect_height, "Got window bottom %d.\n", rect.bottom); + + hr = IVideoWindow_put_Left(window, 10); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Left(window, &left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + hr = IVideoWindow_get_Top(window, &top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); + hr = IVideoWindow_get_Width(window, &width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + hr = IVideoWindow_get_Height(window, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(height == expect_height, "Got height %d.\n", height); + hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + todo_wine ok(height == expect_height, "Got height %d.\n", height); + GetWindowRect(hwnd, &rect); + ok(rect.left == 10, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + todo_wine ok(rect.right == 10 + expect_width, "Got window right %d.\n", rect.right); + todo_wine ok(rect.bottom == expect_height, "Got window bottom %d.\n", rect.bottom); + + hr = IVideoWindow_put_Height(window, 200); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Left(window, &left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + hr = IVideoWindow_get_Top(window, &top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); + hr = IVideoWindow_get_Width(window, &width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + hr = IVideoWindow_get_Height(window, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == 200, "Got height %d.\n", height); + hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + todo_wine ok(width == expect_width, "Got width %d.\n", width); + ok(height == 200, "Got height %d.\n", height); + GetWindowRect(hwnd, &rect); + ok(rect.left == 10, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + todo_wine ok(rect.right == 10 + expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == 200, "Got window bottom %d.\n", rect.bottom); + + hr = IVideoWindow_SetWindowPosition(window, 100, 200, 300, 400); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Left(window, &left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 100, "Got left %d.\n", left); + hr = IVideoWindow_get_Top(window, &top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 200, "Got top %d.\n", top); + hr = IVideoWindow_get_Width(window, &width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 300, "Got width %d.\n", width); + hr = IVideoWindow_get_Height(window, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == 400, "Got height %d.\n", height); + hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 100, "Got left %d.\n", left); + ok(top == 200, "Got top %d.\n", top); + ok(width == 300, "Got width %d.\n", width); + ok(height == 400, "Got height %d.\n", height); + GetWindowRect(hwnd, &rect); + ok(rect.left == 100, "Got window left %d.\n", rect.left); + ok(rect.top == 200, "Got window top %d.\n", rect.top); + ok(rect.right == 400, "Got window right %d.\n", rect.right); + ok(rect.bottom == 600, "Got window bottom %d.\n", rect.bottom); + + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + top_hwnd = get_top_window(); + ok(top_hwnd == our_hwnd, "Got top window %p.\n", top_hwnd); +} + +static void test_video_window_owner(IVideoWindow *window, HWND hwnd, HWND our_hwnd) +{ + HWND parent, top_hwnd; + LONG style, state; + OAHWND oahwnd; + HRESULT hr; + + SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + + hr = IVideoWindow_get_Owner(window, &oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got owner %#lx.\n", oahwnd); + + parent = GetAncestor(hwnd, GA_PARENT); + ok(parent == GetDesktopWindow(), "Got parent %p.\n", parent); + style = GetWindowLongA(hwnd, GWL_STYLE); + ok(!(style & WS_CHILD), "Got style %#x.\n", style); + + hr = IVideoWindow_put_Owner(window, (OAHWND)our_hwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Owner(window, &oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(oahwnd == (OAHWND)our_hwnd, "Got owner %#lx.\n", oahwnd); + + parent = GetAncestor(hwnd, GA_PARENT); + ok(parent == our_hwnd, "Got parent %p.\n", parent); + style = GetWindowLongA(hwnd, GWL_STYLE); + ok((style & WS_CHILD), "Got style %#x.\n", style); + + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + top_hwnd = get_top_window(); + ok(top_hwnd == our_hwnd, "Got top window %p.\n", top_hwnd); + + ShowWindow(our_hwnd, SW_HIDE); + + hr = IVideoWindow_put_Visible(window, OATRUE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Visible(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == OAFALSE, "Got state %d.\n", state); + + hr = IVideoWindow_put_Owner(window, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Owner(window, &oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got owner %#lx.\n", oahwnd); + + parent = GetAncestor(hwnd, GA_PARENT); + ok(parent == GetDesktopWindow(), "Got parent %p.\n", parent); + style = GetWindowLongA(hwnd, GWL_STYLE); + ok(!(style & WS_CHILD), "Got style %#x.\n", style); + + ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); + top_hwnd = get_top_window(); + ok(top_hwnd == hwnd, "Got top window %p.\n", top_hwnd); + + hr = IVideoWindow_get_Visible(window, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == OATRUE, "Got state %d.\n", state); +} + +struct notify_message_params +{ + IVideoWindow *window; + HWND hwnd; + UINT message; +}; + +static DWORD CALLBACK notify_message_proc(void *arg) +{ + const struct notify_message_params *params = arg; + HRESULT hr = IVideoWindow_NotifyOwnerMessage(params->window, (OAHWND)params->hwnd, params->message, 0, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + return 0; +} + +static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our_hwnd) +{ + struct notify_message_params params; + unsigned int i; + OAHWND oahwnd; + HANDLE thread; + HRESULT hr; + BOOL ret; + MSG msg; + + static UINT drain_tests[] = + { + WM_MOUSEACTIVATE, + WM_NCLBUTTONDOWN, + WM_NCLBUTTONUP, + WM_NCLBUTTONDBLCLK, + WM_NCRBUTTONDOWN, + WM_NCRBUTTONUP, + WM_NCRBUTTONDBLCLK, + WM_NCMBUTTONDOWN, + WM_NCMBUTTONUP, + WM_NCMBUTTONDBLCLK, + WM_KEYDOWN, + WM_KEYUP, + WM_MOUSEMOVE, + WM_LBUTTONDOWN, + WM_LBUTTONUP, + WM_LBUTTONDBLCLK, + WM_RBUTTONDOWN, + WM_RBUTTONUP, + WM_RBUTTONDBLCLK, + WM_MBUTTONDOWN, + WM_MBUTTONUP, + WM_MBUTTONDBLCLK, + }; + + flush_events(); + + hr = IVideoWindow_get_MessageDrain(window, &oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got window %#lx.\n", oahwnd); + + hr = IVideoWindow_put_MessageDrain(window, (OAHWND)our_hwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_MessageDrain(window, &oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(oahwnd == (OAHWND)our_hwnd, "Got window %#lx.\n", oahwnd); + + for (i = 0; i < ARRAY_SIZE(drain_tests); ++i) + { + SendMessageA(hwnd, drain_tests[i], 0xdeadbeef, 0); + ret = PeekMessageA(&msg, 0, drain_tests[i], drain_tests[i], PM_REMOVE); + ok(ret, "Expected a message.\n"); + ok(msg.hwnd == our_hwnd, "Got hwnd %p.\n", msg.hwnd); + ok(msg.message == drain_tests[i], "Got message %#x.\n", msg.message); + ok(msg.wParam == 0xdeadbeef, "Got wparam %#lx.\n", msg.wParam); + ok(!msg.lParam, "Got lparam %#lx.\n", msg.lParam); + DispatchMessageA(&msg); + + ret = PeekMessageA(&msg, 0, drain_tests[i], drain_tests[i], PM_REMOVE); + ok(!ret, "Got unexpected message %#x.\n", msg.message); + } + + hr = IVideoWindow_put_MessageDrain(window, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_put_Owner(window, (OAHWND)our_hwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + flush_events(); + + hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_SYSCOLORCHANGE, 0, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); + ok(!ret, "Got unexpected status %#x.\n", ret); + + hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_SETCURSOR, + (WPARAM)hwnd, MAKELONG(HTCLIENT, WM_MOUSEMOVE)); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); + ok(!ret, "Got unexpected status %#x.\n", ret); + + params.window = window; + params.hwnd = our_hwnd; + params.message = WM_SYSCOLORCHANGE; + thread = CreateThread(NULL, 0, notify_message_proc, ¶ms, 0, NULL); + ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block.\n"); + ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); + ok(ret == ((QS_SENDMESSAGE << 16) | QS_SENDMESSAGE), "Got unexpected status %#x.\n", ret); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + ok(!WaitForSingleObject(thread, 100), "Wait timed out.\n"); + CloseHandle(thread); + + params.message = WM_SETCURSOR; + thread = CreateThread(NULL, 0, notify_message_proc, ¶ms, 0, NULL); + ok(!WaitForSingleObject(thread, 100), "Thread should not block.\n"); + CloseHandle(thread); + ret = GetQueueStatus(QS_SENDMESSAGE | QS_POSTMESSAGE); + ok(!ret, "Got unexpected status %#x.\n", ret); + + hr = IVideoWindow_put_Owner(window, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); +} + +static void test_video_window_autoshow(IVideoWindow *window, IFilterGraph2 *graph, HWND hwnd) +{ + IMediaControl *control; + HRESULT hr; + LONG l; + + IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + + hr = IVideoWindow_get_AutoShow(window, &l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); + + hr = IVideoWindow_put_Visible(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IMediaControl_Pause(control); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Visible(window, &l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(l == OATRUE, "Got %d.\n", l); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Visible(window, &l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(l == OATRUE, "Got %d.\n", l); + + hr = IVideoWindow_put_AutoShow(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_put_Visible(window, OAFALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IMediaControl_Pause(control); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Visible(window, &l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OAFALSE, "Got %d.\n", l); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + IMediaControl_Release(control); +} + +static void test_video_window(void) +{ + ALLOCATOR_PROPERTIES req_props = {1, 600 * 400 * 4, 1, 0}, ret_props; + VIDEOINFOHEADER vih = + { + .bmiHeader.biSize = sizeof(BITMAPINFOHEADER), + .bmiHeader.biBitCount = 32, + .bmiHeader.biWidth = 600, + .bmiHeader.biHeight = 400, + .bmiHeader.biPlanes = 1, + .bmiHeader.biCompression = BI_RGB, + }; + AM_MEDIA_TYPE req_mt = + { + .majortype = MEDIATYPE_Video, + .subtype = MEDIASUBTYPE_RGB32, + .formattype = FORMAT_VideoInfo, + .cbFormat = sizeof(vih), + .pbFormat = (BYTE *)&vih, + }; + IFilterGraph2 *graph = create_graph(); + WNDCLASSA window_class = {0}; + struct testfilter source; + IMemAllocator *allocator; + MONITORINFO monitorinfo; + IMediaControl *control; + LONG width, height, l; + IVideoWindow *window; + IMemInputPin *input; + IBaseFilter *filter; + HWND hwnd, our_hwnd; + IOverlay *overlay; + BSTR caption; + HRESULT hr; + DWORD tid; + ULONG ref; + IPin *pin; + RECT rect; + + window_class.lpszClassName = "wine_test_class"; + window_class.lpfnWndProc = window_proc; + RegisterClassA(&window_class); + our_hwnd = CreateWindowA("wine_test_class", "test window", WS_VISIBLE | WS_OVERLAPPEDWINDOW, + 100, 200, 300, 400, NULL, NULL, NULL, NULL); + flush_events(); + + filter = create_vmr9(VMR9Mode_Windowed); + flush_events(); + + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + IBaseFilter_FindPin(filter, L"VMR Input0", &pin); + IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&input); + + hr = IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IOverlay_GetWindowHandle(overlay, &hwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + if (winetest_debug > 1) trace("ours %p, theirs %p\n", our_hwnd, hwnd); + GetWindowRect(hwnd, &rect); + + tid = GetWindowThreadProcessId(hwnd, NULL); + ok(tid == GetCurrentThreadId(), "Expected tid %#x, got %#x.\n", GetCurrentThreadId(), tid); + + hr = IBaseFilter_QueryInterface(filter, &IID_IVideoWindow, (void **)&window); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_Caption(window, &caption); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_WindowStyle(window, &l); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); + + hr = IVideoWindow_get_AutoShow(window, &l); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); + + testfilter_init(&source); + IFilterGraph2_AddFilter(graph, &source.filter.IBaseFilter_iface, NULL); + IFilterGraph2_AddFilter(graph, filter, NULL); + hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IMemInputPin_GetAllocator(input, &allocator); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + if (hr == S_OK) + { + hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); + hr = IMemAllocator_Commit(allocator); + ok(hr == S_OK, "Got hr %#x.\n", hr); + IMemAllocator_Release(allocator); + } + + ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); + + test_video_window_caption(window, hwnd); + test_video_window_style(window, hwnd, our_hwnd); + test_video_window_state(window, hwnd, our_hwnd); + test_video_window_position(window, hwnd, our_hwnd); + test_video_window_autoshow(window, graph, hwnd); + test_video_window_owner(window, hwnd, our_hwnd); + test_video_window_messages(window, hwnd, our_hwnd); + + hr = IVideoWindow_put_FullScreenMode(window, OATRUE); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); + hr = IVideoWindow_get_FullScreenMode(window, &l); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); + + hr = IVideoWindow_GetMinIdealImageSize(window, &width, &height); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); + hr = IVideoWindow_GetMaxIdealImageSize(window, &width, &height); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); + + IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + + hr = IMediaControl_Pause(control); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + monitorinfo.cbSize = sizeof(monitorinfo); + GetMonitorInfoW(MonitorFromWindow(hwnd, MONITOR_DEFAULTTOPRIMARY), &monitorinfo); + + hr = IVideoWindow_GetMinIdealImageSize(window, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(width == 1, "Got width %d.\n", width); + todo_wine ok(height == 1, "Got height %d.\n", height); + hr = IVideoWindow_GetMaxIdealImageSize(window, &width, &height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(width == monitorinfo.rcMonitor.right + 1, "Expected width %d, got %d.\n", + monitorinfo.rcMonitor.right + 1, width); + todo_wine ok(height == monitorinfo.rcMonitor.bottom + 1, "Expected height %d, got %d.\n", + monitorinfo.rcMonitor.bottom + 1, height); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + IMediaControl_Release(control); + IFilterGraph2_Release(graph); + IVideoWindow_Release(window); + IOverlay_Release(overlay); + IMemInputPin_Release(input); + IPin_Release(pin); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); + ok(!ref, "Got outstanding refcount %d.\n", ref); + DestroyWindow(our_hwnd); +} + START_TEST(vmr9) { IBaseFilter *filter; @@ -1588,6 +2394,7 @@ START_TEST(vmr9) test_unconnected_filter_state(); test_connect_pin(); test_overlay(); + test_video_window();
CoUninitialize(); }
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=61441
Your paranoid android.
=== wxppro (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000.
=== wvistau64 (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000.
=== w2008s64 (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000.
=== w7u (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000.
=== w8 (32 bit report) ===
quartz: vmr7.c:2063: Test failed: Thread should not block. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w8adm (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w864 (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1507 (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809 (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809_2scr (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809_ar (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809_he (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809_ja (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809_zh_CN (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== wvistau64 (64 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000.
=== w2008s64 (64 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000.
=== w864 (64 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1507 (64 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809 (64 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w8 (32 bit report) ===
quartz: vmr9.c:2066: Test failed: Got unexpected status 0x80000.
=== w1064v1507 (32 bit report) ===
quartz: vmr9.c:2066: Test failed: Got unexpected status 0x80000.
=== w864 (64 bit report) ===
quartz: vmr9.c:2066: Test failed: Got unexpected status 0x80000.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/videorenderer.c | 8 ++++---- dlls/quartz/tests/vmr7.c | 8 ++++---- dlls/quartz/tests/vmr9.c | 8 ++++---- dlls/strmbase/window.c | 3 ++- 4 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/dlls/quartz/tests/videorenderer.c b/dlls/quartz/tests/videorenderer.c index 320d8920d1..1c64bedbee 100644 --- a/dlls/quartz/tests/videorenderer.c +++ b/dlls/quartz/tests/videorenderer.c @@ -1467,11 +1467,11 @@ static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hw
hr = IVideoWindow_get_WindowStyle(window, &style); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), + ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
style = GetWindowLongA(hwnd, GWL_STYLE); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), + ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
hr = IVideoWindow_put_WindowStyle(window, style | WS_DISABLED); @@ -1490,10 +1490,10 @@ static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hw
hr = IVideoWindow_get_WindowStyle(window, &style); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
style = GetWindowLongA(hwnd, GWL_STYLE); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow());
diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c index fa1ae99856..d6d51decec 100644 --- a/dlls/quartz/tests/vmr7.c +++ b/dlls/quartz/tests/vmr7.c @@ -1629,11 +1629,11 @@ static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hw
hr = IVideoWindow_get_WindowStyle(window, &style); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), + ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
style = GetWindowLongA(hwnd, GWL_STYLE); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), + ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
hr = IVideoWindow_put_WindowStyle(window, style | WS_DISABLED); @@ -1652,10 +1652,10 @@ static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hw
hr = IVideoWindow_get_WindowStyle(window, &style); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
style = GetWindowLongA(hwnd, GWL_STYLE); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow());
diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c index 3c5986e1f5..c91f9a3527 100644 --- a/dlls/quartz/tests/vmr9.c +++ b/dlls/quartz/tests/vmr9.c @@ -1626,11 +1626,11 @@ static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hw
hr = IVideoWindow_get_WindowStyle(window, &style); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), + ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
style = GetWindowLongA(hwnd, GWL_STYLE); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), + ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
hr = IVideoWindow_put_WindowStyle(window, style | WS_DISABLED); @@ -1649,10 +1649,10 @@ static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hw
hr = IVideoWindow_get_WindowStyle(window, &style); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
style = GetWindowLongA(hwnd, GWL_STYLE); - todo_wine ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style);
ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow());
diff --git a/dlls/strmbase/window.c b/dlls/strmbase/window.c index 04132aaab1..07a12eca26 100644 --- a/dlls/strmbase/window.c +++ b/dlls/strmbase/window.c @@ -118,7 +118,8 @@ HRESULT WINAPI BaseWindowImpl_PrepareWindow(BaseWindow *This) return E_FAIL; }
- This->hWnd = CreateWindowExW(0, class_nameW, windownameW, WS_SIZEBOX, + This->hWnd = CreateWindowExW(0, class_nameW, windownameW, + WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=61442
Your paranoid android.
=== wxppro (32 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== w2003std (32 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== wvistau64 (32 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== w2008s64 (32 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== w7u (32 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== w8 (32 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== w8adm (32 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== w1064v1507 (32 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== wvistau64 (64 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== w2008s64 (64 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== w864 (64 bit report) ===
quartz: videorenderer.c:1932: Test failed: Got unexpected status 0x80000.
=== wxppro (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000.
=== wvistau64 (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000.
=== w2008s64 (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000.
=== w8 (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w8adm (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w864 (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1507 (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809 (32 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809_2scr (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809_ar (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809_he (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809_ja (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809_zh_CN (32 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w2008s64 (64 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000.
=== w864 (64 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1507 (64 bit report) ===
quartz: vmr7.c:2066: Test failed: Got unexpected status 0x80000. vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w1064v1809 (64 bit report) ===
quartz: vmr7.c:2248: Test failed: Got width 1. vmr7.c:2249: Test failed: Got height 1. vmr7.c:2252: Test failed: Got width 1025. vmr7.c:2253: Test failed: Got height 769.
=== w8 (32 bit report) ===
quartz: vmr9.c:2066: Test failed: Got unexpected status 0x80000.
=== w8adm (32 bit report) ===
quartz: vmr9.c:2066: Test failed: Got unexpected status 0x80000.
=== w1064v1507 (32 bit report) ===
quartz: vmr9.c:2066: Test failed: Got unexpected status 0x80000.
=== w864 (64 bit report) ===
quartz: vmr9.c:2066: Test failed: Got unexpected status 0x80000.
=== w1064v1507 (64 bit report) ===
quartz: vmr9.c:2066: Test failed: Got unexpected status 0x80000.
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=61439
Your paranoid android.
=== wxppro (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w2003std (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== wvistau64 (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w2008s64 (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w7u (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w8 (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w8adm (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w1064v1809 (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w1064v1809_2scr (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w1064v1809_ar (32 bit report) ===
quartz: videorenderer.c:969: Test failed: Thread should block in Receive().
=== w1064v1809_he (32 bit report) ===
quartz: videorenderer.c:969: Test failed: Thread should block in Receive(). videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w1064v1809_ja (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w1064v1809_zh_CN (32 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== wvistau64 (64 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w2008s64 (64 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w864 (64 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.
=== w1064v1507 (64 bit report) ===
quartz: videorenderer.c:1951: Test failed: Got unexpected status 0x80000.