[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] trunk r114962: * nsfns.m (ns_get_name_from_ioreg): New fun
From: |
Jan D. |
Subject: |
[Emacs-diffs] trunk r114962: * nsfns.m (ns_get_name_from_ioreg): New function. |
Date: |
Tue, 05 Nov 2013 07:52:12 +0000 |
User-agent: |
Bazaar (2.6b2) |
------------------------------------------------------------
revno: 114962
revision-id: address@hidden
parent: address@hidden
committer: Jan Djärv <address@hidden>
branch nick: trunk
timestamp: Tue 2013-11-05 08:51:55 +0100
message:
* 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.
modified:
src/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-1438
src/nsfns.m nsfns.m-20091113204419-o5vbwnq5f7feedwu-8741
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog 2013-11-05 07:11:24 +0000
+++ b/src/ChangeLog 2013-11-05 07:51:55 +0000
@@ -1,3 +1,9 @@
+2013-11-05 Jan Djärv <address@hidden>
+
+ * 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 <address@hidden>
Simplify and port recent bool vector changes.
=== modified file 'src/nsfns.m'
--- a/src/nsfns.m 2013-11-04 17:57:17 +0000
+++ b/src/nsfns.m 2013-11-05 07:51:55 +0000
@@ -2358,28 +2358,86 @@
}
#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_screen_name (CGDirectDisplayID did)
+ns_get_name_from_ioreg (io_object_t obj)
{
char *name = NULL;
+
NSDictionary *info = (NSDictionary *)
- IODisplayCreateInfoDictionary (CGDisplayIOServicePort (did),
- kIODisplayOnlyPreferredName);
- NSDictionary *names
- = [info objectForKey:
- [NSString stringWithUTF8String:kDisplayProductName]];
+ 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]);
- }
+ 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.
+*/
+
+static char *
+ns_screen_name (CGDirectDisplayID did)
+{
+ char *name = NULL;
+
+#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;
+
+ // 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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] trunk r114962: * nsfns.m (ns_get_name_from_ioreg): New function.,
Jan D. <=