[PATCH v2 2/2] quartz/tests: Test video window parent's WM_DESTROY notification.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Fri Jan 10 06:23:53 CST 2020
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
dlls/quartz/tests/filtergraph.c | 44 ++++++++++++++++++++++++++++++++-
1 file changed, 43 insertions(+), 1 deletion(-)
diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
index ca45031..95b2082 100644
--- a/dlls/quartz/tests/filtergraph.c
+++ b/dlls/quartz/tests/filtergraph.c
@@ -4232,16 +4232,39 @@ static HWND get_renderer_hwnd(IFilterGraph2 *graph)
return hwnd;
}
+static LRESULT CALLBACK parent_wndproc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_PARENTNOTIFY:
+ if (LOWORD(wParam) == WM_DESTROY)
+ ok(0, "Received WM_PARENTNOTIFY with WM_DESTROY.\n");
+ break;
+ }
+ return DefWindowProcA(hwnd, msg, wParam, lParam);
+}
+
static void test_window_threading(void)
{
WCHAR *filename = load_resource(avifile);
IFilterGraph2 *graph = create_graph();
+ IVideoWindow *videownd;
+ WNDCLASSA cls = { 0 };
+ HWND hwnd, parent;
HRESULT hr;
DWORD tid;
ULONG ref;
- HWND hwnd;
BOOL ret;
+ cls.lpfnWndProc = parent_wndproc;
+ cls.hInstance = GetModuleHandleA(NULL);
+ cls.hCursor = LoadCursorA(0, (const char*)IDC_ARROW);
+ cls.lpszClassName = "TestParent";
+ RegisterClassA(&cls);
+
+ parent = CreateWindowExA(0, "TestParent", NULL, WS_OVERLAPPEDWINDOW, 50, 50, 150, 150, NULL, NULL, cls.hInstance, NULL);
+ ok(parent != NULL, "Failed to create parent window.\n");
+
hr = IFilterGraph2_RenderFile(graph, filename, NULL);
if (FAILED(hr))
{
@@ -4259,6 +4282,14 @@ static void test_window_threading(void)
/* The thread should be processing messages, or this will hang. */
SendMessageA(hwnd, WM_NULL, 0, 0);
+
+ /* The WM_DESTROY notification is not sent to the owner, even if the style is off */
+ hr = IFilterGraph2_QueryInterface(graph, &IID_IVideoWindow, (void**)&videownd);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IVideoWindow_put_Owner(videownd, (OAHWND)parent);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ IVideoWindow_Release(videownd);
+ ok(!(GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_NOPARENTNOTIFY), "Window has WS_EX_NOPARENTNOTIFY.\n");
}
else
skip("Could not find renderer window.\n");
@@ -4277,6 +4308,14 @@ static void test_window_threading(void)
{
tid = GetWindowThreadProcessId(hwnd, NULL);
ok(tid == GetCurrentThreadId(), "Window should be created on main thread.\n");
+
+ /* The WM_DESTROY notification is not sent to the owner, even if the style is off */
+ hr = IFilterGraph2_QueryInterface(graph, &IID_IVideoWindow, (void**)&videownd);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IVideoWindow_put_Owner(videownd, (OAHWND)parent);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ IVideoWindow_Release(videownd);
+ ok(!(GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_NOPARENTNOTIFY), "Window has WS_EX_NOPARENTNOTIFY.\n");
}
else
skip("Could not find renderer window.\n");
@@ -4285,6 +4324,9 @@ static void test_window_threading(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
ret = DeleteFileW(filename);
ok(ret, "Failed to delete file, error %u.\n", GetLastError());
+
+ DestroyWindow(parent);
+ UnregisterClassA("TestParent", cls.hInstance);
}
START_TEST(filtergraph)
--
2.21.0
More information about the wine-devel
mailing list