This commit is contained in:
Moritz Pflanzer 2015-11-10 01:00:15 +00:00
commit 95fc3193d4
3 changed files with 101 additions and 4 deletions

View File

@ -67,6 +67,7 @@ extern "C" {
* The available context API macros are: * The available context API macros are:
* * `GLFW_EXPOSE_NATIVE_WGL` * * `GLFW_EXPOSE_NATIVE_WGL`
* * `GLFW_EXPOSE_NATIVE_NSGL` * * `GLFW_EXPOSE_NATIVE_NSGL`
* * `GLFW_EXPOSE_NATIVE_CGL`
* * `GLFW_EXPOSE_NATIVE_GLX` * * `GLFW_EXPOSE_NATIVE_GLX`
* * `GLFW_EXPOSE_NATIVE_EGL` * * `GLFW_EXPOSE_NATIVE_EGL`
* *
@ -109,6 +110,8 @@ extern "C" {
/* WGL is declared by windows.h */ /* WGL is declared by windows.h */
#elif defined(GLFW_EXPOSE_NATIVE_NSGL) #elif defined(GLFW_EXPOSE_NATIVE_NSGL)
/* NSGL is declared by Cocoa.h */ /* NSGL is declared by Cocoa.h */
#elif defined(GLFW_EXPOSE_NATIVE_CGL)
#include <OpenGL/OpenGL.h>
#elif defined(GLFW_EXPOSE_NATIVE_GLX) #elif defined(GLFW_EXPOSE_NATIVE_GLX)
#include <GL/glx.h> #include <GL/glx.h>
#elif defined(GLFW_EXPOSE_NATIVE_EGL) #elif defined(GLFW_EXPOSE_NATIVE_EGL)
@ -237,6 +240,14 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); GLFWAPI id glfwGetNSGLContext(GLFWwindow* window);
#endif #endif
#if defined(GLFW_EXPOSE_NATIVE_CGL)
/*! @brief Returns the `CGLContextObj` of the specified window.
* @return The `CGLContextObj` of the specified window.
* @ingroup native
*/
GLFWAPI CGLContextObj glfwGetCGLContext(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_X11) #if defined(GLFW_EXPOSE_NATIVE_X11)
/*! @brief Returns the `Display` used by GLFW. /*! @brief Returns the `Display` used by GLFW.
* *

View File

@ -38,6 +38,79 @@
#include <ApplicationServices/ApplicationServices.h> #include <ApplicationServices/ApplicationServices.h>
// Returns the io_service_t corresponding to a CG display ID, or 0 on failure.
// The io_service_t should be released with IOObjectRelease when not needed.
//
static io_service_t IOServicePortFromCGDisplayID(CGDirectDisplayID displayID)
{
io_iterator_t iter;
io_service_t serv, servicePort = 0;
CFMutableDictionaryRef matching = IOServiceMatching("IODisplayConnect");
// releases matching for us
kern_return_t err = IOServiceGetMatchingServices(kIOMasterPortDefault,
matching,
&iter);
if (err)
return 0;
while((serv = IOIteratorNext(iter)) != 0)
{
CFDictionaryRef displayInfo;
CFNumberRef vendorIDRef;
CFNumberRef productIDRef;
CFNumberRef serialNumberRef;
NSNumber *vendorID;
NSNumber *productID;
NSNumber *serialNumber;
Boolean success;
displayInfo = IODisplayCreateInfoDictionary(serv, kIODisplayOnlyPreferredName);
success = CFDictionaryGetValueIfPresent(displayInfo, CFSTR(kDisplayVendorID), (const void**)&vendorIDRef);
success &= CFDictionaryGetValueIfPresent(displayInfo, CFSTR(kDisplayProductID), (const void**)&productIDRef);
if(!success)
{
CFRelease(displayInfo);
continue;
}
vendorID = (__bridge NSNumber*)vendorIDRef;
productID = (__bridge NSNumber*)productIDRef;
// If a serial number is found use it
// Otherwise serial number will be nil (= 0) which will match with the output of 'CGDisplaySerialNumber'
if(CFDictionaryGetValueIfPresent(displayInfo, CFSTR(kDisplaySerialNumber), (const void**)&serialNumberRef))
{
serialNumber = (__bridge NSNumber*)serialNumberRef;
}
// If the vendor and product id along with the serial don't match
// then we are not looking at the correct monitor.
// NOTE: The serial number is important in cases where two monitors
// are the exact same.
if(CGDisplayVendorNumber(displayID) != vendorID.unsignedIntValue ||
CGDisplayModelNumber(displayID) != productID.unsignedIntValue ||
CGDisplaySerialNumber(displayID) != serialNumber.unsignedIntValue)
{
CFRelease(displayInfo);
continue;
}
servicePort = serv;
CFRelease(displayInfo);
break;
}
IOObjectRelease(iter);
return servicePort;
}
// Get the name of the specified display // Get the name of the specified display
// //
static char* getDisplayName(CGDirectDisplayID displayID) static char* getDisplayName(CGDirectDisplayID displayID)
@ -47,10 +120,18 @@ static char* getDisplayName(CGDirectDisplayID displayID)
CFStringRef value; CFStringRef value;
CFIndex size; CFIndex size;
// NOTE: This uses a deprecated function because Apple has // Supports OS X 10.4 Tiger and Newer
// (as of January 2015) not provided any alternative io_service_t serv = IOServicePortFromCGDisplayID(displayID);
info = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID), if (serv == 0)
kIODisplayOnlyPreferredName); {
_glfwInputError(GLFW_PLATFORM_ERROR,
"Cocoa: IOServicePortFromCGDisplayID Returned an Invalid Port. (Port: 0)");
return strdup("Unknown");
}
info = IODisplayCreateInfoDictionary(serv, kIODisplayOnlyPreferredName);
IOObjectRelease(serv);
names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName)); names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName));
if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"), if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"),

View File

@ -303,3 +303,8 @@ GLFWAPI id glfwGetNSGLContext(GLFWwindow* handle)
return window->context.nsgl.object; return window->context.nsgl.object;
} }
GLFWAPI CGLContextObj glfwGetCGLContext(GLFWwindow* handle)
{
NSOpenGLContext* ctx = glfwGetNSGLContext(handle);
return [ctx CGLContextObj];
}