Index: base/sys_info_mac.cc |
diff --git a/base/sys_info_mac.cc b/base/sys_info_mac.cc |
index 54b73205f0920d52475310bc9e49e72d48082d76..7d3a17d80b6de09c1b3e108ba2b2819222c5132b 100644 |
--- a/base/sys_info_mac.cc |
+++ b/base/sys_info_mac.cc |
@@ -4,7 +4,10 @@ |
#include "base/sys_info.h" |
+#include <ApplicationServices/ApplicationServices.h> |
#include <CoreServices/CoreServices.h> |
+#include <mach/mach_host.h> |
+#include <mach/mach_init.h> |
namespace base { |
@@ -20,4 +23,65 @@ void SysInfo::OperatingSystemVersionNumbers(int32 *major_version, |
reinterpret_cast<SInt32*>(bugfix_version)); |
} |
+// static |
+int64 SysInfo::AmountOfPhysicalMemory() { |
+ struct host_basic_info hostinfo; |
+ mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT; |
+ int result = host_info(mach_host_self(), |
+ HOST_BASIC_INFO, |
+ reinterpret_cast<host_info_t>(&hostinfo), |
+ &count); |
+ DCHECK_EQ(HOST_BASIC_INFO_COUNT, count); |
+ if (result != KERN_SUCCESS) { |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ |
+ return static_cast<int64>(hostinfo.max_mem); |
+} |
+ |
+// static |
+void SysInfo::GetPrimaryDisplayDimensions(int* width, int* height) { |
+ CGDirectDisplayID main_display = CGMainDisplayID(); |
+ if (width) |
+ *width = CGDisplayPixelsWide(main_display); |
+ if (height) |
+ *height = CGDisplayPixelsHigh(main_display); |
+} |
+ |
+// static |
+int SysInfo::DisplayCount() { |
+ // 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. |
+ // The primary display in a mirrored set will be counted, but those that |
+ // mirror it will not be. |
+ ++display_count; |
+ } |
+ } |
+ |
+ return display_count; |
+} |
+ |
} // namespace base |