1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-21 06:55:39 +00:00

* nsfns.m (ns_get_name_from_ioreg): New function.

(ns_screen_name): Don't use deprecated CGDisplayIOServicePort on
OSX >= 10.9.  Use ns_get_name_from_ioreg.
This commit is contained in:
Jan Djärv 2013-11-05 08:51:55 +01:00
parent a67c4ae059
commit ceb486d497
2 changed files with 77 additions and 13 deletions

View File

@ -1,3 +1,9 @@
2013-11-05 Jan Djärv <jan.h.d@swipnet.se>
* nsfns.m (ns_get_name_from_ioreg): New function.
(ns_screen_name): Don't use deprecated CGDisplayIOServicePort on
OSX >= 10.9. Use ns_get_name_from_ioreg.
2013-11-05 Paul Eggert <eggert@cs.ucla.edu>
Simplify and port recent bool vector changes.

View File

@ -2358,7 +2358,35 @@ and GNUstep implementations ("distributor-specific release
}
#ifdef NS_IMPL_COCOA
/* Returns the name for the screen that DICT came from, or NULL.
/* Returns the name for the screen that OBJ represents, or NULL.
Caller must free return value.
*/
static char *
ns_get_name_from_ioreg (io_object_t obj)
{
char *name = NULL;
NSDictionary *info = (NSDictionary *)
IODisplayCreateInfoDictionary (obj, kIODisplayOnlyPreferredName);
NSDictionary *names = [info objectForKey:
[NSString stringWithUTF8String:
kDisplayProductName]];
if ([names count] > 0)
{
NSString *n = [names objectForKey: [[names allKeys]
objectAtIndex:0]];
if (n != nil) name = xstrdup ([n UTF8String]);
}
[info release];
return name;
}
/* Returns the name for the screen that DID came from, or NULL.
Caller must free return value.
*/
@ -2366,20 +2394,50 @@ and GNUstep implementations ("distributor-specific release
ns_screen_name (CGDirectDisplayID did)
{
char *name = NULL;
NSDictionary *info = (NSDictionary *)
IODisplayCreateInfoDictionary (CGDisplayIOServicePort (did),
kIODisplayOnlyPreferredName);
NSDictionary *names
= [info objectForKey:
[NSString stringWithUTF8String:kDisplayProductName]];
if ([names count] > 0) {
NSString *n = [names objectForKey: [[names allKeys] objectAtIndex:0]];
if (n != nil)
name = xstrdup ([n UTF8String]);
}
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9
mach_port_t masterPort;
io_iterator_t it;
io_object_t obj;
[info release];
// CGDisplayIOServicePort is deprecated. Do it another (harder) way.
if (IOMasterPort (MACH_PORT_NULL, &masterPort) != kIOReturnSuccess
|| IOServiceGetMatchingServices (masterPort,
IOServiceMatching ("IONDRVDevice"),
&it) != kIOReturnSuccess)
return name;
/* Must loop until we find a name. Many devices can have the same unit
number (represents different GPU parts), but only one has a name. */
while (! name && (obj = IOIteratorNext (it)))
{
CFMutableDictionaryRef props;
const void *val;
if (IORegistryEntryCreateCFProperties (obj,
&props,
kCFAllocatorDefault,
kNilOptions) == kIOReturnSuccess
&& props != nil
&& (val = CFDictionaryGetValue(props, @"IOFBDependentIndex")))
{
unsigned nr = [(NSNumber *)val unsignedIntegerValue];
if (nr == CGDisplayUnitNumber (did))
name = ns_get_name_from_ioreg (obj);
}
CFRelease (props);
IOObjectRelease (obj);
}
IOObjectRelease (it);
#else
name = ns_get_name_from_ioreg (CGDisplayIOServicePort (did));
#endif
return name;
}
#endif