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

Nikolay Sivov bunglehead at gmail.com
Thu Jan 9 09:38:41 CST 2020


On Thu, Jan 9, 2020 at 6:23 PM Gabriel Ivăncescu <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>
> >> ---
> >>   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.


>
> Also, by comment, you meant in the test file as C comment, right?
>
> Thanks,
> Gabriel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20200109/178d02f7/attachment.htm>


More information about the wine-devel mailing list