From 8746f68d613b8732c14aac22b81e14eb4a719250 Mon Sep 17 00:00:00 2001 From: Nevyn Bengtsson Date: Mon, 11 Jan 2021 17:27:27 +0100 Subject: [PATCH] Cocoa: Use modern API to get display name On Apple Silicon, IOKit is deprecated and there will be no matching io_service that we can query for name. Luckilly, NSScreen got an API to fetch the display name in 10.15. This is a blocker to get glfw running on Apple Silicon. Fixes #1809. Closes #1833. (cherry picked from commit 2bc52ca82e46f6f238007b8e80b7253328bd080d) --- src/cocoa_monitor.m | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/cocoa_monitor.m b/src/cocoa_monitor.m index 1007d062..5a701826 100644 --- a/src/cocoa_monitor.m +++ b/src/cocoa_monitor.m @@ -41,6 +41,22 @@ // static char* getDisplayName(CGDirectDisplayID displayID) { + // IOKit doesn't work on Apple Silicon anymore. Luckilly, 10.15 introduced -[NSScreen localizedName]. + // Use it if available, and fall back to IOKit otherwise. + if ([NSScreen instancesRespondToSelector:@selector(localizedName)]) + { + for(NSScreen *screen in [NSScreen screens]) + { + if ([[[screen deviceDescription] objectForKey:@"NSScreenNumber"] intValue] == displayID) + { + NSString *name = [screen valueForKey:@"localizedName"]; + if (name) + { + return _glfw_strdup([name UTF8String]); + } + } + } + } io_iterator_t it; io_service_t service; CFDictionaryRef info;