[PATCH v3 1/2] strmbase: Detach the window from the parent before destroying it.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Mon Jan 13 06:37:55 CST 2020
Fixes a regression introduced by
3b5198c8283d891095612c1001edb5e5788d6059. Media Player Classic deadlocks when
the window is destroyed, because DestroyWindow will notify the parent, which
is on a different thread and waiting on a signal from the filter's thread.
On Windows, when WM_DESTROY is received, it's already detached from the
parent. However, manually sending a WM_CLOSE to the window does not detach
it (it actually doesn't seem to destroy it, either) which means the detach
process is not done in WM_CLOSE in Windows.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
Since all of this is implementation detail that I don't think we should go
much into, this new version of the patch simply detaches the window before
we send the WM_CLOSE ourselves, which does make the app happy and closely
resembles Windows behavior.
dlls/strmbase/window.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/dlls/strmbase/window.c b/dlls/strmbase/window.c
index 07a12ec..0a2ef9f 100644
--- a/dlls/strmbase/window.c
+++ b/dlls/strmbase/window.c
@@ -139,6 +139,11 @@ HRESULT WINAPI BaseWindowImpl_DoneWithWindow(BaseWindow *This)
if (!This->hWnd)
return S_OK;
+ /* Media Player Classic deadlocks when the parent, which is on a different thread,
+ is notified before the destruction. Windows itself seems to detach the window
+ from the parent prior to destroying it, so we also do that here as well. */
+ IVideoWindow_put_Owner(&impl_from_BaseWindow(This)->IVideoWindow_iface, (OAHWND)NULL);
+
SendMessageW(This->hWnd, WM_CLOSE, 0, 0);
This->hWnd = NULL;
--
2.21.0
More information about the wine-devel
mailing list