wined3d: Inhibit the screensaver while a full-screen application has focus.

This matches Windows behaviour at least as of Windows 7.

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2019-08-05 18:25:35 +04:30 committed by Alexandre Julliard
parent 14dee7bd0d
commit 236f590fd6
3 changed files with 23 additions and 1 deletions

View File

@ -912,6 +912,8 @@ static void destroy_default_samplers(struct wined3d_device *device, struct wined
HRESULT CDECL wined3d_device_acquire_focus_window(struct wined3d_device *device, HWND window) HRESULT CDECL wined3d_device_acquire_focus_window(struct wined3d_device *device, HWND window)
{ {
unsigned int screensaver_active;
TRACE("device %p, window %p.\n", device, window); TRACE("device %p, window %p.\n", device, window);
if (!wined3d_register_window(NULL, window, device, 0)) if (!wined3d_register_window(NULL, window, device, 0))
@ -922,6 +924,9 @@ HRESULT CDECL wined3d_device_acquire_focus_window(struct wined3d_device *device,
InterlockedExchangePointer((void **)&device->focus_window, window); InterlockedExchangePointer((void **)&device->focus_window, window);
SetWindowPos(window, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); SetWindowPos(window, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
SystemParametersInfoW(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_active, 0);
if ((device->restore_screensaver = !!screensaver_active))
SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
return WINED3D_OK; return WINED3D_OK;
} }
@ -932,6 +937,11 @@ void CDECL wined3d_device_release_focus_window(struct wined3d_device *device)
if (device->focus_window) wined3d_unregister_window(device->focus_window); if (device->focus_window) wined3d_unregister_window(device->focus_window);
InterlockedExchangePointer((void **)&device->focus_window, NULL); InterlockedExchangePointer((void **)&device->focus_window, NULL);
if (device->restore_screensaver)
{
SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);
device->restore_screensaver = FALSE;
}
} }
static void device_init_swapchain_state(struct wined3d_device *device, struct wined3d_swapchain *swapchain) static void device_init_swapchain_state(struct wined3d_device *device, struct wined3d_swapchain *swapchain)

View File

@ -1172,6 +1172,7 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
{ {
struct wined3d_device *device = swapchain->device; struct wined3d_device *device = swapchain->device;
HWND window = swapchain->state.device_window; HWND window = swapchain->state.device_window;
unsigned int screensaver_active;
BOOL focus_messages, filter; BOOL focus_messages, filter;
/* This code is not protected by the wined3d mutex, so it may run while /* This code is not protected by the wined3d mutex, so it may run while
@ -1184,6 +1185,10 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
if (activate) if (activate)
{ {
SystemParametersInfoW(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_active, 0);
if ((device->restore_screensaver = !!screensaver_active))
SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
if (!(device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES)) if (!(device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES))
{ {
/* The d3d versions do not agree on the exact messages here. D3d8 restores /* The d3d versions do not agree on the exact messages here. D3d8 restores
@ -1209,6 +1214,12 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
} }
else else
{ {
if (device->restore_screensaver)
{
SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);
device->restore_screensaver = FALSE;
}
if (FAILED(wined3d_set_adapter_display_mode(device->wined3d, if (FAILED(wined3d_set_adapter_display_mode(device->wined3d,
device->adapter->ordinal, NULL))) device->adapter->ordinal, NULL)))
ERR("Failed to set display mode.\n"); ERR("Failed to set display mode.\n");

View File

@ -3180,7 +3180,8 @@ struct wined3d_device
BYTE d3d_initialized : 1; BYTE d3d_initialized : 1;
BYTE inScene : 1; /* A flag to check for proper BeginScene / EndScene call pairs */ BYTE inScene : 1; /* A flag to check for proper BeginScene / EndScene call pairs */
BYTE softwareVertexProcessing : 1; /* process vertex shaders using software or hardware */ BYTE softwareVertexProcessing : 1; /* process vertex shaders using software or hardware */
BYTE padding : 4; BYTE restore_screensaver : 1;
BYTE padding : 3;
unsigned char surface_alignment; /* Line Alignment of surfaces */ unsigned char surface_alignment; /* Line Alignment of surfaces */