[PATCH 2/2] quartz/tests: Test renderer's parent WM_DESTROY notification.

Gabriel Ivăncescu gabrielopcode at gmail.com
Thu Jan 9 09:46:22 CST 2020


On 09/01/2020 17:38, Nikolay Sivov wrote:
> 
> 
> On Thu, Jan 9, 2020 at 6:23 PM Gabriel Ivăncescu 
> <gabrielopcode at gmail.com <mailto:gabrielopcode at gmail.com>> wrote:
> 
>     On 09/01/2020 16:46, Zebediah Figura wrote:
>      > On 1/9/20 7:13 AM, Gabriel Ivăncescu wrote:
>      >> Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com
>     <mailto: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.
>      >
> 
>     I actually don't know what the app does when it sets the parent. I
>     wrote
>     the test to see if Windows notifies the parent, and it seems that it
>     doesn't (I also set the WS_CHILD just in case), despite not having the
>     WS_EX_NOPARENTNOTIFY style in the first place. Wine would fail this
>     test
>     without the first patch, even without put_Owner.
> 
>     I'll investigate what the app does. However, while this patchset fixes
>     that app, I thought a more generic solution would be preferable, since
>     that's how Windows seems to work (unless you have a better idea).
> 
> 
> I don't understand how this window is set, just from this test alone. 
> But, is it possible to subclass application window, and simply not 
> forward certain messages?
> 
> You can probably even test if it was subclassed when message returns.
> 
> 

You mean subclass the parent? I'll look into that, but it seems a bit 
overkill. (that said, if Windows does it...)

FWIW, the issue is that DestroyWindow notifies the parent if the child 
doesn't have that style.



More information about the wine-devel mailing list