[PATCH v4 4/6] ddraw: Use WINED3D_SWAPCHAIN_NO_WINDOW_CHANGES only if window is inactive.

Stefan Dösinger stefandoesinger at gmail.com
Mon Jan 10 12:28:30 CST 2022


I'll have a closer look at this tomorrow. In particular, I want to see if the behavior is the same on my Windows machines.

One general musing (doesn't apply to a particular patch / line of code, hence the toppost) is how much of this behavior is d3d's / ddraw's doing and how much might be an external process like explorer.exe or whatever Windows equivalent of a window manager is. Prohibiting non-foreground applications from spawning a fullscreen window over your desktop sounds like a focus stealing prevention mechanism. I'd implement that in a component that is outside the badly behaved / malicious process and not inside like d3d*.dll are.

Musing 2: Is it the foreground thread that matters or that the foreground thread belongs to the current process?

And sorry that this is all so complicated. Window management and window flags are a pain :-(

> Am 10.01.2022 um 17:47 schrieb Gabriel Ivăncescu <gabrielopcode at gmail.com>:
> 
> 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>
> ---
> 
> The current tests were testing a hidden window only, which ddraw treats as
> inactive (but not d3d8/d3d9ex). Tests were added to show that even visible
> windows, but inactive, are not set to topmost, while active ones are.
> 
> This is ddraw specific. d3d8 and d3d9ex treat hidden windows as "active"
> for the purposes of window changes (so only inactive visible windows prevent
> changes). We have existing tests for that.
> 
> Unfortunately, most of the tests are still todo_wine, even though the
> WS_EX_TOPMOST style matches (except when exiting, that's fixed on last
> patch). That's because we don't have WS_EX_WINDOWEDGE on fullscreen windows
> (long-standing issue), but the topmost bit is set correctly.
> 
> dlls/ddraw/ddraw.c        |  6 ++--
> dlls/ddraw/tests/ddraw1.c | 61 ++++++++++++++++++++++++++++++++++++++-
> dlls/ddraw/tests/ddraw2.c | 61 ++++++++++++++++++++++++++++++++++++++-
> dlls/ddraw/tests/ddraw4.c | 61 ++++++++++++++++++++++++++++++++++++++-
> dlls/ddraw/tests/ddraw7.c | 61 ++++++++++++++++++++++++++++++++++++++-
> 5 files changed, 244 insertions(+), 6 deletions(-)
> 
> diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
> index 5b70bb4..77172d4 100644
> --- a/dlls/ddraw/ddraw.c
> +++ b/dlls/ddraw/ddraw.c
> @@ -583,8 +583,10 @@ static HRESULT ddraw_attach_d3d_device(struct ddraw *ddraw, HWND window,
>     swapchain_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD;
>     swapchain_desc.device_window = window;
>     swapchain_desc.windowed = windowed;
> -    swapchain_desc.flags = WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH
> -            | WINED3D_SWAPCHAIN_IMPLICIT | WINED3D_SWAPCHAIN_NO_WINDOW_CHANGES;
> +    swapchain_desc.flags = WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH | WINED3D_SWAPCHAIN_IMPLICIT;
> +
> +    if (window != GetForegroundWindow())
> +        swapchain_desc.flags |= WINED3D_SWAPCHAIN_NO_WINDOW_CHANGES;
> 
>     if (ddraw->flags & DDRAW_NO3D)
>         return wined3d_swapchain_create(ddraw->wined3d_device, &swapchain_desc,
> diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
> index 11c1477..80f04e7 100644
> --- a/dlls/ddraw/tests/ddraw1.c
> +++ b/dlls/ddraw/tests/ddraw1.c
> @@ -2585,14 +2585,16 @@ static void test_window_style(void)
> {
>     LONG style, exstyle, tmp, expected_style;
>     RECT fullscreen_rect, r;
> +    HWND window, window2;
>     IDirectDraw *ddraw;
> -    HWND window;
>     HRESULT hr;
>     ULONG ref;
>     BOOL ret;
> 
>     window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
>             0, 0, 100, 100, 0, 0, 0, 0);
> +    window2 = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
> +            0, 0, 50, 50, 0, 0, 0, 0);
>     ddraw = create_ddraw();
>     ok(!!ddraw, "Failed to create a ddraw object.\n");
> 
> @@ -2636,6 +2638,63 @@ static void test_window_style(void)
>     tmp = GetWindowLongA(window, GWL_EXSTYLE);
>     ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> 
> +    ShowWindow(window, SW_SHOW);
> +    ret = SetForegroundWindow(GetDesktopWindow());
> +    ok(ret, "Failed to set foreground window.\n");
> +    SetActiveWindow(window);
> +    ok(GetActiveWindow() == window, "Unexpected active window.\n");
> +    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);
> +    todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> +
> +    GetWindowRect(window, &r);
> +    ok(EqualRect(&r, &fullscreen_rect), "Expected %s, got %s.\n",
> +            wine_dbgstr_rect(&fullscreen_rect), wine_dbgstr_rect(&r));
> +
> +    hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
> +    ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
> +
> +    ret = SetForegroundWindow(window2);
> +    ok(ret, "Failed to set foreground window.\n");
> +    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);
> +    todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> +
> +    GetWindowRect(window, &r);
> +    ok(EqualRect(&r, &fullscreen_rect), "Expected %s, got %s.\n",
> +            wine_dbgstr_rect(&fullscreen_rect), wine_dbgstr_rect(&r));
> +
> +    ret = SetForegroundWindow(window);
> +    ok(ret, "Failed to set foreground window.\n");
> +    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);
> +    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);
> +    todo_wine 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 33ad957..b7b6ba8 100644
> --- a/dlls/ddraw/tests/ddraw2.c
> +++ b/dlls/ddraw/tests/ddraw2.c
> @@ -2663,14 +2663,16 @@ static void test_window_style(void)
> {
>     LONG style, exstyle, tmp, expected_style;
>     RECT fullscreen_rect, r;
> +    HWND window, window2;
>     IDirectDraw2 *ddraw;
> -    HWND window;
>     HRESULT hr;
>     ULONG ref;
>     BOOL ret;
> 
>     window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
>             0, 0, 100, 100, 0, 0, 0, 0);
> +    window2 = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
> +            0, 0, 50, 50, 0, 0, 0, 0);
>     ddraw = create_ddraw();
>     ok(!!ddraw, "Failed to create a ddraw object.\n");
> 
> @@ -2714,6 +2716,63 @@ static void test_window_style(void)
>     tmp = GetWindowLongA(window, GWL_EXSTYLE);
>     ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> 
> +    ShowWindow(window, SW_SHOW);
> +    ret = SetForegroundWindow(GetDesktopWindow());
> +    ok(ret, "Failed to set foreground window.\n");
> +    SetActiveWindow(window);
> +    ok(GetActiveWindow() == window, "Unexpected active window.\n");
> +    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);
> +    todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> +
> +    GetWindowRect(window, &r);
> +    ok(EqualRect(&r, &fullscreen_rect), "Expected %s, got %s.\n",
> +            wine_dbgstr_rect(&fullscreen_rect), wine_dbgstr_rect(&r));
> +
> +    hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
> +    ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
> +
> +    ret = SetForegroundWindow(window2);
> +    ok(ret, "Failed to set foreground window.\n");
> +    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);
> +    todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> +
> +    GetWindowRect(window, &r);
> +    ok(EqualRect(&r, &fullscreen_rect), "Expected %s, got %s.\n",
> +            wine_dbgstr_rect(&fullscreen_rect), wine_dbgstr_rect(&r));
> +
> +    ret = SetForegroundWindow(window);
> +    ok(ret, "Failed to set foreground window.\n");
> +    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);
> +    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);
> +    todo_wine 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 6182843..c7f5f64 100644
> --- a/dlls/ddraw/tests/ddraw4.c
> +++ b/dlls/ddraw/tests/ddraw4.c
> @@ -2899,14 +2899,16 @@ static void test_window_style(void)
> {
>     LONG style, exstyle, tmp, expected_style;
>     RECT fullscreen_rect, r;
> +    HWND window, window2;
>     IDirectDraw4 *ddraw;
> -    HWND window;
>     HRESULT hr;
>     ULONG ref;
>     BOOL ret;
> 
>     window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
>             0, 0, 100, 100, 0, 0, 0, 0);
> +    window2 = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
> +            0, 0, 50, 50, 0, 0, 0, 0);
>     ddraw = create_ddraw();
>     ok(!!ddraw, "Failed to create a ddraw object.\n");
> 
> @@ -2950,6 +2952,63 @@ static void test_window_style(void)
>     tmp = GetWindowLongA(window, GWL_EXSTYLE);
>     ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> 
> +    ShowWindow(window, SW_SHOW);
> +    ret = SetForegroundWindow(GetDesktopWindow());
> +    ok(ret, "Failed to set foreground window.\n");
> +    SetActiveWindow(window);
> +    ok(GetActiveWindow() == window, "Unexpected active window.\n");
> +    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);
> +    todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> +
> +    GetWindowRect(window, &r);
> +    ok(EqualRect(&r, &fullscreen_rect), "Expected %s, got %s.\n",
> +            wine_dbgstr_rect(&fullscreen_rect), wine_dbgstr_rect(&r));
> +
> +    hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
> +    ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
> +
> +    ret = SetForegroundWindow(window2);
> +    ok(ret, "Failed to set foreground window.\n");
> +    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);
> +    todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> +
> +    GetWindowRect(window, &r);
> +    ok(EqualRect(&r, &fullscreen_rect), "Expected %s, got %s.\n",
> +            wine_dbgstr_rect(&fullscreen_rect), wine_dbgstr_rect(&r));
> +
> +    ret = SetForegroundWindow(window);
> +    ok(ret, "Failed to set foreground window.\n");
> +    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);
> +    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);
> +    todo_wine 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 fc0f854..cbc10a3 100644
> --- a/dlls/ddraw/tests/ddraw7.c
> +++ b/dlls/ddraw/tests/ddraw7.c
> @@ -2564,14 +2564,16 @@ static void test_window_style(void)
> {
>     LONG style, exstyle, tmp, expected_style;
>     RECT fullscreen_rect, r;
> +    HWND window, window2;
>     IDirectDraw7 *ddraw;
> -    HWND window;
>     HRESULT hr;
>     ULONG ref;
>     BOOL ret;
> 
>     window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
>             0, 0, 100, 100, 0, 0, 0, 0);
> +    window2 = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
> +            0, 0, 50, 50, 0, 0, 0, 0);
>     ddraw = create_ddraw();
>     ok(!!ddraw, "Failed to create a ddraw object.\n");
> 
> @@ -2615,6 +2617,63 @@ static void test_window_style(void)
>     tmp = GetWindowLongA(window, GWL_EXSTYLE);
>     ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> 
> +    ShowWindow(window, SW_SHOW);
> +    ret = SetForegroundWindow(GetDesktopWindow());
> +    ok(ret, "Failed to set foreground window.\n");
> +    SetActiveWindow(window);
> +    ok(GetActiveWindow() == window, "Unexpected active window.\n");
> +    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);
> +    todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> +
> +    GetWindowRect(window, &r);
> +    ok(EqualRect(&r, &fullscreen_rect), "Expected %s, got %s.\n",
> +            wine_dbgstr_rect(&fullscreen_rect), wine_dbgstr_rect(&r));
> +
> +    hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
> +    ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
> +
> +    ret = SetForegroundWindow(window2);
> +    ok(ret, "Failed to set foreground window.\n");
> +    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);
> +    todo_wine ok(tmp == exstyle, "Expected window extended style %#x, got %#x.\n", exstyle, tmp);
> +
> +    GetWindowRect(window, &r);
> +    ok(EqualRect(&r, &fullscreen_rect), "Expected %s, got %s.\n",
> +            wine_dbgstr_rect(&fullscreen_rect), wine_dbgstr_rect(&r));
> +
> +    ret = SetForegroundWindow(window);
> +    ok(ret, "Failed to set foreground window.\n");
> +    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);
> +    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);
> +    todo_wine 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.34.1
> 
> 




More information about the wine-devel mailing list