[PATCH 9/9] wined3d: Pass WM_SYSCOMMAND(SC_RESTORE) to DefWindowProc.
Stefan Dösinger
stefan at codeweavers.com
Thu Dec 4 14:51:50 CST 2014
This fixes focus restoration in Need for Speed: SHIFT, which has a
wndproc that ignores WM_SYSCOMMAND.
---
dlls/d3d8/tests/device.c | 4 ++--
dlls/d3d9/tests/d3d9ex.c | 4 ++--
dlls/d3d9/tests/device.c | 4 ++--
dlls/ddraw/ddraw.c | 4 ++--
dlls/wined3d/device.c | 10 ++++++++++
include/wine/wined3d.h | 1 +
6 files changed, 19 insertions(+), 8 deletions(-)
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/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 3206e57..929c714 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/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index f0ebc52..a768663 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -4850,8 +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 | WINED3D_FOCUS_MESSAGES;
+ flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING | WINED3D_RESTORE_MODE_ON_ACTIVATE
+ | WINED3D_FOCUS_MESSAGES | WINED3D_NO_SYSCOMMAND_HANDLING;
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 89ec00a..51dabd4 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4992,6 +4992,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_NO_SYSCOMMAND_HANDLING))
+ {
+ 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 baa102a..7888b7d 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1239,6 +1239,7 @@ enum wined3d_display_rotation
#define WINED3D_PRESENT_CONVERSION 0x00000008
#define WINED3D_RESTORE_MODE_ON_ACTIVATE 0x00000010
#define WINED3D_FOCUS_MESSAGES 0x00000020
+#define WINED3D_NO_SYSCOMMAND_HANDLING 0x00000040
#define WINED3D_RESZ_CODE 0x7fa05000
--
2.0.4
More information about the wine-patches
mailing list