Conflicts: .gitignoremaster
						commit
						26c95559d2
					
				
				 19 changed files with 793 additions and 93 deletions
			
			
		@ -0,0 +1,147 @@ | 
				
			||||
//========================================================================
 | 
				
			||||
// GLFW - An OpenGL framework
 | 
				
			||||
// Platform:    Any
 | 
				
			||||
// API version: 3.0
 | 
				
			||||
// WWW:         http://www.glfw.org/
 | 
				
			||||
//------------------------------------------------------------------------
 | 
				
			||||
// Copyright (c) 2002-2006 Marcus Geelnard
 | 
				
			||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
 | 
				
			||||
//
 | 
				
			||||
// 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" | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//////////////////////////////////////////////////////////////////////////
 | 
				
			||||
//////                        GLFW public API                       //////
 | 
				
			||||
//////////////////////////////////////////////////////////////////////////
 | 
				
			||||
 | 
				
			||||
//========================================================================
 | 
				
			||||
// Iterate through connected monitors
 | 
				
			||||
//========================================================================
 | 
				
			||||
 | 
				
			||||
GLFWAPI GLFWmonitor glfwGetNextMonitor(GLFWmonitor handle) | 
				
			||||
{ | 
				
			||||
    _GLFWmonitor* iterator = (_GLFWmonitor*) handle; | 
				
			||||
    _GLFWmonitor* result = NULL; | 
				
			||||
 | 
				
			||||
    if (!_glfwInitialized) | 
				
			||||
    { | 
				
			||||
        _glfwSetError(GLFW_NOT_INITIALIZED, NULL); | 
				
			||||
        return result; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    if (iterator == NULL) | 
				
			||||
        result = _glfwLibrary.monitorListHead; | 
				
			||||
    else | 
				
			||||
        result = iterator->next; | 
				
			||||
 | 
				
			||||
    return result; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//========================================================================
 | 
				
			||||
// Get monitor parameter
 | 
				
			||||
//========================================================================
 | 
				
			||||
 | 
				
			||||
GLFWAPI int glfwGetMonitorParam(GLFWmonitor handle, int param) | 
				
			||||
{ | 
				
			||||
    _GLFWmonitor* monitor = (_GLFWmonitor*) handle; | 
				
			||||
 | 
				
			||||
    if (!_glfwInitialized) | 
				
			||||
    { | 
				
			||||
        _glfwSetError(GLFW_NOT_INITIALIZED, NULL); | 
				
			||||
        return 0; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    if (monitor == NULL) | 
				
			||||
    { | 
				
			||||
        _glfwSetError(GLFW_INVALID_VALUE, | 
				
			||||
                      "glfwGetMonitorParam: Invalid monitor handle"); | 
				
			||||
        return 0; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    switch (param) | 
				
			||||
    { | 
				
			||||
        case GLFW_MONITOR_PHYSICAL_WIDTH: | 
				
			||||
            return monitor->physicalWidth; | 
				
			||||
        case GLFW_MONITOR_PHYSICAL_HEIGHT: | 
				
			||||
            return monitor->physicalHeight; | 
				
			||||
        case GLFW_MONITOR_SCREEN_POS_X: | 
				
			||||
            return monitor->screenX; | 
				
			||||
        case GLFW_MONITOR_SCREEN_POS_Y: | 
				
			||||
            return monitor->screenY; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    _glfwSetError(GLFW_INVALID_ENUM, | 
				
			||||
                  "glfwGetMonitorParam: Invalid enum value for 'param' parameter"); | 
				
			||||
    return 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//========================================================================
 | 
				
			||||
// Get monitor string
 | 
				
			||||
//========================================================================
 | 
				
			||||
 | 
				
			||||
GLFWAPI const char* glfwGetMonitorString(GLFWmonitor handle, int param) | 
				
			||||
{ | 
				
			||||
    _GLFWmonitor* monitor = (_GLFWmonitor*) handle; | 
				
			||||
 | 
				
			||||
    if (!_glfwInitialized) | 
				
			||||
    { | 
				
			||||
        _glfwSetError(GLFW_NOT_INITIALIZED, NULL); | 
				
			||||
        return NULL; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    if (monitor == NULL) | 
				
			||||
    { | 
				
			||||
        _glfwSetError(GLFW_INVALID_VALUE, | 
				
			||||
                      "glfwGetMonitorString: Invalid monitor handle"); | 
				
			||||
        return NULL; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    switch (param) | 
				
			||||
    { | 
				
			||||
        case GLFW_MONITOR_NAME: | 
				
			||||
            return monitor->name; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    _glfwSetError(GLFW_INVALID_ENUM, | 
				
			||||
                  "glfwGetMonitorString: Invalid enum value for 'param' parameter"); | 
				
			||||
    return NULL; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
//========================================================================
 | 
				
			||||
// Set a callback function for monitor events
 | 
				
			||||
//========================================================================
 | 
				
			||||
 | 
				
			||||
GLFWAPI void glfwSetMonitorDeviceCallback(GLFWmonitordevicefun cbfun) | 
				
			||||
{ | 
				
			||||
    if (!_glfwInitialized) | 
				
			||||
    { | 
				
			||||
        _glfwSetError(GLFW_NOT_INITIALIZED, NULL); | 
				
			||||
        return; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    _glfwLibrary.monitorCallback= cbfun; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
@ -0,0 +1,231 @@ | 
				
			||||
//========================================================================
 | 
				
			||||
// 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 <elmindreda@elmindreda.org>
 | 
				
			||||
//
 | 
				
			||||
// 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 <stdlib.h> | 
				
			||||
#include <string.h> | 
				
			||||
 | 
				
			||||
// The MinGW package for Debian lacks this
 | 
				
			||||
#ifndef EDS_ROTATEDMODE | 
				
			||||
#define EDS_ROTATEDMODE 0x00000004 | 
				
			||||
#endif | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//////////////////////////////////////////////////////////////////////////
 | 
				
			||||
//////                       GLFW platform API                      //////
 | 
				
			||||
//////////////////////////////////////////////////////////////////////////
 | 
				
			||||
 | 
				
			||||
_GLFWmonitor** _glfwCreateMonitor(_GLFWmonitor** current, | 
				
			||||
                                  DISPLAY_DEVICE* adapter, | 
				
			||||
                                  DISPLAY_DEVICE* monitor, | 
				
			||||
                                  DEVMODE* setting) | 
				
			||||
{ | 
				
			||||
    HDC dc = NULL; | 
				
			||||
 | 
				
			||||
    *current = _glfwMalloc(sizeof(_GLFWmonitor)); | 
				
			||||
    memset(*current, 0, sizeof(_GLFWmonitor)); | 
				
			||||
 | 
				
			||||
    dc = CreateDC("DISPLAY", monitor->DeviceString, NULL, NULL); | 
				
			||||
 | 
				
			||||
    (*current)->physicalWidth  = GetDeviceCaps(dc, HORZSIZE); | 
				
			||||
    (*current)->physicalHeight = GetDeviceCaps(dc, VERTSIZE); | 
				
			||||
 | 
				
			||||
    DeleteDC(dc); | 
				
			||||
 | 
				
			||||
    (*current)->name = _glfwMalloc(strlen(monitor->DeviceName) + 1); | 
				
			||||
    memcpy((*current)->name, monitor->DeviceName, strlen(monitor->DeviceName) + 1); | 
				
			||||
    (*current)->name[strlen(monitor->DeviceName)] = '\0'; | 
				
			||||
 | 
				
			||||
    (*current)->screenX = setting->dmPosition.x; | 
				
			||||
    (*current)->screenY = setting->dmPosition.y; | 
				
			||||
 | 
				
			||||
    memcpy((*current)->Win32.name, adapter->DeviceName, 32); | 
				
			||||
    return &((*current)->next); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
_GLFWmonitor* _glfwDestroyMonitor(_GLFWmonitor* monitor) | 
				
			||||
{ | 
				
			||||
    _GLFWmonitor* result; | 
				
			||||
 | 
				
			||||
    result = monitor->next; | 
				
			||||
 | 
				
			||||
    _glfwFree(monitor->name); | 
				
			||||
    _glfwFree(monitor); | 
				
			||||
 | 
				
			||||
    return result; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// todo: This is ugly. The platform should only allocate a list of the current devices.
 | 
				
			||||
// The platform independent code should be in charge of the handling for the initial
 | 
				
			||||
// setup, refreshing and freeing the list.
 | 
				
			||||
void _glfwInitMonitors(void) | 
				
			||||
{ | 
				
			||||
    _GLFWmonitor** curMonitor; | 
				
			||||
 | 
				
			||||
    DISPLAY_DEVICE adapter; | 
				
			||||
    DWORD adapterNum; | 
				
			||||
 | 
				
			||||
    DISPLAY_DEVICE monitor; | 
				
			||||
 | 
				
			||||
    DEVMODE setting; | 
				
			||||
    DWORD settingNum; | 
				
			||||
 | 
				
			||||
    curMonitor = &_glfwLibrary.monitorListHead; | 
				
			||||
 | 
				
			||||
    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 || !(adapter.StateFlags & DISPLAY_DEVICE_ACTIVE)) | 
				
			||||
            continue; | 
				
			||||
 | 
				
			||||
        EnumDisplaySettingsEx(adapter.DeviceName, | 
				
			||||
                              ENUM_CURRENT_SETTINGS, | 
				
			||||
                              &setting, | 
				
			||||
                              EDS_ROTATEDMODE); | 
				
			||||
 | 
				
			||||
        EnumDisplayDevices(adapter.DeviceName, 0, &monitor, 0); | 
				
			||||
 | 
				
			||||
        curMonitor = _glfwCreateMonitor(curMonitor, &adapter, &monitor, &setting); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
void _glfwRefreshMonitors(void) | 
				
			||||
{ | 
				
			||||
    DISPLAY_DEVICE adapter; | 
				
			||||
    DWORD adapterNum = 0; | 
				
			||||
 | 
				
			||||
    DISPLAY_DEVICE monitor; | 
				
			||||
 | 
				
			||||
    DEVMODE setting; | 
				
			||||
 | 
				
			||||
    _GLFWmonitor* newMonitorList = NULL; | 
				
			||||
    _GLFWmonitor** curMonitor = &newMonitorList; | 
				
			||||
 | 
				
			||||
    _GLFWmonitor* curNewMonitor; | 
				
			||||
    _GLFWmonitor* curOldMonitor; | 
				
			||||
 | 
				
			||||
    while (EnumDisplayDevices(NULL, adapterNum++, &adapter, 0)) | 
				
			||||
    { | 
				
			||||
        if (adapter.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER || !(adapter.StateFlags & DISPLAY_DEVICE_ACTIVE)) | 
				
			||||
            continue; | 
				
			||||
 | 
				
			||||
        EnumDisplaySettingsEx(adapter.DeviceName, ENUM_CURRENT_SETTINGS, &setting, EDS_ROTATEDMODE); | 
				
			||||
 | 
				
			||||
        EnumDisplayDevices(adapter.DeviceName, 0, &monitor, 0); | 
				
			||||
 | 
				
			||||
        curMonitor = _glfwCreateMonitor(curMonitor, &adapter, &monitor, &setting); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    curNewMonitor = newMonitorList; | 
				
			||||
    curOldMonitor = _glfwLibrary.monitorListHead; | 
				
			||||
 | 
				
			||||
    while (_glfwLibrary.monitorCallback && (curNewMonitor || curOldMonitor)) | 
				
			||||
    { | 
				
			||||
        _GLFWmonitor* lookAheadOldMonitor; | 
				
			||||
        _GLFWmonitor* lookAheadNewMonitor; | 
				
			||||
 | 
				
			||||
        if (curOldMonitor && curNewMonitor && !strcmp(curOldMonitor->name, curOldMonitor->name)) | 
				
			||||
        { | 
				
			||||
            curNewMonitor = curNewMonitor->next; | 
				
			||||
            curOldMonitor = curOldMonitor->next; | 
				
			||||
            continue; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        if (curNewMonitor && !curOldMonitor) | 
				
			||||
        { | 
				
			||||
            _glfwLibrary.monitorCallback(curNewMonitor, GLFW_MONITOR_CONNECTED); | 
				
			||||
            curNewMonitor = curNewMonitor->next; | 
				
			||||
            continue; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        if (!curNewMonitor && curOldMonitor) | 
				
			||||
        { | 
				
			||||
            _glfwLibrary.monitorCallback(curOldMonitor, GLFW_MONITOR_DISCONNECTED); | 
				
			||||
            curOldMonitor = curOldMonitor->next; | 
				
			||||
            continue; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        lookAheadOldMonitor = curOldMonitor->next; | 
				
			||||
        lookAheadNewMonitor = curNewMonitor->next; | 
				
			||||
 | 
				
			||||
        while (lookAheadOldMonitor && !strcmp(curNewMonitor->name, lookAheadOldMonitor->name)) | 
				
			||||
            lookAheadOldMonitor = lookAheadOldMonitor->next; | 
				
			||||
 | 
				
			||||
        while (lookAheadNewMonitor && !strcmp(curOldMonitor->name, lookAheadNewMonitor->name)) | 
				
			||||
            lookAheadNewMonitor = lookAheadNewMonitor->next; | 
				
			||||
 | 
				
			||||
        if (!lookAheadOldMonitor) | 
				
			||||
        { | 
				
			||||
            // nothing found in the old monitor list, that matches the current new monitor.
 | 
				
			||||
            _glfwLibrary.monitorCallback(curNewMonitor, GLFW_MONITOR_CONNECTED); | 
				
			||||
            curNewMonitor = curNewMonitor->next; | 
				
			||||
        } | 
				
			||||
        else | 
				
			||||
        { | 
				
			||||
            while (strcmp(curOldMonitor->name, lookAheadOldMonitor->name)) | 
				
			||||
            { | 
				
			||||
                _glfwLibrary.monitorCallback(curOldMonitor, GLFW_MONITOR_DISCONNECTED); | 
				
			||||
                curOldMonitor = curOldMonitor->next; | 
				
			||||
            } | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        if (!lookAheadNewMonitor) | 
				
			||||
        { | 
				
			||||
            // nothing found in the new monitor list, that matches the current old monitor.
 | 
				
			||||
            _glfwLibrary.monitorCallback(curOldMonitor, GLFW_MONITOR_DISCONNECTED); | 
				
			||||
            curOldMonitor = curOldMonitor->next; | 
				
			||||
        } | 
				
			||||
        else | 
				
			||||
        { | 
				
			||||
            while (strcmp(curNewMonitor->name, lookAheadNewMonitor->name)) | 
				
			||||
            { | 
				
			||||
                _glfwLibrary.monitorCallback(curNewMonitor, GLFW_MONITOR_CONNECTED); | 
				
			||||
                curNewMonitor = curNewMonitor->next; | 
				
			||||
            } | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    _glfwTerminateMonitors(); | 
				
			||||
    _glfwLibrary.monitorListHead = newMonitorList; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
void _glfwTerminateMonitors(void) | 
				
			||||
{ | 
				
			||||
    while (_glfwLibrary.monitorListHead) | 
				
			||||
        _glfwLibrary.monitorListHead = _glfwDestroyMonitor(_glfwLibrary.monitorListHead); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
@ -0,0 +1,136 @@ | 
				
			||||
//========================================================================
 | 
				
			||||
// 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 <elmindreda@elmindreda.org>
 | 
				
			||||
//
 | 
				
			||||
// 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 <stdlib.h> | 
				
			||||
#include <string.h> | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//////////////////////////////////////////////////////////////////////////
 | 
				
			||||
//////                       GLFW platform API                      //////
 | 
				
			||||
//////////////////////////////////////////////////////////////////////////
 | 
				
			||||
 | 
				
			||||
#if defined (_GLFW_HAS_XRANDR) | 
				
			||||
_GLFWmonitor** _glfwCreateMonitor(_GLFWmonitor** current, | 
				
			||||
                                  XRROutputInfo* outputInfo, | 
				
			||||
                                  XRRCrtcInfo* crtcInfo) | 
				
			||||
{ | 
				
			||||
    *current = _glfwMalloc(sizeof(_GLFWmonitor)); | 
				
			||||
    memset(*current, 0, sizeof(_GLFWmonitor)); | 
				
			||||
 | 
				
			||||
    (*current)->physicalWidth  = outputInfo->mm_width; | 
				
			||||
    (*current)->physicalHeight = outputInfo->mm_height; | 
				
			||||
 | 
				
			||||
    (*current)->name = _glfwMalloc(strlen(outputInfo->name) + 1); | 
				
			||||
    memcpy((*current)->name, outputInfo->name, strlen(outputInfo->name) + 1); | 
				
			||||
    (*current)->name[strlen(outputInfo->name)] = '\0'; | 
				
			||||
 | 
				
			||||
    (*current)->screenX = crtcInfo->x; | 
				
			||||
    (*current)->screenY = crtcInfo->y; | 
				
			||||
 | 
				
			||||
    (*current)->X11.output = outputInfo; | 
				
			||||
    return &((*current)->next); | 
				
			||||
} | 
				
			||||
#endif /*_GLFW_HAS_XRANDR*/ | 
				
			||||
 | 
				
			||||
_GLFWmonitor* _glfwDestroyMonitor(_GLFWmonitor* monitor) | 
				
			||||
{ | 
				
			||||
    _GLFWmonitor* result; | 
				
			||||
 | 
				
			||||
    result = monitor->next; | 
				
			||||
 | 
				
			||||
#if defined (_GLFW_HAS_XRANDR) | 
				
			||||
    XRRFreeOutputInfo(monitor->X11.output); | 
				
			||||
#endif /*_GLFW_HAS_XRANDR*/ | 
				
			||||
 | 
				
			||||
    _glfwFree(monitor->name); | 
				
			||||
    _glfwFree(monitor); | 
				
			||||
 | 
				
			||||
    return result; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
void _glfwInitMonitors(void) | 
				
			||||
{ | 
				
			||||
    _glfwLibrary.monitorListHead = NULL; | 
				
			||||
 | 
				
			||||
    if (_glfwLibrary.X11.RandR.available) | 
				
			||||
    { | 
				
			||||
#if defined (_GLFW_HAS_XRANDR) | 
				
			||||
        XRRScreenResources* resources; | 
				
			||||
        int outputIDX; | 
				
			||||
        _GLFWmonitor** curMonitor; | 
				
			||||
 | 
				
			||||
        curMonitor = &_glfwLibrary.monitorListHead; | 
				
			||||
 | 
				
			||||
        resources = XRRGetScreenResources(_glfwLibrary.X11.display, | 
				
			||||
                                          _glfwLibrary.X11.root); | 
				
			||||
 | 
				
			||||
        for (outputIDX = 0; outputIDX < resources->noutput; outputIDX++) | 
				
			||||
        { | 
				
			||||
            // physical device
 | 
				
			||||
            XRROutputInfo* outputInfo = NULL; | 
				
			||||
            // logical surface
 | 
				
			||||
            XRRCrtcInfo* crtcInfo = NULL; | 
				
			||||
            int crtcIDX; | 
				
			||||
 | 
				
			||||
            outputInfo = XRRGetOutputInfo(_glfwLibrary.X11.display, | 
				
			||||
                                          resources, | 
				
			||||
                                          resources->outputs[outputIDX]); | 
				
			||||
 | 
				
			||||
            if (outputInfo->connection == RR_Connected) | 
				
			||||
            { | 
				
			||||
                for (crtcIDX = 0; crtcIDX < outputInfo->ncrtc; crtcIDX++) | 
				
			||||
                { | 
				
			||||
                    if (outputInfo->crtc == outputInfo->crtcs[crtcIDX]) | 
				
			||||
                    { | 
				
			||||
                        crtcInfo = XRRGetCrtcInfo(_glfwLibrary.X11.display, | 
				
			||||
                                                  resources, | 
				
			||||
                                                  outputInfo->crtcs[crtcIDX]); | 
				
			||||
                        break; | 
				
			||||
                    } | 
				
			||||
                } | 
				
			||||
 | 
				
			||||
                curMonitor = _glfwCreateMonitor(curMonitor, outputInfo, crtcInfo); | 
				
			||||
 | 
				
			||||
                // Freeing of the outputInfo is done in _glfwDestroyMonitor
 | 
				
			||||
                XRRFreeCrtcInfo(crtcInfo); | 
				
			||||
            } | 
				
			||||
        } | 
				
			||||
#endif /*_GLFW_HAS_XRANDR*/ | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
void _glfwTerminateMonitors(void) | 
				
			||||
{ | 
				
			||||
    while (_glfwLibrary.monitorListHead) | 
				
			||||
        _glfwLibrary.monitorListHead = _glfwDestroyMonitor(_glfwLibrary.monitorListHead); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
					Loading…
					
					
				
		Reference in New Issue