[PATCH 07/10] wined3d: Do not minimize invisible windows.

Stefan Dösinger stefan at codeweavers.com
Thu Sep 25 07:24:23 CDT 2014


I do not care too much about this. The purpose of this patch is to
explain why patch 106660 found a different behavior in d3d9ex. The
difference is the invisible window, and d3d9ex doesn't show the window
on device creation. Ddraw has the same behavior, see patch 10.
---
 dlls/d3d8/tests/device.c | 48 ++++++++++++++++++++++++++++++++++++++-
 dlls/d3d9/tests/d3d9ex.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++-
 dlls/d3d9/tests/device.c | 48 ++++++++++++++++++++++++++++++++++++++-
 dlls/wined3d/swapchain.c |  3 ++-
 4 files changed, 153 insertions(+), 4 deletions(-)

diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index dbcbba8..c715dfd 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -2102,7 +2102,7 @@ struct message
     WPARAM expect_wparam;
 };
 
-static const struct message *expect_messages;
+static const struct message *expect_messages, *unexpected_messages;
 static HWND device_window, focus_window;
 
 struct wndproc_thread_param
@@ -2150,6 +2150,13 @@ static LRESULT CALLBACK test_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM
         }
     }
 
+    if (unexpected_messages)
+    {
+        const struct message *i;
+        for (i = unexpected_messages; i->message; i++)
+            ok(i->message != message, "Got unexpected message %x on window %p.\n", message, hwnd);
+    }
+
     return DefWindowProcA(hwnd, message, wparam, lparam);
 }
 
@@ -2232,6 +2239,19 @@ static void test_wndproc(void)
          * or before. */
         {0,                     0,              FALSE,  0},
     };
+    static const struct message focus_loss_messages_hidden[] =
+    {
+        {WM_ACTIVATE,           FOCUS_WINDOW,   TRUE,   WA_INACTIVE},
+        {WM_DISPLAYCHANGE,      DEVICE_WINDOW,  FALSE,  0},
+        {WM_ACTIVATEAPP,        FOCUS_WINDOW,   TRUE,   FALSE},
+        {0,                     0,              FALSE,  0},
+    };
+    static const struct message focus_loss_messages_hidden_unexpected[] =
+    {
+        {WM_WINDOWPOSCHANGING,  0,              FALSE,  0},
+        {WM_WINDOWPOSCHANGED,   0,              FALSE,  0},
+        {0,                     0,              FALSE,  0},
+    };
 
     d3d8 = Direct3DCreate8(D3D_SDK_VERSION);
     ok(!!d3d8, "Failed to create a D3D object.\n");
@@ -2347,6 +2367,32 @@ static void test_wndproc(void)
     SetForegroundWindow(focus_window);
     flush_events();
 
+    hr = IDirect3DDevice8_Reset(device, &present_parameters);
+    ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr);
+
+    ShowWindow(device_window, SW_HIDE);
+    flush_events();
+
+    expect_messages = focus_loss_messages_hidden;
+    unexpected_messages = focus_loss_messages_hidden_unexpected;
+    SetForegroundWindow(GetDesktopWindow());
+    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;
+    unexpected_messages = NULL;
+
+    memset(&mode, 0, sizeof(mode));
+    mode.dmSize = sizeof(mode);
+    ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &mode);
+    ok(ret, "Failed to get display mode.\n");
+    ok(mode.dmPelsWidth == screen_width, "Got unexpect width %u.\n", mode.dmPelsWidth);
+    ok(mode.dmPelsHeight == screen_height, "Got unexpect height %u.\n", mode.dmPelsHeight);
+
+    ShowWindow(focus_window, SW_MINIMIZE);
+    ShowWindow(focus_window, SW_RESTORE);
+    SetForegroundWindow(focus_window);
+    flush_events();
+
     filter_messages = focus_window;
     hr = reset_device(device, device_window, FALSE);
     ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr);
diff --git a/dlls/d3d9/tests/d3d9ex.c b/dlls/d3d9/tests/d3d9ex.c
index 8db6e8b..b0a0f8a 100644
--- a/dlls/d3d9/tests/d3d9ex.c
+++ b/dlls/d3d9/tests/d3d9ex.c
@@ -1358,7 +1358,7 @@ struct message
     WPARAM expect_wparam;
 };
 
-static const struct message *expect_messages;
+static const struct message *expect_messages, *unexpected_messages;
 static HWND device_window, focus_window;
 
 struct wndproc_thread_param
@@ -1407,6 +1407,21 @@ static LRESULT CALLBACK test_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM
         }
     }
 
+    if (unexpected_messages)
+    {
+        const struct message *i;
+        for (i = unexpected_messages; i->message; i++)
+        {
+            if (i->message != message)
+                continue;
+
+            if (message == WM_DISPLAYCHANGE)
+                todo_wine ok(0, "Got unexpected message %x on window %p.\n", message, hwnd);
+            else
+                ok(0, "Got unexpected message %x on window %p.\n", message, hwnd);
+        }
+    }
+
     return DefWindowProcA(hwnd, message, wparam, lparam);
 }
 
@@ -1487,6 +1502,19 @@ static void test_wndproc(void)
          * or before. */
         {0,                     0,              FALSE,  0},
     };
