[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