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