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:
parent
a67c4ae059
commit
ceb486d497
@ -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.
|
||||
|
84
src/nsfns.m
84
src/nsfns.m
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user