From 2f5850c56a0e487520327665afe7ad4794909996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Wed, 3 Aug 2016 09:41:39 +0200 Subject: [PATCH] wined3d: Add WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT flag. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Józef Kucia Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/ddraw/ddraw.c | 2 +- dlls/dxgi/utils.c | 4 +++- dlls/wined3d/device.c | 15 ++++++++++++--- dlls/wined3d/swapchain.c | 13 ++++++++++++- dlls/wined3d/wined3d.spec | 2 +- dlls/wined3d/wined3d_private.h | 1 + include/wine/wined3d.h | 4 +++- 7 files changed, 33 insertions(+), 8 deletions(-) diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index aa4ac5c6ff..c9efba6e02 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -890,7 +890,7 @@ static HRESULT ddraw_set_cooperative_level(struct ddraw *ddraw, HWND window, if ((cooplevel & DDSCL_FULLSCREEN) != (ddraw->cooperative_level & DDSCL_FULLSCREEN) || window != ddraw->dest_window) { if (ddraw->cooperative_level & DDSCL_FULLSCREEN) - wined3d_device_restore_fullscreen_window(ddraw->wined3d_device, ddraw->dest_window); + wined3d_device_restore_fullscreen_window(ddraw->wined3d_device, ddraw->dest_window, NULL); if (cooplevel & DDSCL_FULLSCREEN) { diff --git a/dlls/dxgi/utils.c b/dlls/dxgi/utils.c index f671e306e3..5c6c5bd707 100644 --- a/dlls/dxgi/utils.c +++ b/dlls/dxgi/utils.c @@ -405,6 +405,8 @@ unsigned int dxgi_swapchain_flags_from_wined3d(unsigned int wined3d_flags) { unsigned int flags = 0; + wined3d_flags &= ~WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT; + if (wined3d_flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH) { wined3d_flags &= ~WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH; @@ -419,7 +421,7 @@ unsigned int dxgi_swapchain_flags_from_wined3d(unsigned int wined3d_flags) unsigned int wined3d_swapchain_flags_from_dxgi(unsigned int flags) { - unsigned int wined3d_flags = 0; /* WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL? */ + unsigned int wined3d_flags = WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT; /* WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL? */ if (flags & DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH) { diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 34ce2249e4..9a4f0d3211 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -911,12 +911,16 @@ void CDECL wined3d_device_setup_fullscreen_window(struct wined3d_device *device, device->filter_messages = filter_messages; } -void CDECL wined3d_device_restore_fullscreen_window(struct wined3d_device *device, HWND window) +void CDECL wined3d_device_restore_fullscreen_window(struct wined3d_device *device, HWND window, + const RECT *window_rect) { + unsigned int window_pos_flags = SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOACTIVATE; BOOL filter_messages; LONG style, exstyle; + RECT rect = {0}; - if (!device->style && !device->exStyle) return; + if (!device->style && !device->exStyle) + return; style = GetWindowLongW(window, GWL_STYLE); exstyle = GetWindowLongW(window, GWL_EXSTYLE); @@ -945,7 +949,12 @@ void CDECL wined3d_device_restore_fullscreen_window(struct wined3d_device *devic SetWindowLongW(window, GWL_STYLE, device->style); SetWindowLongW(window, GWL_EXSTYLE, device->exStyle); } - SetWindowPos(window, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); + + if (window_rect) + rect = *window_rect; + else + window_pos_flags |= (SWP_NOMOVE | SWP_NOSIZE); + SetWindowPos(window, 0, rect.left, rect.top, rect.right, rect.bottom, window_pos_flags); device->filter_messages = filter_messages; diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 1adf8ebf3c..e3d6259622 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -77,6 +77,13 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain) if (FAILED(hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d, swapchain->device->adapter->ordinal, &swapchain->original_mode))) ERR("Failed to restore display mode, hr %#x.\n", hr); + + if (swapchain->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT) + { + wined3d_device_restore_fullscreen_window(swapchain->device, swapchain->device_window, + &swapchain->original_window_rect); + wined3d_device_release_focus_window(swapchain->device); + } } if (swapchain->backup_dc) @@ -839,6 +846,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3 ERR("Failed to get current display mode, hr %#x.\n", hr); goto err; } + GetWindowRect(window, &swapchain->original_window_rect); GetClientRect(window, &client_rect); if (desc->windowed) @@ -1472,8 +1480,11 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha } else if (!swapchain->desc.windowed) { + RECT *window_rect = NULL; /* Fullscreen -> windowed switch */ - wined3d_device_restore_fullscreen_window(device, swapchain->device_window); + if (swapchain->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT) + window_rect = &swapchain->original_window_rect; + wined3d_device_restore_fullscreen_window(device, swapchain->device_window, window_rect); wined3d_device_release_focus_window(device); } diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index bdf3916093..e0cc501029 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -107,7 +107,7 @@ @ cdecl wined3d_device_process_vertices(ptr long long long ptr ptr long long) @ cdecl wined3d_device_release_focus_window(ptr) @ cdecl wined3d_device_reset(ptr ptr ptr ptr long) -@ cdecl wined3d_device_restore_fullscreen_window(ptr ptr) +@ cdecl wined3d_device_restore_fullscreen_window(ptr ptr ptr) @ cdecl wined3d_device_set_base_vertex_index(ptr long) @ cdecl wined3d_device_set_clip_plane(ptr long ptr) @ cdecl wined3d_device_set_clip_status(ptr ptr) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index abb950cf11..f300e4b6d8 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3228,6 +3228,7 @@ struct wined3d_swapchain struct wined3d_texture *front_buffer; struct wined3d_swapchain_desc desc; struct wined3d_display_mode original_mode, d3d_mode; + RECT original_window_rect; struct wined3d_gamma_ramp orig_gamma; BOOL render_to_fbo, reapply_mode; const struct wined3d_format *ds_format; diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 4f26f2e49e..661191de95 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -825,6 +825,7 @@ enum wined3d_display_rotation #define WINED3D_SWAPCHAIN_NOAUTOROTATE 0x00000020u #define WINED3D_SWAPCHAIN_UNPRUNEDMODE 0x00000040u #define WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH 0x00001000u +#define WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT 0x00002000u #define WINED3DDP_MAXTEXCOORD 8 @@ -2252,7 +2253,8 @@ void __cdecl wined3d_device_release_focus_window(struct wined3d_device *device); HRESULT __cdecl wined3d_device_reset(struct wined3d_device *device, const struct wined3d_swapchain_desc *swapchain_desc, const struct wined3d_display_mode *mode, wined3d_device_reset_cb callback, BOOL reset_state); -void __cdecl wined3d_device_restore_fullscreen_window(struct wined3d_device *device, HWND window); +void __cdecl wined3d_device_restore_fullscreen_window(struct wined3d_device *device, HWND window, + const RECT *window_rect); void __cdecl wined3d_device_set_base_vertex_index(struct wined3d_device *device, INT base_index); HRESULT __cdecl wined3d_device_set_clip_plane(struct wined3d_device *device, UINT plane_idx, const struct wined3d_vec4 *plane);