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:
parent
14dee7bd0d
commit
236f590fd6
|
@ -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)
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue