diff options
author | mark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-14 03:24:49 +0000 |
---|---|---|
committer | mark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-14 03:24:49 +0000 |
commit | 60f1e8fe0973d60e3e786237a283395749550a40 (patch) | |
tree | e51aaef8894df0cb2cd842c441a4ff665ae49e29 /base | |
parent | 984acedb72898a8fea4c2b2bb93106321117f2af (diff) | |
download | chromium_src-60f1e8fe0973d60e3e786237a283395749550a40.zip chromium_src-60f1e8fe0973d60e3e786237a283395749550a40.tar.gz chromium_src-60f1e8fe0973d60e3e786237a283395749550a40.tar.bz2 |
Implement functions to return the primary display dimensions and the number
of displays connected.
BUG=21731
TEST=No more NOTIMPLEMENTED messages for these.
Metrics data should have the correct values in log.display.
Review URL: http://codereview.chromium.org/194098
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26092 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r-- | base/sys_info_posix.cc | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/base/sys_info_posix.cc b/base/sys_info_posix.cc index b6cc56a..06f7526 100644 --- a/base/sys_info_posix.cc +++ b/base/sys_info_posix.cc @@ -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,61 @@ std::string SysInfo::CPUArchitecture() { // 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. + // The primary display in a mirrored set will be counted, but those that + // mirror it will not be. + ++display_count; + } + } + + return display_count; +#else + // TODO(port): http://crbug.com/21732 NOTIMPLEMENTED(); return 1; +#endif } // static |