Reverted 43095307da
.
The proposed fix broke for multiple displays of the same model.
This commit is contained in:
parent
7ebd10a868
commit
aaac715060
@ -36,72 +36,37 @@
|
|||||||
#include <CoreVideo/CVDisplayLink.h>
|
#include <CoreVideo/CVDisplayLink.h>
|
||||||
|
|
||||||
|
|
||||||
// Returns the name of the specified display
|
// Get the name of the specified display
|
||||||
//
|
//
|
||||||
static char* getDisplayName(CGDirectDisplayID displayID)
|
static char* getDisplayName(CGDirectDisplayID displayID)
|
||||||
{
|
{
|
||||||
io_iterator_t iter;
|
char* name;
|
||||||
io_service_t service;
|
|
||||||
char* result = NULL;
|
|
||||||
|
|
||||||
const uint32_t modelNumber = CGDisplayModelNumber(displayID);
|
|
||||||
const uint32_t vendorNumber = CGDisplayVendorNumber(displayID);
|
|
||||||
|
|
||||||
if (modelNumber == kDisplayProductIDGeneric || modelNumber == 0xffffffff ||
|
|
||||||
vendorNumber == kDisplayVendorIDUnknown || vendorNumber == 0xffffffff)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFMutableDictionaryRef matching = IOServiceMatching("IODisplayConnect");
|
|
||||||
|
|
||||||
if (IOServiceGetMatchingServices(kIOMasterPortDefault, matching, &iter) != 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
while ((service = IOIteratorNext(iter)) != 0)
|
|
||||||
{
|
|
||||||
CFIndex size, vendorID, productID;
|
|
||||||
CFDictionaryRef info, names;
|
CFDictionaryRef info, names;
|
||||||
CFStringRef name;
|
CFStringRef value;
|
||||||
|
CFIndex size;
|
||||||
info = IODisplayCreateInfoDictionary(service, kIODisplayOnlyPreferredName);
|
|
||||||
|
|
||||||
CFNumberGetValue(CFDictionaryGetValue(info, CFSTR(kDisplayVendorID)),
|
|
||||||
kCFNumberCFIndexType, &vendorID);
|
|
||||||
CFNumberGetValue(CFDictionaryGetValue(info, CFSTR(kDisplayProductID)),
|
|
||||||
kCFNumberCFIndexType, &productID);
|
|
||||||
|
|
||||||
if (vendorNumber != vendorID || modelNumber != productID)
|
|
||||||
{
|
|
||||||
CFRelease(info);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
info = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID),
|
||||||
|
kIODisplayOnlyPreferredName);
|
||||||
names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName));
|
names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName));
|
||||||
if (!names)
|
|
||||||
|
if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"),
|
||||||
|
(const void**) &value))
|
||||||
{
|
{
|
||||||
// This may happen if a desktop Mac is running headless
|
// This may happen if a desktop Mac is running headless
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR, "Failed to retrieve display name");
|
||||||
|
|
||||||
CFRelease(info);
|
CFRelease(info);
|
||||||
continue;
|
return strdup("Unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CFDictionaryGetValueIfPresent(names, CFSTR("en_US"),
|
size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value),
|
||||||
(const void**) &name))
|
|
||||||
{
|
|
||||||
CFRelease(info);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(name),
|
|
||||||
kCFStringEncodingUTF8);
|
kCFStringEncodingUTF8);
|
||||||
result = calloc(size + 1, sizeof(char));
|
name = calloc(size + 1, sizeof(char));
|
||||||
CFStringGetCString(name, result, size, kCFStringEncodingUTF8);
|
CFStringGetCString(value, name, size, kCFStringEncodingUTF8);
|
||||||
|
|
||||||
CFRelease(info);
|
CFRelease(info);
|
||||||
}
|
|
||||||
|
|
||||||
IOObjectRelease(iter);
|
return name;
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check whether the display mode should be included in enumeration
|
// Check whether the display mode should be included in enumeration
|
||||||
@ -298,13 +263,6 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count)
|
|||||||
const CGSize size = CGDisplayScreenSize(displays[i]);
|
const CGSize size = CGDisplayScreenSize(displays[i]);
|
||||||
char* name = getDisplayName(displays[i]);
|
char* name = getDisplayName(displays[i]);
|
||||||
|
|
||||||
if (!name)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"Cocoa: Failed to retrieve display name");
|
|
||||||
name = strdup("Unknown");
|
|
||||||
}
|
|
||||||
|
|
||||||
monitors[found] = _glfwAllocMonitor(name, size.width, size.height);
|
monitors[found] = _glfwAllocMonitor(name, size.width, size.height);
|
||||||
monitors[found]->ns.displayID = displays[i];
|
monitors[found]->ns.displayID = displays[i];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user