[vlc-devel] [PATCH] win32/drawable: process the WM_SIZE asynchronously
Steve Lhomme
robux4 at ycbcr.xyz
Mon Feb 22 07:25:30 UTC 2021
The vout_window_ReportSize call may make changes in underlying HWND's which in
turn might make reentrant calls to WinVoutEventProc, which might in turn call
WM_SIZE in the same stack (when resizing quickly).
vout_window_ReportSize() is not reentrant so we should avoid calling it in
calls that might be reentrant (WM_SIZE in this case).
We keep the latest WM_SIZE so when the asynchronous call is done, we already
have the most up to date value.
---
modules/video_output/win32/drawable.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/modules/video_output/win32/drawable.c b/modules/video_output/win32/drawable.c
index 90106558848..c6f2f573a2f 100644
--- a/modules/video_output/win32/drawable.c
+++ b/modules/video_output/win32/drawable.c
@@ -77,6 +77,8 @@ struct drawable_sys
HWND hWnd;
HWND embed_hwnd;
RECT rect_parent;
+
+ unsigned int width, height;
};
static LRESULT CALLBACK WinVoutEventProc(HWND hwnd, UINT message,
@@ -131,7 +133,13 @@ static LRESULT CALLBACK WinVoutEventProc(HWND hwnd, UINT message,
return 0;
case WM_SIZE:
- vout_window_ReportSize(wnd, LOWORD(lParam), HIWORD(lParam));
+ sys->width = LOWORD(lParam);
+ sys->height = HIWORD(lParam);
+ PostMessage(hwnd, WM_USER, 0, lParam);
+ return 0;
+
+ case WM_USER:
+ vout_window_ReportSize(wnd, sys->width, sys->height);
return 0;
default:
--
2.29.2
More information about the vlc-devel
mailing list