+    static const struct message focus_loss_messages_hidden[] =
+    {
+        {WM_ACTIVATE,           FOCUS_WINDOW,   TRUE,   WA_INACTIVE},
+        {WM_ACTIVATEAPP,        FOCUS_WINDOW,   TRUE,   FALSE},
+        {0,                     0,              FALSE,  0},
+    };
+    static const struct message focus_loss_messages_hidden_unexpected[] =
+    {
+        {WM_DISPLAYCHANGE,      0,              FALSE,  0},
+        {WM_WINDOWPOSCHANGING,  0,              FALSE,  0},
+        {WM_WINDOWPOSCHANGED,   0,              FALSE,  0},
+        {0,                     0,              FALSE,  0},
+    };
 
     memset(&orig_mode, 0, sizeof(orig_mode));
     orig_mode.dmSize = sizeof(orig_mode);
@@ -1613,6 +1641,34 @@ static void test_wndproc(void)
     SetForegroundWindow(focus_window);
     flush_events();
 
+    hr = IDirect3DDevice9Ex_ResetEx(device, &present_parameters, &mode);
+    ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr);
+
+    ShowWindow(device_window, SW_HIDE);
+    flush_events();
+
+    expect_messages = focus_loss_messages_hidden;
+    unexpected_messages = focus_loss_messages_hidden_unexpected;
+    SetForegroundWindow(GetDesktopWindow());
+    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;
+    unexpected_messages = NULL;
+
+    /* D3d9ex does not touch the display mode if the device window is hidden. */
+    memset(&devmode, 0, sizeof(devmode));
+    devmode.dmSize = sizeof(devmode);
+    ret = pEnumDisplaySettingsExA(NULL, ENUM_CURRENT_SETTINGS, &devmode, 0);
+    ok(ret, "Failed to get display mode.\n");
+    todo_wine ok(devmode.dmPelsWidth == 640, "Got unexpect width %u.\n", devmode.dmPelsWidth);
+    todo_wine ok(devmode.dmPelsHeight == 480, "Got unexpect height %u.\n", devmode.dmPelsHeight);
+
+    ShowWindow(device_window, SW_SHOW);
+    ShowWindow(focus_window, SW_MINIMIZE);
+    ShowWindow(focus_window, SW_RESTORE);
+    SetForegroundWindow(focus_window);
+    flush_events();
+
     filter_messages = focus_window;
     hr = reset_device(device, device_window, FALSE);
     ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr);
diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c
index fe363e8..6b0bdd2 100644
--- a/dlls/d3d9/tests/device.c
+++ b/dlls/d3d9/tests/device.c
@@ -3062,7 +3062,7 @@ struct message
     WPARAM expect_wparam;
 };
 
-static const struct message *expect_messages;
+static const struct message *expect_messages, *unexpected_messages;
 static HWND device_window, focus_window;
 
 struct wndproc_thread_param
@@ -3111,6 +3111,13 @@ static LRESULT CALLBACK test_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM
         }
     }
 
+    if (unexpected_messages)
+    {
+        const struct message *i;
+        for (i = unexpected_messages; i->message; i++)
+            ok(i->message != message, "Got unexpected message %x on window %p.\n", message, hwnd);
+    }
+
     return DefWindowProcA(hwnd, message, wparam, lparam);
 }
 
@@ -3190,6 +3197,19 @@ static void test_wndproc(void)
          * or before. */
         {0,                     0,              FALSE,  0},
     };
+    static const struct message focus_loss_messages_hidden[] =
+    {
+        {WM_ACTIVATE,           FOCUS_WINDOW,   TRUE,   WA_INACTIVE},
+        {WM_DISPLAYCHANGE,      DEVICE_WINDOW,  FALSE,  0},
+        {WM_ACTIVATEAPP,        FOCUS_WINDOW,   TRUE,   FALSE},
+        {0,                     0,              FALSE,  0},
+    };
+    static const struct message focus_loss_messages_hidden_unexpected[] =
+    {
+        {WM_WINDOWPOSCHANGING,  0,              FALSE,  0},
+        {WM_WINDOWPOSCHANGED,   0,              FALSE,  0},
+        {0,                     0,              FALSE,  0},
+    };
 
     d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d9, "Failed to create a D3D object.\n");
@@ -3305,6 +3325,32 @@ static void test_wndproc(void)
     SetForegroundWindow(focus_window);
     flush_events();
 
+    hr = IDirect3DDevice9_Reset(device, &present_parameters);
+    ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr);
+
+    ShowWindow(device_window, SW_HIDE);
+    flush_events();
+
+    expect_messages = focus_loss_messages_hidden;
+    unexpected_messages = focus_loss_messages_hidden_unexpected;
+    SetForegroundWindow(GetDesktopWindow());
+    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;
+    unexpected_messages = NULL;
+
+    memset(&mode, 0, sizeof(mode));
+    mode.dmSize = sizeof(mode);
+    ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &mode);
+    ok(ret, "Failed to get display mode.\n");
+    ok(mode.dmPelsWidth == screen_width, "Got unexpect width %u.\n", mode.dmPelsWidth);
+    ok(mode.dmPelsHeight == screen_height, "Got unexpect height %u.\n", mode.dmPelsHeight);
+
+    ShowWindow(focus_window, SW_MINIMIZE);
+    ShowWindow(focus_window, SW_RESTORE);
+    SetForegroundWindow(focus_window);
+    flush_events();
+
     filter_messages = focus_window;
     hr = reset_device(device, device_window, FALSE);
     ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr);
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index f27a5b6..dc00421 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -1197,6 +1197,7 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
             swapchain->reapply_mode = TRUE;
         }
 
-        ShowWindow(swapchain->device_window, SW_MINIMIZE);
+        if (IsWindowVisible(swapchain->device_window))
+            ShowWindow(swapchain->device_window, SW_MINIMIZE);
     }
 }
-- 
1.8.5.5




More information about the wine-patches mailing list