Win32: Improve monitor enumeration

This changes enumeration to add as a GLFW monitor any active adapter
without displays, even if other active adapters do have displays.

Related to #441.
Fixes #960.
This commit is contained in:
Camilla Löwy 2017-03-14 18:40:41 +01:00
parent e2ce3026a0
commit 0df9cc2fc5
2 changed files with 29 additions and 50 deletions

View File

@ -165,6 +165,7 @@ information on what to include when reporting a bug.
- [Win32] Bugfix: Mouse capture logic lost secondary release messages (#954) - [Win32] Bugfix: Mouse capture logic lost secondary release messages (#954)
- [Win32] Bugfix: The 32-bit Vulkan loader library static was not searched for - [Win32] Bugfix: The 32-bit Vulkan loader library static was not searched for
- [Win32] Bugfix: Vulkan libraries have a new path as of SDK 1.0.42.0 (#956) - [Win32] Bugfix: Vulkan libraries have a new path as of SDK 1.0.42.0 (#956)
- [Win32] Bugfix: Monitors with no display devices were not enumerated (#960)
- [X11] Replaced `_GLFW_HAS_XF86VM` compile-time option with dynamic loading - [X11] Replaced `_GLFW_HAS_XF86VM` compile-time option with dynamic loading
- [X11] Bugfix: `glfwGetVideoMode` would segfault on Cygwin/X - [X11] Bugfix: `glfwGetVideoMode` would segfault on Cygwin/X
- [X11] Bugfix: Dynamic X11 library loading did not use full sonames (#941) - [X11] Bugfix: Dynamic X11 library loading did not use full sonames (#941)

View File

@ -94,7 +94,6 @@ void _glfwPollMonitorsWin32(void)
_GLFWmonitor** disconnected = NULL; _GLFWmonitor** disconnected = NULL;
DWORD adapterIndex, displayIndex; DWORD adapterIndex, displayIndex;
DISPLAY_DEVICEW adapter, display; DISPLAY_DEVICEW adapter, display;
GLFWbool hasDisplays = GLFW_FALSE;
disconnectedCount = _glfw.monitorCount; disconnectedCount = _glfw.monitorCount;
if (disconnectedCount) if (disconnectedCount)
@ -105,30 +104,6 @@ void _glfwPollMonitorsWin32(void)
_glfw.monitorCount * sizeof(_GLFWmonitor*)); _glfw.monitorCount * sizeof(_GLFWmonitor*));
} }
// HACK: Check if any active adapters have connected displays
// If not, this is a headless system or a VMware guest
for (adapterIndex = 0; ; adapterIndex++)
{
ZeroMemory(&adapter, sizeof(DISPLAY_DEVICEW));
adapter.cb = sizeof(DISPLAY_DEVICEW);
if (!EnumDisplayDevicesW(NULL, adapterIndex, &adapter, 0))
break;
if (!(adapter.StateFlags & DISPLAY_DEVICE_ACTIVE))
continue;
ZeroMemory(&display, sizeof(DISPLAY_DEVICEW));
display.cb = sizeof(DISPLAY_DEVICEW);
if (EnumDisplayDevicesW(adapter.DeviceName, 0, &display, 0))
{
hasDisplays = GLFW_TRUE;
break;
}
}
for (adapterIndex = 0; ; adapterIndex++) for (adapterIndex = 0; ; adapterIndex++)
{ {
int type = _GLFW_INSERT_LAST; int type = _GLFW_INSERT_LAST;
@ -145,37 +120,40 @@ void _glfwPollMonitorsWin32(void)
if (adapter.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) if (adapter.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
type = _GLFW_INSERT_FIRST; type = _GLFW_INSERT_FIRST;
if (hasDisplays) for (displayIndex = 0; ; displayIndex++)
{ {
for (displayIndex = 0; ; displayIndex++) ZeroMemory(&display, sizeof(DISPLAY_DEVICEW));
display.cb = sizeof(DISPLAY_DEVICEW);
if (!EnumDisplayDevicesW(adapter.DeviceName, displayIndex, &display, 0))
break;
if (!(display.StateFlags & DISPLAY_DEVICE_ACTIVE))
continue;
for (i = 0; i < disconnectedCount; i++)
{ {
ZeroMemory(&display, sizeof(DISPLAY_DEVICEW)); if (disconnected[i] &&
display.cb = sizeof(DISPLAY_DEVICEW); wcscmp(disconnected[i]->win32.displayName,
display.DeviceName) == 0)
if (!EnumDisplayDevicesW(adapter.DeviceName, displayIndex, &display, 0))
break;
for (i = 0; i < disconnectedCount; i++)
{ {
if (disconnected[i] && disconnected[i] = NULL;
wcscmp(disconnected[i]->win32.displayName, break;
display.DeviceName) == 0)
{
disconnected[i] = NULL;
break;
}
} }
if (i < disconnectedCount)
continue;
_glfwInputMonitor(createMonitor(&adapter, &display),
GLFW_CONNECTED, type);
type = _GLFW_INSERT_LAST;
} }
if (i < disconnectedCount)
continue;
_glfwInputMonitor(createMonitor(&adapter, &display),
GLFW_CONNECTED, type);
type = _GLFW_INSERT_LAST;
} }
else
// HACK: If an active adapter does not have any display devices
// (as sometimes happens), add it directly as a monitor
if (displayIndex == 0)
{ {
for (i = 0; i < disconnectedCount; i++) for (i = 0; i < disconnectedCount; i++)
{ {