Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/sys_info.h"
      6 
      7 #include <ApplicationServices/ApplicationServices.h>
      8 #include <CoreServices/CoreServices.h>
      9 #include <mach/mach_host.h>
     10 #include <mach/mach_init.h>
     11 
     12 #include "base/logging.h"
     13 
     14 namespace base {
     15 
     16 // static
     17 void SysInfo::OperatingSystemVersionNumbers(int32* major_version,
     18                                             int32* minor_version,
     19                                             int32* bugfix_version) {
     20   Gestalt(gestaltSystemVersionMajor,
     21       reinterpret_cast<SInt32*>(major_version));
     22   Gestalt(gestaltSystemVersionMinor,
     23       reinterpret_cast<SInt32*>(minor_version));
     24   Gestalt(gestaltSystemVersionBugFix,
     25       reinterpret_cast<SInt32*>(bugfix_version));
     26 }
     27 
     28 // static
     29 int64 SysInfo::AmountOfPhysicalMemory() {
     30   struct host_basic_info hostinfo;
     31   mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT;
     32   int result = host_info(mach_host_self(),
     33                          HOST_BASIC_INFO,
     34                          reinterpret_cast<host_info_t>(&hostinfo),
     35                          &count);
     36   DCHECK_EQ(HOST_BASIC_INFO_COUNT, count);
     37   if (result != KERN_SUCCESS) {
     38     NOTREACHED();
     39     return 0;
     40   }
     41 
     42   return static_cast<int64>(hostinfo.max_mem);
     43 }
     44 
     45 // static
     46 void SysInfo::GetPrimaryDisplayDimensions(int* width, int* height) {
     47   CGDirectDisplayID main_display = CGMainDisplayID();
     48   if (width)
     49     *width = CGDisplayPixelsWide(main_display);
     50   if (height)
     51     *height = CGDisplayPixelsHigh(main_display);
     52 }
     53 
     54 // static
     55 int SysInfo::DisplayCount() {
     56   // Don't just return the number of online displays.  It includes displays
     57   // that mirror other displays, which are not desired in the count.  It's
     58   // tempting to use the count returned by CGGetActiveDisplayList, but active
     59   // displays exclude sleeping displays, and those are desired in the count.
     60 
     61   // It would be ridiculous to have this many displays connected, but
     62   // CGDirectDisplayID is just an integer, so supporting up to this many
     63   // doesn't hurt.
     64   CGDirectDisplayID online_displays[128];
     65   CGDisplayCount online_display_count = 0;
     66   if (CGGetOnlineDisplayList(arraysize(online_displays),
     67                              online_displays,
     68                              &online_display_count) != kCGErrorSuccess) {
     69     // 1 is a reasonable assumption.
     70     return 1;
     71   }
     72 
     73   int display_count = 0;
     74   for (CGDisplayCount online_display_index = 0;
     75        online_display_index < online_display_count;
     76        ++online_display_index) {
     77     CGDirectDisplayID online_display = online_displays[online_display_index];
     78     if (CGDisplayMirrorsDisplay(online_display) == kCGNullDirectDisplay) {
     79       // If this display doesn't mirror any other, include it in the count.
     80       // The primary display in a mirrored set will be counted, but those that
     81       // mirror it will not be.
     82       ++display_count;
     83     }
     84   }
     85 
     86   return display_count;
     87 }
     88 
     89 }  // namespace base
     90