From 19c860499a12495e8f7a7cb2909fa948e24261d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Thu, 4 Dec 2014 21:51:49 +0100 Subject: [PATCH] wined3d: Filter messages generated by focus handling. --- dlls/d3d8/tests/device.c | 2 +- dlls/d3d9/tests/d3d9ex.c | 5 +---- dlls/d3d9/tests/device.c | 13 +++---------- dlls/ddraw/ddraw.c | 3 ++- dlls/wined3d/device.c | 2 +- dlls/wined3d/swapchain.c | 21 ++++++++++++++------- include/wine/wined3d.h | 1 + 7 files changed, 23 insertions(+), 24 deletions(-) diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 00842726d23..73970c1a41d 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -2688,7 +2688,7 @@ static void test_wndproc(void) SetForegroundWindow(GetDesktopWindow()); ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", expect_messages->message, expect_messages->window); - todo_wine ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it.\n"); + ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it.\n"); expect_messages = NULL; /* The window is iconic even though no message was sent. */ diff --git a/dlls/d3d9/tests/d3d9ex.c b/dlls/d3d9/tests/d3d9ex.c index 49be31e83f9..fef80f4c0bc 100644 --- a/dlls/d3d9/tests/d3d9ex.c +++ b/dlls/d3d9/tests/d3d9ex.c @@ -2236,10 +2236,7 @@ static void test_wndproc(void) SetForegroundWindow(GetDesktopWindow()); ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", expect_messages->message, expect_messages->window, i); - if (tests[i].create_flags & CREATE_DEVICE_NOWINDOWCHANGES) - ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); - else - todo_wine ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); + ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); expect_messages = NULL; /* The window is iconic even though no message was sent. */ diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index 72044a51985..3206e57d9e1 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -3675,10 +3675,7 @@ static void test_wndproc(void) SetForegroundWindow(GetDesktopWindow()); ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", expect_messages->message, expect_messages->window, i); - if (tests[i].create_flags & CREATE_DEVICE_NOWINDOWCHANGES) - ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); - else - todo_wine ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); + ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); expect_messages = NULL; /* The window is iconic even though no message was sent. */ @@ -3730,12 +3727,8 @@ static void test_wndproc(void) ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", expect_messages->message, expect_messages->window, i); /* About 1 in 8 test runs receives WM_WINDOWPOSCHANGED on Vista. */ - if (tests[i].create_flags & CREATE_DEVICE_NOWINDOWCHANGES) - ok(!windowposchanged_received || broken(1), - "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); - else - todo_wine ok(!windowposchanged_received || broken(1), - "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); + ok(!windowposchanged_received || broken(1), + "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); expect_messages = NULL; filter_messages = focus_window; diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index fce1c22caea..f0ebc52b031 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -4850,7 +4850,8 @@ HRESULT ddraw_init(struct ddraw *ddraw, enum wined3d_device_type device_type) ddraw->numIfaces = 1; ddraw->ref7 = 1; - flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING | WINED3D_RESTORE_MODE_ON_ACTIVATE; + flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING + | WINED3D_RESTORE_MODE_ON_ACTIVATE | WINED3D_FOCUS_MESSAGES; if (!(ddraw->wined3d = wined3d_create(flags))) { if (!(ddraw->wined3d = wined3d_create(flags | WINED3D_NO3D))) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index ae6600e58ac..89ec00a8ed9 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -4961,7 +4961,7 @@ void device_invalidate_state(const struct wined3d_device *device, DWORD state) LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL unicode, UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) { - if (device->filter_messages) + if (device->filter_messages && message != WM_DISPLAYCHANGE) { TRACE("Filtering message: window %p, message %#x, wparam %#lx, lparam %#lx.\n", window, message, wparam, lparam); diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 89f83ea6619..887143f0686 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -1176,14 +1176,19 @@ void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain) void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activate) { + struct wined3d_device *device = swapchain->device; + BOOL filter_messages = device->filter_messages; + /* This code is not protected by the wined3d mutex, so it may run while * wined3d_device_reset is active. Testing on Windows shows that changing * focus during resets and resetting during focus change events causes * the application to crash with an invalid memory access. */ + device->filter_messages = !(device->wined3d->flags & WINED3D_FOCUS_MESSAGES); + if (activate) { - if (!(swapchain->device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES)) + if (!(device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES)) { /* The d3d versions do not agree on the exact messages here. D3d8 restores * the window but leaves the size untouched, d3d9 sets the size on an @@ -1197,23 +1202,25 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa SWP_NOACTIVATE | SWP_NOZORDER); } - if (swapchain->device->wined3d->flags & WINED3D_RESTORE_MODE_ON_ACTIVATE) + if (device->wined3d->flags & WINED3D_RESTORE_MODE_ON_ACTIVATE) { - if (FAILED(wined3d_set_adapter_display_mode(swapchain->device->wined3d, - swapchain->device->adapter->ordinal, &swapchain->d3d_mode))) + if (FAILED(wined3d_set_adapter_display_mode(device->wined3d, + device->adapter->ordinal, &swapchain->d3d_mode))) ERR("Failed to set display mode.\n"); } } else { - if (FAILED(wined3d_set_adapter_display_mode(swapchain->device->wined3d, - swapchain->device->adapter->ordinal, NULL))) + if (FAILED(wined3d_set_adapter_display_mode(device->wined3d, + device->adapter->ordinal, NULL))) ERR("Failed to set display mode.\n"); swapchain->reapply_mode = TRUE; - if (!(swapchain->device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES) + if (!(device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES) && IsWindowVisible(swapchain->device_window)) ShowWindow(swapchain->device_window, SW_MINIMIZE); } + + device->filter_messages = filter_messages; } diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 2362cbcfc1d..baa102a7c7e 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -1238,6 +1238,7 @@ enum wined3d_display_rotation #define WINED3D_VIDMEM_ACCOUNTING 0x00000004 #define WINED3D_PRESENT_CONVERSION 0x00000008 #define WINED3D_RESTORE_MODE_ON_ACTIVATE 0x00000010 +#define WINED3D_FOCUS_MESSAGES 0x00000020 #define WINED3D_RESZ_CODE 0x7fa05000