[PATCH 2/2] quartz/tests: Test renderer's parent WM_DESTROY notification.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Thu Jan 9 10:13:24 CST 2020
On 09/01/2020 17:46, Gabriel Ivăncescu wrote:
> 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.
Scratch that, the parent doesn't even process messages, that's why it
deadlocks in the first place. Subclass wouldn't really help at all...
More information about the wine-devel
mailing list