Index: base/sys_info_posix.cc |
=================================================================== |
--- base/sys_info_posix.cc (revision 26002) |
+++ base/sys_info_posix.cc (working copy) |
@@ -13,6 +13,7 @@ |
#include <unistd.h> |
#if defined(OS_MACOSX) |
+#include <ApplicationServices/ApplicationServices.h> |
#include <mach/mach_host.h> |
#include <mach/mach_init.h> |
#endif |
@@ -142,13 +143,59 @@ |
// static |
void SysInfo::GetPrimaryDisplayDimensions(int* width, int* height) { |
+#if defined(OS_MACOSX) |
+ CGDirectDisplayID main_display = CGMainDisplayID(); |
+ if (width) |
+ *width = CGDisplayPixelsWide(main_display); |
+ if (height) |
+ *height = CGDisplayPixelsHigh(main_display); |
+#else |
+ // TODO(port): http://crbug.com/21732 |
NOTIMPLEMENTED(); |
+ if (width) |
+ *width = 0; |
+ if (height) |
+ *height = 0; |
+#endif |
} |
// static |
int SysInfo::DisplayCount() { |
+#if defined(OS_MACOSX) |
+ // Don't just return the number of online displays. It includes displays |
+ // that mirror other displays, which are not desired in the count. It's |
+ // tempting to use the count returned by CGGetActiveDisplayList, but active |
+ // displays exclude sleeping displays, and those are desired in the count. |
+ |
+ // It would be ridiculous to have this many displays connected, but |
+ // CGDirectDisplayID is just an integer, so supporting up to this many |
+ // doesn't hurt. |
+ CGDirectDisplayID online_displays[128]; |
+ CGDisplayCount online_display_count = 0; |
+ if (CGGetOnlineDisplayList(arraysize(online_displays), |
+ online_displays, |
+ &online_display_count) != kCGErrorSuccess) { |
+ // 1 is a reasonable assumption. |
+ return 1; |
+ } |
+ |
+ int display_count = 0; |
+ for (CGDisplayCount online_display_index = 0; |
+ online_display_index < online_display_count; |
+ ++online_display_index) { |
+ CGDirectDisplayID online_display = online_displays[online_display_index]; |
+ if (CGDisplayMirrorsDisplay(online_display) == kCGNullDirectDisplay) { |
+ // If this display doesn't mirror any other, include it in the count. |
+ ++display_count; |
+ } |
+ } |
+ |
+ return display_count; |
+#else |
+ // TODO(port): http://crbug.com/21732 |
NOTIMPLEMENTED(); |
return 1; |
+#endif |
} |
// static |