From: Stefan Dösinger Subject: [PATCH 1/2] wined3d: Pass WM_SYSCOMMAND(SC_RESTORE) to DefWindowProc (v2). Message-Id: <1422284637-8011-1-git-send-email-stefan@codeweavers.com> Date: Mon, 26 Jan 2015 16:03:56 +0100 Version 2: Avoid the double negative wined3d behavior flag and make it specific to SC_RESTORE. The next optional patch clarifies the test to show that d3d8/9 handle WM_SYSCOMMAND(SC_RESTORE) before passing it to the original window procedure. This fixes focus restoration in Need for Speed: SHIFT, which has a wndproc that ignores WM_SYSCOMMAND. --- dlls/d3d8/directx.c | 2 +- dlls/d3d8/tests/device.c | 4 ++-- dlls/d3d9/directx.c | 2 +- dlls/d3d9/tests/d3d9ex.c | 4 ++-- dlls/d3d9/tests/device.c | 4 ++-- dlls/wined3d/device.c | 10 ++++++++++ include/wine/wined3d.h | 1 + 7 files changed, 19 insertions(+), 8 deletions(-) diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c index 7270881..23100f2 100644 --- a/dlls/d3d8/directx.c +++ b/dlls/d3d8/directx.c @@ -404,7 +404,7 @@ static const struct IDirect3D8Vtbl d3d8_vtbl = BOOL d3d8_init(struct d3d8 *d3d8) { - DWORD flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING; + DWORD flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING | WINED3D_HANDLE_RESTORE; d3d8->IDirect3D8_iface.lpVtbl = &d3d8_vtbl; d3d8->refcount = 1; diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 73970c1..235dc73 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -2622,7 +2622,7 @@ static void test_wndproc(void) expect_messages = sc_restore_messages; SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); - todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", expect_messages->message, expect_messages->window); expect_messages = NULL; flush_events(); @@ -2699,7 +2699,7 @@ static void test_wndproc(void) expect_messages = sc_restore_messages; SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); - todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", expect_messages->message, expect_messages->window); expect_messages = NULL; flush_events(); diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c index dc36be1..6059890 100644 --- a/dlls/d3d9/directx.c +++ b/dlls/d3d9/directx.c @@ -636,7 +636,7 @@ static const struct IDirect3D9ExVtbl d3d9_vtbl = BOOL d3d9_init(struct d3d9 *d3d9, BOOL extended) { - DWORD flags = WINED3D_PRESENT_CONVERSION; + DWORD flags = WINED3D_PRESENT_CONVERSION | WINED3D_HANDLE_RESTORE; if (!extended) flags |= WINED3D_VIDMEM_ACCOUNTING; diff --git a/dlls/d3d9/tests/d3d9ex.c b/dlls/d3d9/tests/d3d9ex.c index fef80f4..106bc3e 100644 --- a/dlls/d3d9/tests/d3d9ex.c +++ b/dlls/d3d9/tests/d3d9ex.c @@ -2172,7 +2172,7 @@ static void test_wndproc(void) expect_messages = sc_restore_messages; SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); - todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + 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); expect_messages = NULL; flush_events(); @@ -2249,7 +2249,7 @@ static void test_wndproc(void) expect_messages = sc_restore_messages; SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); - todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + 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); expect_messages = NULL; flush_events(); diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index ffd3c11..6cf4a81 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -3606,7 +3606,7 @@ static void test_wndproc(void) expect_messages = sc_restore_messages; SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); - todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + 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); expect_messages = NULL; flush_events(); @@ -3690,7 +3690,7 @@ static void test_wndproc(void) expect_messages = sc_restore_messages; SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); - todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + 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); expect_messages = NULL; flush_events(); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index f640c9e..bd57d61 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5018,6 +5018,16 @@ LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL device->device_parent->ops->activate(device->device_parent, wparam); } + else if (message == WM_SYSCOMMAND) + { + if (wparam == SC_RESTORE && device->wined3d->flags & WINED3D_HANDLE_RESTORE) + { + if (unicode) + DefWindowProcW(window, message, wparam, lparam); + else + DefWindowProcA(window, message, wparam, lparam); + } + } if (unicode) return CallWindowProcW(proc, window, message, wparam, lparam); diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 987e19e..2d3336a 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -1243,6 +1243,7 @@ enum wined3d_display_rotation #define WINED3D_PRESENT_CONVERSION 0x00000008 #define WINED3D_RESTORE_MODE_ON_ACTIVATE 0x00000010 #define WINED3D_FOCUS_MESSAGES 0x00000020 +#define WINED3D_HANDLE_RESTORE 0x00000040 #define WINED3D_RESZ_CODE 0x7fa05000 -- 2.0.5