diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4d13379c..e87fcc7e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -41,7 +41,7 @@ elseif(_GLFW_WIN32_WGL) set(libglfw_SOURCES ${common_SOURCES} win32_enable.c win32_fullscreen.c win32_gamma.c win32_init.c win32_joystick.c win32_opengl.c win32_time.c win32_window.c - win32_dllmain.c) + win32_dllmain.c win32_display.c) elseif(_GLFW_X11_GLX) set(libglfw_SOURCES ${common_SOURCES} x11_display.c x11_enable.c x11_fullscreen.c x11_gamma.c x11_init.c x11_joystick.c diff --git a/src/win32_display.c b/src/win32_display.c new file mode 100644 index 00000000..31b48cef --- /dev/null +++ b/src/win32_display.c @@ -0,0 +1,115 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: X11 (Unix) +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#include "internal.h" + +#include +#include + + +////////////////////////////////////////////////////////////////////////// +////// GLFW platform API ////// +////////////////////////////////////////////////////////////////////////// + +_GLFWdisplay** _glfwCreateDisplay(_GLFWdisplay** current, DISPLAY_DEVICE* adapter, DISPLAY_DEVICE* monitor, DEVMODE* setting) +{ + HDC dc = NULL; + + *current = _glfwMalloc(sizeof(_GLFWdisplay)); + memset(*current, 0, sizeof(_GLFWdisplay)); + + dc = CreateDC("DISPLAY", monitor->DeviceString, NULL, NULL); + + (*current)->physicalWidth = GetDeviceCaps(dc, HORZSIZE); + (*current)->physicalHeight = GetDeviceCaps(dc, VERTSIZE); + + DeleteDC(dc); + + memcpy((*current)->deviceName, monitor->DeviceName, GLFW_DISPLAY_PARAM_S_NAME_LEN+1); + (*current)->deviceName[GLFW_DISPLAY_PARAM_S_NAME_LEN] = '\0'; + + (*current)->screenXPosition = setting->dmPosition.x; + (*current)->screenYPosition = setting->dmPosition.y; + return &((*current)->next); +} + +_GLFWdisplay* _glfwDestroyDisplay(_GLFWdisplay* display) +{ + _GLFWdisplay* result; + + result = display->next; + + _glfwFree(display); + + return result; +} + +void _glfwInitDisplays(void) +{ + _GLFWdisplay** curDisplay; + + DISPLAY_DEVICE adapter; + DWORD adapterNum; + + DISPLAY_DEVICE monitor; + + DEVMODE setting; + DWORD settingNum; + + curDisplay = &_glfwLibrary.displayListHead; + + adapter.cb = sizeof(DISPLAY_DEVICE); + adapterNum = 0; + + monitor.cb = sizeof(DISPLAY_DEVICE); + setting.dmSize = sizeof(DEVMODE); + settingNum = 0; + + while(EnumDisplayDevices(NULL, adapterNum++, &adapter, 0)) + { + if(adapter.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) + { + continue; + } + + EnumDisplaySettingsEx(adapter.DeviceName, ENUM_CURRENT_SETTINGS, &setting, EDS_ROTATEDMODE); + + EnumDisplayDevices(adapter.DeviceName, 0, &monitor, 0); + + curDisplay = _glfwCreateDisplay(curDisplay, &adapter, &monitor, &setting); + } +} + +void _glfwTerminateDisplays(void) +{ + while(_glfwLibrary.displayListHead) + _glfwLibrary.displayListHead = _glfwDestroyDisplay(_glfwLibrary.displayListHead); +} + diff --git a/src/win32_init.c b/src/win32_init.c index 51b3f093..853a1f13 100644 --- a/src/win32_init.c +++ b/src/win32_init.c @@ -164,6 +164,8 @@ int _glfwPlatformInit(void) _glfwLibrary.originalRampSize = 256; _glfwPlatformGetGammaRamp(&_glfwLibrary.originalRamp); + _glfwInitDisplays(); + _glfwInitTimer(); return GL_TRUE; @@ -179,6 +181,8 @@ int _glfwPlatformTerminate(void) // Restore the original gamma ramp _glfwPlatformSetGammaRamp(&_glfwLibrary.originalRamp); + _glfwTerminateDisplays(); + if (_glfwLibrary.Win32.classAtom) { UnregisterClass(_GLFW_WNDCLASSNAME, _glfwLibrary.Win32.instance); diff --git a/src/win32_platform.h b/src/win32_platform.h index 6b61cb77..d1ee889a 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -318,6 +318,10 @@ typedef struct _GLFWlibraryWin32 // Time void _glfwInitTimer(void); +// Display support +void _glfwInitDisplays(void); +void _glfwTerminateDisplays(void); + // Fullscreen support void _glfwSetVideoMode(int* width, int* height, int* bpp, int* refreshRate,