emacs-diffs
[Top][All Lists]
Advanced

[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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]