|
|
|
@ -44,60 +44,6 @@ |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//========================================================================
|
|
|
|
|
// Return closest video mode by dimensions and bits per pixel
|
|
|
|
|
//========================================================================
|
|
|
|
|
|
|
|
|
|
static GLboolean getClosestVideoMode(int* width, int* height, |
|
|
|
|
int* bpp, GLboolean exactBPP) |
|
|
|
|
{ |
|
|
|
|
int mode, bestWidth = 0, bestHeight = 0, bestBPP = 0; |
|
|
|
|
unsigned int sizeDiff, leastSizeDiff; |
|
|
|
|
GLboolean foundMode = GL_FALSE; |
|
|
|
|
DEVMODE dm; |
|
|
|
|
|
|
|
|
|
leastSizeDiff = UINT_MAX; |
|
|
|
|
|
|
|
|
|
for (mode = 0; ; mode++) |
|
|
|
|
{ |
|
|
|
|
dm.dmSize = sizeof(DEVMODE); |
|
|
|
|
if (!EnumDisplaySettings(NULL, mode, &dm)) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
if (exactBPP && dm.dmBitsPerPel != *bpp) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
sizeDiff = (abs(dm.dmBitsPerPel - *bpp) << 25) | |
|
|
|
|
((dm.dmPelsWidth - *width) * |
|
|
|
|
(dm.dmPelsWidth - *width) + |
|
|
|
|
(dm.dmPelsHeight - *height) * |
|
|
|
|
(dm.dmPelsHeight - *height)); |
|
|
|
|
|
|
|
|
|
// We match BPP first, then screen area
|
|
|
|
|
|
|
|
|
|
if ((sizeDiff < leastSizeDiff) || (sizeDiff == leastSizeDiff)) |
|
|
|
|
{ |
|
|
|
|
bestWidth = dm.dmPelsWidth; |
|
|
|
|
bestHeight = dm.dmPelsHeight; |
|
|
|
|
bestBPP = dm.dmBitsPerPel; |
|
|
|
|
|
|
|
|
|
leastSizeDiff = sizeDiff; |
|
|
|
|
|
|
|
|
|
foundMode = GL_TRUE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!foundMode) |
|
|
|
|
return GL_FALSE; |
|
|
|
|
|
|
|
|
|
*width = bestWidth; |
|
|
|
|
*height = bestHeight; |
|
|
|
|
*bpp = bestBPP; |
|
|
|
|
|
|
|
|
|
return GL_TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
////// GLFW internal API //////
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
@ -106,41 +52,38 @@ static GLboolean getClosestVideoMode(int* width, int* height, |
|
|
|
|
// Change the current video mode
|
|
|
|
|
//========================================================================
|
|
|
|
|
|
|
|
|
|
void _glfwSetVideoMode(int* width, int* height, |
|
|
|
|
int* bpp, GLboolean exactBPP) |
|
|
|
|
int _glfwSetVideoMode(_GLFWmonitor* monitor, const GLFWvidmode* mode) |
|
|
|
|
{ |
|
|
|
|
DEVMODE dm; |
|
|
|
|
int closestWidth, closestHeight, closestBPP; |
|
|
|
|
GLFWvidmode current; |
|
|
|
|
const GLFWvidmode* best; |
|
|
|
|
|
|
|
|
|
closestWidth = *width; |
|
|
|
|
closestHeight = *height; |
|
|
|
|
closestBPP = *bpp; |
|
|
|
|
best = _glfwChooseVideoMode(monitor, mode); |
|
|
|
|
|
|
|
|
|
if (getClosestVideoMode(&closestWidth, &closestHeight, |
|
|
|
|
&closestBPP, exactBPP)) |
|
|
|
|
{ |
|
|
|
|
dm.dmSize = sizeof(DEVMODE); |
|
|
|
|
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; |
|
|
|
|
dm.dmPelsWidth = closestWidth; |
|
|
|
|
dm.dmPelsHeight = closestHeight; |
|
|
|
|
dm.dmBitsPerPel = closestBPP; |
|
|
|
|
_glfwPlatformGetVideoMode(monitor, ¤t); |
|
|
|
|
if (_glfwCompareVideoModes(¤t, best) == 0) |
|
|
|
|
return GL_TRUE; |
|
|
|
|
|
|
|
|
|
if (ChangeDisplaySettings(&dm, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL) |
|
|
|
|
{ |
|
|
|
|
*width = closestWidth; |
|
|
|
|
*height = closestHeight; |
|
|
|
|
*bpp = closestBPP; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
DEVMODE dm; |
|
|
|
|
dm.dmSize = sizeof(DEVMODE); |
|
|
|
|
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; |
|
|
|
|
dm.dmPelsWidth = best->width; |
|
|
|
|
dm.dmPelsHeight = best->height; |
|
|
|
|
dm.dmBitsPerPel = best->redBits + best->greenBits + best->blueBits; |
|
|
|
|
|
|
|
|
|
if (dm.dmBitsPerPel < 15 || dm.dmBitsPerPel >= 24) |
|
|
|
|
dm.dmBitsPerPel = 32; |
|
|
|
|
|
|
|
|
|
if (ChangeDisplaySettingsEx(monitor->win32.name, |
|
|
|
|
&dm, |
|
|
|
|
NULL, |
|
|
|
|
CDS_FULLSCREEN, |
|
|
|
|
NULL) != DISP_CHANGE_SUCCESSFUL) |
|
|
|
|
{ |
|
|
|
|
dm.dmSize = sizeof(DEVMODE); |
|
|
|
|
EnumDisplaySettings(NULL, ENUM_REGISTRY_SETTINGS, &dm); |
|
|
|
|
|
|
|
|
|
*width = dm.dmPelsWidth; |
|
|
|
|
*height = dm.dmPelsHeight; |
|
|
|
|
*bpp = dm.dmBitsPerPel; |
|
|
|
|
_glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to set video mode"); |
|
|
|
|
return GL_FALSE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return GL_TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -148,9 +91,10 @@ void _glfwSetVideoMode(int* width, int* height, |
|
|
|
|
// Restore the previously saved (original) video mode
|
|
|
|
|
//========================================================================
|
|
|
|
|
|
|
|
|
|
void _glfwRestoreVideoMode(void) |
|
|
|
|
void _glfwRestoreVideoMode(_GLFWmonitor* monitor) |
|
|
|
|
{ |
|
|
|
|
ChangeDisplaySettings(NULL, CDS_FULLSCREEN); |
|
|
|
|
ChangeDisplaySettingsEx(monitor->win32.name, |
|
|
|
|
NULL, NULL, CDS_FULLSCREEN, NULL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -174,7 +118,7 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) |
|
|
|
|
|
|
|
|
|
DISPLAY_DEVICE adapter, monitor; |
|
|
|
|
DEVMODE settings; |
|
|
|
|
const char* name; |
|
|
|
|
char* name; |
|
|
|
|
HDC dc; |
|
|
|
|
|
|
|
|
|
ZeroMemory(&adapter, sizeof(DISPLAY_DEVICE)); |
|
|
|
@ -235,6 +179,7 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) |
|
|
|
|
settings.dmPosition.x, |
|
|
|
|
settings.dmPosition.y); |
|
|
|
|
|
|
|
|
|
free(name); |
|
|
|
|
DeleteDC(dc); |
|
|
|
|
|
|
|
|
|
if (!monitors[found]) |
|
|
|
@ -352,7 +297,7 @@ void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode) |
|
|
|
|
ZeroMemory(&dm, sizeof(DEVMODE)); |
|
|
|
|
dm.dmSize = sizeof(DEVMODE); |
|
|
|
|
|
|
|
|
|
EnumDisplaySettings(monitor->win32.name, ENUM_REGISTRY_SETTINGS, &dm); |
|
|
|
|
EnumDisplaySettings(monitor->win32.name, ENUM_CURRENT_SETTINGS, &dm); |
|
|
|
|
|
|
|
|
|
mode->width = dm.dmPelsWidth; |
|
|
|
|
mode->height = dm.dmPelsHeight; |
|
|
|
|