summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-08-06 20:00:26 +0200
committerwm4 <wm4@nowhere>2014-08-06 20:30:47 +0200
commit77ad49411af12f023e37a96bf0a3111791c67f2c (patch)
tree0f107261a8e2c077f40e6c80aa730772348cc58f
parent64e1132d39c7124d1f7376e49a311d34a636cb26 (diff)
downloadmpv-77ad49411af12f023e37a96bf0a3111791c67f2c.tar.bz2
mpv-77ad49411af12f023e37a96bf0a3111791c67f2c.tar.xz
win32: never call GetClientRect(0, ...)
Sometimes GetClientRect() appeared to fail during init, and since we don't check GetClientRect() calls (because they're on our own window, and logically can never fail), bogus resizes were triggered. This could cause vo_direct3d to fail initialization. The reason was that w32->window was set to 0 during early window initialization: CreateWindow*() can send messages to the new window, even though it hasn't returned yet. This means w32->window is not yet set to our window handle, and functions in WndProc may accidentally pass hwnd=0 to win32 API functions. Fix it by initializing w32->window on opportunity. This also means we always strictly expect that the WndProc is used with our own window only.
-rw-r--r--video/out/vo_direct3d.c3
-rw-r--r--video/out/w32_common.c5
2 files changed, 6 insertions, 2 deletions
diff --git a/video/out/vo_direct3d.c b/video/out/vo_direct3d.c
index 032454eb3f..34ddafdd1e 100644
--- a/video/out/vo_direct3d.c
+++ b/video/out/vo_direct3d.c
@@ -772,7 +772,8 @@ static bool resize_d3d(d3d_priv *priv)
{
D3DVIEWPORT9 vp = {0, 0, priv->vo->dwidth, priv->vo->dheight, 0, 1};
- MP_VERBOSE(priv, "resize_d3d called.\n");
+ MP_VERBOSE(priv, "resize_d3d %dx%d called.\n",
+ priv->vo->dwidth, priv->vo->dheight);
/* Make sure that backbuffer is large enough to accomodate the new
viewport dimensions. Grow it if necessary. */
diff --git a/video/out/w32_common.c b/video/out/w32_common.c
index bc2a700975..f59c3cc259 100644
--- a/video/out/w32_common.c
+++ b/video/out/w32_common.c
@@ -515,6 +515,9 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
{
assert(w32_thread_context);
struct vo_w32_state *w32 = w32_thread_context;
+ if (!w32->window)
+ w32->window = hWnd; // can happen during CreateWindow*!
+ assert(w32->window == hWnd);
int mouse_button = 0;
switch (message) {
@@ -522,7 +525,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
// This message is used to wakeup the GUI thread, see wakeup_gui_thread.
mp_dispatch_queue_process(w32->dispatch, 0);
break;
- case WM_ERASEBKGND: // no need to erase background seperately
+ case WM_ERASEBKGND: // no need to erase background separately
return 1;
case WM_PAINT:
signal_events(w32, VO_EVENT_EXPOSE);