From 355b46e6c595341c6061c7bb6fd6131eecdc5bee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Thu, 9 Feb 2017 21:21:58 +0100 Subject: [PATCH] Win32: Fix screensaver and blanking prevention On Vista and later, Handling WM_SYSCOMMAND is not enough to prevent password protected screensavers or monitor blanking. Fixes #851. --- README.md | 2 ++ src/win32_platform.h | 1 + src/win32_window.c | 9 +++++++++ 3 files changed, 12 insertions(+) diff --git a/README.md b/README.md index 7edba5a2..23e12ade 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,8 @@ information on what to include when reporting a bug. - [Win32] Bugfix: Bitness test in `FindVulkan.cmake` was VS specific (#928) - [Win32] Bugfix: `glfwVulkanSupported` emitted an error on systems with a loader but no ICD (#916) +- [Win32] Bugfix: Non-iconified full sreeen windows did not prevent screen + blanking or password enabled screensavers (#851) - [X11] Replaced `_GLFW_HAS_XF86VM` compile-time option with dynamic loading - [X11] Bugfix: `glfwGetVideoMode` would segfault on Cygwin/X - [X11] Bugfix: Dynamic X11 library loading did not use full sonames (#941) diff --git a/src/win32_platform.h b/src/win32_platform.h index d072d227..8b2af43f 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -248,6 +248,7 @@ typedef struct _GLFWlibraryWin32 { HWND helperWindowHandle; DWORD foregroundLockTimeout; + int acquiredMonitorCount; char* clipboardString; char keyName[64]; short int keycodes[512]; diff --git a/src/win32_window.c b/src/win32_window.c index e4f20267..514a5206 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -422,6 +422,11 @@ static GLFWbool acquireMonitor(_GLFWwindow* window) GLFWbool status; int xpos, ypos; + if (!_glfw.win32.acquiredMonitorCount) + SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED); + if (!window->monitor->window) + _glfw.win32.acquiredMonitorCount++; + status = _glfwSetVideoModeWin32(window->monitor, &window->videoMode); _glfwPlatformGetVideoMode(window->monitor, &mode); @@ -442,6 +447,10 @@ static void releaseMonitor(_GLFWwindow* window) if (window->monitor->window != window) return; + _glfw.win32.acquiredMonitorCount--; + if (!_glfw.win32.acquiredMonitorCount) + SetThreadExecutionState(ES_CONTINUOUS); + _glfwInputMonitorWindow(window->monitor, NULL); _glfwRestoreVideoModeWin32(window->monitor); }