| Index: ui/gfx/screen_mac.mm
|
| diff --git a/ui/gfx/screen_mac.mm b/ui/gfx/screen_mac.mm
|
| index f63bd306cd8bb19273def02b0ebbfe24ddf97b53..51c0b665b7e34274b98cf4c2d3386898af8c98f3 100644
|
| --- a/ui/gfx/screen_mac.mm
|
| +++ b/ui/gfx/screen_mac.mm
|
| @@ -7,6 +7,8 @@
|
| #import <ApplicationServices/ApplicationServices.h>
|
| #import <Cocoa/Cocoa.h>
|
|
|
| +#include <map>
|
| +
|
| #include "base/logging.h"
|
| #include "base/mac/sdk_forward_declarations.h"
|
| #include "ui/gfx/display.h"
|
| @@ -97,10 +99,15 @@ class ScreenMac : public gfx::Screen {
|
| }
|
|
|
| virtual int GetNumDisplays() const OVERRIDE {
|
| - // 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
|
| + return GetAllDisplays().size();
|
| +
|
| + }
|
| +
|
| + virtual std::vector<gfx::Display> GetAllDisplays() const OVERRIDE {
|
| + // Don't just return all online displays. This would include displays
|
| + // that mirror other displays, which are not desired in this list. It's
|
| // tempting to use the count returned by CGGetActiveDisplayList, but active
|
| - // displays exclude sleeping displays, and those are desired in the count.
|
| + // displays exclude sleeping displays, and those are desired.
|
|
|
| // It would be ridiculous to have this many displays connected, but
|
| // CGDirectDisplayID is just an integer, so supporting up to this many
|
| @@ -110,29 +117,39 @@ class ScreenMac : public gfx::Screen {
|
| if (CGGetOnlineDisplayList(arraysize(online_displays),
|
| online_displays,
|
| &online_display_count) != kCGErrorSuccess) {
|
| - // 1 is a reasonable assumption.
|
| - return 1;
|
| + return std::vector<gfx::Display>(1, GetPrimaryDisplay());
|
| }
|
|
|
| - int display_count = 0;
|
| + typedef std::map<int64, NSScreen*> ScreenIdsToScreensMap;
|
| + ScreenIdsToScreensMap screen_ids_to_screens;
|
| + for (NSScreen* screen in [NSScreen screens]) {
|
| + NSDictionary* screen_device_description = [screen deviceDescription];
|
| + int64 screen_id = [[screen_device_description
|
| + objectForKey:@"NSScreenNumber"] unsignedIntValue];
|
| + screen_ids_to_screens[screen_id] = screen;
|
| + }
|
| +
|
| + std::vector<gfx::Display> displays;
|
| 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.
|
| + // If this display doesn't mirror any other, include it in the list.
|
| // The primary display in a mirrored set will be counted, but those that
|
| // mirror it will not be.
|
| - ++display_count;
|
| + ScreenIdsToScreensMap::iterator foundScreen =
|
| + screen_ids_to_screens.find(online_display);
|
| + if (foundScreen != screen_ids_to_screens.end()) {
|
| + displays.push_back(GetDisplayForScreen(foundScreen->second));
|
| + }
|
| }
|
| }
|
|
|
| - return display_count;
|
| - }
|
| + if (!displays.size())
|
| + return std::vector<gfx::Display>(1, GetPrimaryDisplay());
|
|
|
| - virtual std::vector<gfx::Display> GetAllDisplays() const OVERRIDE {
|
| - NOTIMPLEMENTED();
|
| - return std::vector<gfx::Display>(1, GetPrimaryDisplay());
|
| + return displays;
|
| }
|
|
|
| virtual gfx::Display GetDisplayNearestWindow(
|
|
|