[PATCH v2 3/6] wined3d: Move fullscreen window setup/restore to new struct and functions.
Conor McCarthy
cmccarthy at codeweavers.com
Mon Jun 24 09:22:18 CDT 2019
Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
dlls/wined3d/device.c | 214 +++++++++++++++++----------------
dlls/wined3d/wined3d.spec | 3 +
dlls/wined3d/wined3d_private.h | 5 +-
include/wine/wined3d.h | 12 ++
4 files changed, 127 insertions(+), 107 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index d35a064..2e2da32 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -910,115 +910,24 @@ static void destroy_default_samplers(struct wined3d_device *device, struct wined
device->null_sampler = NULL;
}
-static LONG fullscreen_style(LONG style)
-{
- /* Make sure the window is managed, otherwise we won't get keyboard input. */
- style |= WS_POPUP | WS_SYSMENU;
- style &= ~(WS_CAPTION | WS_THICKFRAME);
-
- return style;
-}
-
-static LONG fullscreen_exstyle(LONG exstyle)
-{
- /* Filter out window decorations. */
- exstyle &= ~(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE);
-
- return exstyle;
-}
-
HRESULT CDECL wined3d_device_setup_fullscreen_window(struct wined3d_device *device,
HWND window, unsigned int w, unsigned int h)
{
- BOOL filter_messages;
- LONG style, exstyle;
-
- TRACE("Setting up window %p for fullscreen mode.\n", window);
-
- if (!IsWindow(window))
- {
- WARN("%p is not a valid window.\n", window);
- return WINED3DERR_NOTAVAILABLE;
- }
-
- if (device->style || device->exStyle)
- {
- ERR("Changing the window style for window %p, but another style (%08x, %08x) is already stored.\n",
- window, device->style, device->exStyle);
- }
-
- device->style = GetWindowLongW(window, GWL_STYLE);
- device->exStyle = GetWindowLongW(window, GWL_EXSTYLE);
-
- style = fullscreen_style(device->style);
- exstyle = fullscreen_exstyle(device->exStyle);
-
- TRACE("Old style was %08x, %08x, setting to %08x, %08x.\n",
- device->style, device->exStyle, style, exstyle);
-
- filter_messages = device->filter_messages;
+ HRESULT hr;
+ BOOL filter_messages = device->filter_messages;
device->filter_messages = TRUE;
-
- SetWindowLongW(window, GWL_STYLE, style);
- SetWindowLongW(window, GWL_EXSTYLE, exstyle);
- SetWindowPos(window, HWND_TOPMOST, 0, 0, w, h, SWP_FRAMECHANGED | SWP_SHOWWINDOW | SWP_NOACTIVATE);
-
+ hr = wined3d_fullscreen_setup_window(&device->fullscreen_state, window, w, h);
device->filter_messages = filter_messages;
-
- return WINED3D_OK;
+ return hr;
}
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;
-
- style = GetWindowLongW(window, GWL_STYLE);
- exstyle = GetWindowLongW(window, GWL_EXSTYLE);
-
- /* These flags are set by wined3d_device_setup_fullscreen_window, not the
- * application, and we want to ignore them in the test below, since it's
- * not the application's fault that they changed. Additionally, we want to
- * preserve the current status of these flags (i.e. don't restore them) to
- * more closely emulate the behavior of Direct3D, which leaves these flags
- * alone when returning to windowed mode. */
- device->style ^= (device->style ^ style) & WS_VISIBLE;
- device->exStyle ^= (device->exStyle ^ exstyle) & WS_EX_TOPMOST;
-
- TRACE("Restoring window style of window %p to %08x, %08x.\n",
- window, device->style, device->exStyle);
-
- filter_messages = device->filter_messages;
+ BOOL filter_messages = device->filter_messages;
device->filter_messages = TRUE;
-
- /* Only restore the style if the application didn't modify it during the
- * fullscreen phase. Some applications change it before calling Reset()
- * when switching between windowed and fullscreen modes (HL2), some
- * depend on the original style (Eve Online). */
- if (style == fullscreen_style(device->style) && exstyle == fullscreen_exstyle(device->exStyle))
- {
- SetWindowLongW(window, GWL_STYLE, device->style);
- SetWindowLongW(window, GWL_EXSTYLE, device->exStyle);
- }
-
- if (window_rect)
- rect = *window_rect;
- else
- window_pos_flags |= (SWP_NOMOVE | SWP_NOSIZE);
- SetWindowPos(window, 0, rect.left, rect.top,
- rect.right - rect.left, rect.bottom - rect.top, window_pos_flags);
-
+ wined3d_fullscreen_restore_window(&device->fullscreen_state, window, window_rect);
device->filter_messages = filter_messages;
-
- /* Delete the old values. */
- device->style = 0;
- device->exStyle = 0;
}
HRESULT CDECL wined3d_device_acquire_focus_window(struct wined3d_device *device, HWND window)
@@ -5538,19 +5447,19 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
}
else if (!swapchain_desc->windowed)
{
- DWORD style = device->style;
- DWORD exStyle = device->exStyle;
+ DWORD style = device->fullscreen_state.style;
+ DWORD exStyle = device->fullscreen_state.exStyle;
/* If we're in fullscreen, and the mode wasn't changed, we have to get the window back into
* the right position. Some applications(Battlefield 2, Guild Wars) move it and then call
* Reset to clear up their mess. Guild Wars also loses the device during that.
*/
- device->style = 0;
- device->exStyle = 0;
+ device->fullscreen_state.style = 0;
+ device->fullscreen_state.exStyle = 0;
wined3d_device_setup_fullscreen_window(device, swapchain->device_window,
swapchain_desc->backbuffer_width,
swapchain_desc->backbuffer_height);
- device->style = style;
- device->exStyle = exStyle;
+ device->fullscreen_state.style = style;
+ device->fullscreen_state.exStyle = exStyle;
}
if (FAILED(hr = wined3d_swapchain_resize_buffers(swapchain, swapchain_desc->backbuffer_count,
@@ -6036,3 +5945,102 @@ LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL
else
return CallWindowProcA(proc, window, message, wparam, lparam);
}
+
+static LONG fullscreen_style(LONG style)
+{
+ /* Make sure the window is managed, otherwise we won't get keyboard input. */
+ style |= WS_POPUP | WS_SYSMENU;
+ style &= ~(WS_CAPTION | WS_THICKFRAME);
+
+ return style;
+}
+
+static LONG fullscreen_exstyle(LONG exstyle)
+{
+ /* Filter out window decorations. */
+ exstyle &= ~(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE);
+
+ return exstyle;
+}
+
+HRESULT CDECL wined3d_fullscreen_setup_window(struct wined3d_fullscreen_state *fullscreen,
+ HWND window, unsigned int w, unsigned int h)
+{
+ LONG style, exstyle;
+
+ TRACE("Setting up window %p for fullscreen mode.\n", window);
+
+ if (!IsWindow(window))
+ {
+ WARN("%p is not a valid window.\n", window);
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ if (fullscreen->style || fullscreen->exStyle)
+ {
+ ERR("Changing the window style for window %p, but another style (%08x, %08x) is already stored.\n",
+ window, fullscreen->style, fullscreen->exStyle);
+ }
+
+ fullscreen->style = GetWindowLongW(window, GWL_STYLE);
+ fullscreen->exStyle = GetWindowLongW(window, GWL_EXSTYLE);
+
+ style = fullscreen_style(fullscreen->style);
+ exstyle = fullscreen_exstyle(fullscreen->exStyle);
+
+ TRACE("Old style was %08x, %08x, setting to %08x, %08x.\n",
+ fullscreen->style, fullscreen->exStyle, style, exstyle);
+
+ SetWindowLongW(window, GWL_STYLE, style);
+ SetWindowLongW(window, GWL_EXSTYLE, exstyle);
+ SetWindowPos(window, HWND_TOPMOST, 0, 0, w, h, SWP_FRAMECHANGED | SWP_SHOWWINDOW | SWP_NOACTIVATE);
+
+ return WINED3D_OK;
+}
+
+void CDECL wined3d_fullscreen_restore_window(struct wined3d_fullscreen_state *fullscreen, HWND window,
+ const RECT *window_rect)
+{
+ unsigned int window_pos_flags = SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOACTIVATE;
+ LONG style, exstyle;
+ RECT rect = {0};
+
+ if (!fullscreen->style && !fullscreen->exStyle)
+ return;
+
+ style = GetWindowLongW(window, GWL_STYLE);
+ exstyle = GetWindowLongW(window, GWL_EXSTYLE);
+
+ /* These flags are set by wined3d_device_setup_fullscreen_window, not the
+ * application, and we want to ignore them in the test below, since it's
+ * not the application's fault that they changed. Additionally, we want to
+ * preserve the current status of these flags (i.e. don't restore them) to
+ * more closely emulate the behavior of Direct3D, which leaves these flags
+ * alone when returning to windowed mode. */
+ fullscreen->style ^= (fullscreen->style ^ style) & WS_VISIBLE;
+ fullscreen->exStyle ^= (fullscreen->exStyle ^ exstyle) & WS_EX_TOPMOST;
+
+ TRACE("Restoring window style of window %p to %08x, %08x.\n",
+ window, fullscreen->style, fullscreen->exStyle);
+
+ /* Only restore the style if the application didn't modify it during the
+ * fullscreen phase. Some applications change it before calling Reset()
+ * when switching between windowed and fullscreen modes (HL2), some
+ * depend on the original style (Eve Online). */
+ if (style == fullscreen_style(fullscreen->style) && exstyle == fullscreen_exstyle(fullscreen->exStyle))
+ {
+ SetWindowLongW(window, GWL_STYLE, fullscreen->style);
+ SetWindowLongW(window, GWL_EXSTYLE, fullscreen->exStyle);
+ }
+
+ if (window_rect)
+ rect = *window_rect;
+ else
+ window_pos_flags |= (SWP_NOMOVE | SWP_NOSIZE);
+ SetWindowPos(window, 0, rect.left, rect.top,
+ rect.right - rect.left, rect.bottom - rect.top, window_pos_flags);
+
+ /* Delete the old values. */
+ fullscreen->style = 0;
+ fullscreen->exStyle = 0;
+}
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 904bb34..ddb4e56 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -314,3 +314,6 @@
@ cdecl wined3d_vertex_declaration_incref(ptr)
@ cdecl wined3d_extract_shader_input_signature_from_dxbc(ptr ptr long)
+
+@ cdecl wined3d_fullscreen_setup_window(ptr ptr long long)
+@ cdecl wined3d_fullscreen_restore_window(ptr ptr ptr)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8e23653..9d649fe 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3150,10 +3150,7 @@ struct wined3d_device
struct wined3d_device_parent *device_parent;
struct wined3d *wined3d;
struct wined3d_adapter *adapter;
-
- /* Window styles to restore when switching fullscreen mode */
- LONG style;
- LONG exStyle;
+ struct wined3d_fullscreen_state fullscreen_state;
const struct wined3d_shader_backend_ops *shader_backend;
void *shader_priv;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index d1d3ca4..f08383a 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2171,6 +2171,13 @@ struct wined3d_private_data
} content;
};
+struct wined3d_fullscreen_state
+{
+ /* Window styles to restore when switching fullscreen mode */
+ LONG style;
+ LONG exStyle;
+};
+
typedef HRESULT (CDECL *wined3d_device_reset_cb)(struct wined3d_resource *resource);
void __stdcall wined3d_mutex_lock(void);
@@ -2756,6 +2763,11 @@ ULONG __cdecl wined3d_vertex_declaration_incref(struct wined3d_vertex_declaratio
HRESULT __cdecl wined3d_extract_shader_input_signature_from_dxbc(struct wined3d_shader_signature *signature,
const void *byte_code, SIZE_T byte_code_size);
+void __cdecl wined3d_fullscreen_restore_window(struct wined3d_fullscreen_state *fullscreen, HWND window,
+ const RECT *window_rect);
+HRESULT __cdecl wined3d_fullscreen_setup_window(struct wined3d_fullscreen_state *fullscreen,
+ HWND window, unsigned int w, unsigned int h);
+
/* Return the integer base-2 logarithm of x. Undefined for x == 0. */
static inline unsigned int wined3d_log2i(unsigned int x)
{
--
2.21.0
More information about the wine-devel
mailing list