[PATCH] ddraw: Show the window and change its topmost style when changing exclusive cooperative mode.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Tue Jan 12 07:47:31 CST 2021
Fixes a regression introduced by f90d607c67768f19e36d9d74b498594252faa3fd.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50370
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
dlls/ddraw/ddraw.c | 7 ++++++-
dlls/ddraw/tests/ddraw1.c | 33 +++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw2.c | 33 +++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw4.c | 33 +++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw7.c | 33 +++++++++++++++++++++++++++++++++
5 files changed, 138 insertions(+), 1 deletion(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index d616330..9faf6b7 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -776,7 +776,7 @@ static HRESULT WINAPI ddraw1_RestoreDisplayMode(IDirectDraw *iface)
* Unsure about this: DDSCL_FPUSETUP
*
* These don't seem very important for wine:
- * DDSCL_ALLOWREBOOT, DDSCL_NOWINDOWCHANGES, DDSCL_ALLOWMODEX
+ * DDSCL_ALLOWREBOOT, DDSCL_ALLOWMODEX
*
* Returns:
* DD_OK if the cooperative level was set successfully
@@ -900,6 +900,8 @@ static HRESULT ddraw_set_cooperative_level(struct ddraw *ddraw, HWND window,
window = device_window;
}
+ else if (!(cooplevel & DDSCL_NOWINDOWCHANGES) && window == GetActiveWindow())
+ SetWindowPos(window, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
else
{
@@ -907,6 +909,9 @@ static HRESULT ddraw_set_cooperative_level(struct ddraw *ddraw, HWND window,
DestroyWindow(ddraw->devicewindow);
ddraw->devicewindow = NULL;
ddraw->focuswindow = NULL;
+
+ if (!(cooplevel & DDSCL_NOWINDOWCHANGES))
+ SetWindowPos(window, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
if ((cooplevel & DDSCL_EXCLUSIVE) && exclusive_window != window)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index df5c8ac..6dc6b33 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -2584,6 +2584,39 @@ static void test_window_style(void)
tmp = GetWindowLongA(window, GWL_EXSTYLE);
ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+ hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_NOWINDOWCHANGES);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ todo_wine ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+
+ hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ expected_style = style | WS_VISIBLE;
+ todo_wine ok(tmp == expected_style, "Expected window style %#x, got %#x.\n", expected_style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ expected_style = exstyle | WS_EX_TOPMOST;
+ todo_wine ok(tmp == expected_style, "Expected window extended style %#x, got %#x.\n", expected_style, tmp);
+
+ ShowWindow(window, SW_HIDE);
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ todo_wine ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ expected_style = exstyle | WS_EX_TOPMOST;
+ todo_wine ok(tmp == expected_style, "Expected window extended style %#x, got %#x.\n", expected_style, tmp);
+
+ hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+
ShowWindow(window, SW_SHOW);
hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index bc915c9..61294ed 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -2638,6 +2638,39 @@ static void test_window_style(void)
tmp = GetWindowLongA(window, GWL_EXSTYLE);
ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+ hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_NOWINDOWCHANGES);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ todo_wine ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+
+ hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ expected_style = style | WS_VISIBLE;
+ todo_wine ok(tmp == expected_style, "Expected window style %#x, got %#x.\n", expected_style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ expected_style = exstyle | WS_EX_TOPMOST;
+ todo_wine ok(tmp == expected_style, "Expected window extended style %#x, got %#x.\n", expected_style, tmp);
+
+ ShowWindow(window, SW_HIDE);
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ todo_wine ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ expected_style = exstyle | WS_EX_TOPMOST;
+ todo_wine ok(tmp == expected_style, "Expected window extended style %#x, got %#x.\n", expected_style, tmp);
+
+ hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+
ShowWindow(window, SW_SHOW);
hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index f009b45..884b921 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -2878,6 +2878,39 @@ static void test_window_style(void)
tmp = GetWindowLongA(window, GWL_EXSTYLE);
ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+ hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_NOWINDOWCHANGES);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ todo_wine ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+
+ hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ expected_style = style | WS_VISIBLE;
+ todo_wine ok(tmp == expected_style, "Expected window style %#x, got %#x.\n", expected_style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ expected_style = exstyle | WS_EX_TOPMOST;
+ todo_wine ok(tmp == expected_style, "Expected window extended style %#x, got %#x.\n", expected_style, tmp);
+
+ ShowWindow(window, SW_HIDE);
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ todo_wine ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ expected_style = exstyle | WS_EX_TOPMOST;
+ todo_wine ok(tmp == expected_style, "Expected window extended style %#x, got %#x.\n", expected_style, tmp);
+
+ hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+
ShowWindow(window, SW_SHOW);
hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 613f8da..69dff73 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -2526,6 +2526,39 @@ static void test_window_style(void)
tmp = GetWindowLongA(window, GWL_EXSTYLE);
ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+ hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_NOWINDOWCHANGES);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ todo_wine ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+
+ hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ expected_style = style | WS_VISIBLE;
+ todo_wine ok(tmp == expected_style, "Expected window style %#x, got %#x.\n", expected_style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ expected_style = exstyle | WS_EX_TOPMOST;
+ todo_wine ok(tmp == expected_style, "Expected window extended style %#x, got %#x.\n", expected_style, tmp);
+
+ ShowWindow(window, SW_HIDE);
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ todo_wine ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ expected_style = exstyle | WS_EX_TOPMOST;
+ todo_wine ok(tmp == expected_style, "Expected window extended style %#x, got %#x.\n", expected_style, tmp);
+
+ hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ tmp = GetWindowLongA(window, GWL_STYLE);
+ ok(tmp == style, "Expected window style %#x, got %#x.\n", style, tmp);
+ tmp = GetWindowLongA(window, GWL_EXSTYLE);
+ ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
+
ShowWindow(window, SW_SHOW);
hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
--
2.29.2
More information about the wine-devel
mailing list