[PATCH 2/2] quartz/tests: Test renderer's parent WM_DESTROY notification.
Zebediah Figura
z.figura12 at gmail.com
Thu Jan 9 08:46:59 CST 2020
On 1/9/20 7:13 AM, Gabriel Ivăncescu wrote:
> Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
> ---
> dlls/quartz/tests/filtergraph.c | 35 ++++++++++++++++++++++++++++++++-
> 1 file changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
> index ca45031..726c54a 100644
> --- a/dlls/quartz/tests/filtergraph.c
> +++ b/dlls/quartz/tests/filtergraph.c
> @@ -4232,16 +4232,38 @@ 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();
> + 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))
> {
> @@ -4256,6 +4278,10 @@ static void test_window_threading(void)
> {
> tid = GetWindowThreadProcessId(hwnd, NULL);
> ok(tid != GetCurrentThreadId(), "Window should have been created on a separate thread.\n");
> + ok(!(GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_NOPARENTNOTIFY), "Window has WS_EX_NOPARENTNOTIFY.\n");
> +
> + SetParent(hwnd, parent);
> + SetWindowLongW(hwnd, GWL_STYLE, GetWindowLongW(hwnd, GWL_STYLE) | WS_CHILD);
Does the application actually do this, or does it use
IVideoWindow::put_Owner()? If it is the former, I'd like to see a
comment to that effect.
>
> /* The thread should be processing messages, or this will hang. */
> SendMessageA(hwnd, WM_NULL, 0, 0);
> @@ -4277,6 +4303,10 @@ static void test_window_threading(void)
> {
> tid = GetWindowThreadProcessId(hwnd, NULL);
> ok(tid == GetCurrentThreadId(), "Window should be created on main thread.\n");
> + ok(!(GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_NOPARENTNOTIFY), "Window has WS_EX_NOPARENTNOTIFY.\n");
> +
> + SetParent(hwnd, parent);
> + SetWindowLongW(hwnd, GWL_STYLE, GetWindowLongW(hwnd, GWL_STYLE) | WS_CHILD);
> }
> else
> skip("Could not find renderer window.\n");
> @@ -4285,6 +4315,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)
>
More information about the wine-devel
mailing list