mirror of
https://github.com/glfw/glfw.git
synced 2024-11-15 02:34:36 +00:00
Fix fullscreen issue
Fixed the fullscreen issue by reverting my splitting of the function. I'll check later why this happened.
This commit is contained in:
parent
71dfe1fc45
commit
b792ee1325
@ -31,7 +31,6 @@
|
|||||||
|
|
||||||
#if defined(_GLFW_WIN32)
|
#if defined(_GLFW_WIN32)
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
@ -41,145 +40,89 @@
|
|||||||
const UINT32 QDC_ONLY_ACTIVE_PATHS = 0x00000002;
|
const UINT32 QDC_ONLY_ACTIVE_PATHS = 0x00000002;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DISPLAYCONFIG_PATH_INFO* getDisplayPaths(UINT32 *out_pathsCount)
|
static char * getAccurateMonitorName(const WCHAR *deviceName)
|
||||||
{
|
{
|
||||||
DISPLAYCONFIG_PATH_INFO *paths;
|
DISPLAYCONFIG_PATH_INFO *paths;
|
||||||
DISPLAYCONFIG_MODE_INFO *modes;
|
DISPLAYCONFIG_MODE_INFO *modes;
|
||||||
|
char *retval;
|
||||||
|
UINT32 pathCount;
|
||||||
UINT32 modeCount;
|
UINT32 modeCount;
|
||||||
UINT32 pathsCount;
|
UINT32 i;
|
||||||
LONG rc;
|
LONG rc;
|
||||||
|
|
||||||
paths = NULL;
|
paths = NULL;
|
||||||
modes = NULL;
|
modes = NULL;
|
||||||
|
retval = NULL;
|
||||||
|
pathCount = 0;
|
||||||
modeCount = 0;
|
modeCount = 0;
|
||||||
pathsCount = 0;
|
i = 0;
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
rc = GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &pathsCount, &modeCount);
|
rc = GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &pathCount, &modeCount);
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
break;
|
goto GET_ACCURATE_MONITOR_NAME_FAILURE;
|
||||||
|
|
||||||
assert(paths == NULL);
|
free(paths);
|
||||||
assert(modes == NULL);
|
free(modes);
|
||||||
paths = (DISPLAYCONFIG_PATH_INFO *) malloc(sizeof (DISPLAYCONFIG_PATH_INFO) * pathsCount);
|
|
||||||
|
paths = (DISPLAYCONFIG_PATH_INFO *) malloc(sizeof (DISPLAYCONFIG_PATH_INFO) * pathCount);
|
||||||
modes = (DISPLAYCONFIG_MODE_INFO *) malloc(sizeof (DISPLAYCONFIG_MODE_INFO) * modeCount);
|
modes = (DISPLAYCONFIG_MODE_INFO *) malloc(sizeof (DISPLAYCONFIG_MODE_INFO) * modeCount);
|
||||||
|
if ((paths == NULL) || (modes == NULL))
|
||||||
|
goto GET_ACCURATE_MONITOR_NAME_FAILURE;
|
||||||
|
|
||||||
if (paths == NULL)
|
rc = QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &pathCount, paths, &modeCount, modes, 0);
|
||||||
{
|
|
||||||
free(modes);
|
|
||||||
modes = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(modes == NULL)
|
|
||||||
{
|
|
||||||
free(paths);
|
|
||||||
paths = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &pathsCount, paths, &modeCount, modes, 0);
|
|
||||||
if (rc == ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
free(modes); // We won't use it.
|
|
||||||
modes = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
free(paths);
|
|
||||||
paths = NULL;
|
|
||||||
free(modes);
|
|
||||||
modes = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
} while (rc == ERROR_INSUFFICIENT_BUFFER);
|
} while (rc == ERROR_INSUFFICIENT_BUFFER);
|
||||||
|
|
||||||
assert(modes == NULL);
|
if (rc == ERROR_SUCCESS)
|
||||||
|
|
||||||
*out_pathsCount = pathsCount;
|
|
||||||
return paths;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* getMonitorNameFromPath(const WCHAR *deviceName, const DISPLAYCONFIG_PATH_INFO *paths, const UINT32 pathCount)
|
|
||||||
{
|
{
|
||||||
UINT32 i;
|
|
||||||
LONG rc;
|
|
||||||
char *monitorName;
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
rc = 0;
|
|
||||||
monitorName = NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < pathCount; i++)
|
for (i = 0; i < pathCount; i++)
|
||||||
{
|
{
|
||||||
DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName;
|
DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName;
|
||||||
DISPLAYCONFIG_TARGET_DEVICE_NAME targetName;
|
DISPLAYCONFIG_TARGET_DEVICE_NAME targetName;
|
||||||
|
|
||||||
ZeroMemory(&sourceName, sizeof(sourceName));
|
ZeroMemory(&sourceName, sizeof(sourceName));
|
||||||
|
sourceName.header.adapterId = paths[i].targetInfo.adapterId;
|
||||||
sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
|
sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
|
||||||
sourceName.header.size = sizeof (sourceName);
|
sourceName.header.size = sizeof (sourceName);
|
||||||
sourceName.header.adapterId = paths[i].sourceInfo.adapterId;
|
|
||||||
sourceName.header.id = paths[i].sourceInfo.id;
|
sourceName.header.id = paths[i].sourceInfo.id;
|
||||||
|
|
||||||
rc = DisplayConfigGetDeviceInfo(&sourceName.header);
|
rc = DisplayConfigGetDeviceInfo(&sourceName.header);
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
break;
|
break;
|
||||||
|
else if (wcscmp(deviceName, sourceName.viewGdiDeviceName) != 0)
|
||||||
if (wcscmp(deviceName, sourceName.viewGdiDeviceName) != 0)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ZeroMemory(&targetName, sizeof(targetName));
|
ZeroMemory(&targetName, sizeof(targetName));
|
||||||
targetName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
|
|
||||||
targetName.header.size = sizeof (targetName);
|
|
||||||
targetName.header.adapterId = paths[i].targetInfo.adapterId;
|
targetName.header.adapterId = paths[i].targetInfo.adapterId;
|
||||||
targetName.header.id = paths[i].targetInfo.id;
|
targetName.header.id = paths[i].targetInfo.id;
|
||||||
|
targetName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
|
||||||
|
targetName.header.size = sizeof (targetName);
|
||||||
rc = DisplayConfigGetDeviceInfo(&targetName.header);
|
rc = DisplayConfigGetDeviceInfo(&targetName.header);
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc == ERROR_SUCCESS)
|
||||||
break;
|
|
||||||
|
|
||||||
monitorName = _glfwCreateUTF8FromWideStringWin32(targetName.monitorFriendlyDeviceName);
|
|
||||||
if (monitorName && (*monitorName == '\0')) // If we got an empty string, treat it as failure so we'll fallback to getting the generic name.
|
|
||||||
{
|
{
|
||||||
free(monitorName);
|
retval = _glfwCreateUTF8FromWideStringWin32(targetName.monitorFriendlyDeviceName);
|
||||||
monitorName = NULL;
|
/* if we got an empty string, treat it as failure so we'll fallback
|
||||||
|
to getting the generic name. */
|
||||||
|
if (retval && (*retval == '\0'))
|
||||||
|
{
|
||||||
|
free(retval);
|
||||||
|
retval = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return monitorName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns NULL if an error happens or the OS doesn't provide the needed feature (anything below Win7)
|
|
||||||
// If the pointer is valid, the caller takes ownership of the underlying memory and has to free it when done.
|
|
||||||
//
|
|
||||||
char* tryGetAccurateMonitorName(const WCHAR *deviceName)
|
|
||||||
{
|
|
||||||
char *monitorName;
|
|
||||||
DISPLAYCONFIG_PATH_INFO *paths;
|
|
||||||
UINT32 pathCount;
|
|
||||||
|
|
||||||
monitorName = NULL;
|
|
||||||
paths = NULL;
|
|
||||||
pathCount = 0;
|
|
||||||
|
|
||||||
if(QueryDisplayConfig == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
// If QueryDisplayConfig is present then GetDisplayConfigBufferSizes and DisplayConfigGetDeviceInfo also should be present.
|
|
||||||
assert(GetDisplayConfigBufferSizes != NULL);
|
|
||||||
assert(DisplayConfigGetDeviceInfo != NULL);
|
|
||||||
|
|
||||||
paths = getDisplayPaths(&pathCount);
|
|
||||||
if (paths == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
monitorName = getMonitorNameFromPath(deviceName, paths, pathCount);
|
|
||||||
|
|
||||||
free(paths);
|
free(paths);
|
||||||
return monitorName;
|
free(modes);
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
GET_ACCURATE_MONITOR_NAME_FAILURE:
|
||||||
|
free(retval);
|
||||||
|
free(paths);
|
||||||
|
free(modes);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Callback for EnumDisplayMonitors in createMonitor
|
// Callback for EnumDisplayMonitors in createMonitor
|
||||||
@ -190,29 +133,29 @@ static BOOL CALLBACK monitorCallback(HMONITOR handle,
|
|||||||
LPARAM data)
|
LPARAM data)
|
||||||
{
|
{
|
||||||
MONITORINFOEXW mi;
|
MONITORINFOEXW mi;
|
||||||
char* accurateMonitorName = NULL;
|
char *possiblyMoreAccurateMonitorName = NULL;
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) data;
|
|
||||||
|
|
||||||
ZeroMemory(&mi, sizeof(mi));
|
ZeroMemory(&mi, sizeof(mi));
|
||||||
mi.cbSize = sizeof(mi);
|
mi.cbSize = sizeof(mi);
|
||||||
|
|
||||||
if (GetMonitorInfoW(handle, (MONITORINFO*) &mi) == 0)
|
if (GetMonitorInfoW(handle, (MONITORINFO*) &mi))
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
if (wcscmp(mi.szDevice, monitor->win32.adapterName) != 0)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
// If the monitor driver is installed, we will already have an accurate name for the monitor.
|
|
||||||
if (strcmp(monitor->name, "Generic PnP Monitor") != 0)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
monitor->win32.handle = handle;
|
|
||||||
accurateMonitorName = tryGetAccurateMonitorName(mi.szDevice);
|
|
||||||
if(accurateMonitorName != NULL)
|
|
||||||
{
|
{
|
||||||
strncpy(monitor->name, accurateMonitorName, sizeof(monitor->name) - 1);
|
_GLFWmonitor* monitor = (_GLFWmonitor*) data;
|
||||||
free(accurateMonitorName);
|
if (wcscmp(mi.szDevice, monitor->win32.adapterName) == 0)
|
||||||
accurateMonitorName = NULL;
|
{
|
||||||
|
monitor->win32.handle = handle;
|
||||||
|
|
||||||
|
if (strcmp(monitor->name, "Generic PnP Monitor") == 0)
|
||||||
|
{
|
||||||
|
possiblyMoreAccurateMonitorName = getAccurateMonitorName(mi.szDevice);
|
||||||
|
if(possiblyMoreAccurateMonitorName != NULL)
|
||||||
|
{
|
||||||
|
strncpy(monitor->name, possiblyMoreAccurateMonitorName, sizeof(monitor->name) - 1);
|
||||||
|
free(possiblyMoreAccurateMonitorName);
|
||||||
|
possiblyMoreAccurateMonitorName = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -708,4 +651,3 @@ GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* handle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif // _GLFW_WIN32
|
#endif // _GLFW_WIN32
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user