| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/gfx/screen.h" | 5 #include "ui/gfx/screen.h" |
| 6 | 6 |
| 7 #import <ApplicationServices/ApplicationServices.h> | 7 #import <ApplicationServices/ApplicationServices.h> |
| 8 #import <Cocoa/Cocoa.h> | 8 #import <Cocoa/Cocoa.h> |
| 9 | 9 |
| 10 #include <map> |
| 11 |
| 10 #include "base/logging.h" | 12 #include "base/logging.h" |
| 11 #include "base/mac/sdk_forward_declarations.h" | 13 #include "base/mac/sdk_forward_declarations.h" |
| 12 #include "ui/gfx/display.h" | 14 #include "ui/gfx/display.h" |
| 13 | 15 |
| 14 namespace { | 16 namespace { |
| 15 | 17 |
| 16 gfx::Rect ConvertCoordinateSystem(NSRect ns_rect) { | 18 gfx::Rect ConvertCoordinateSystem(NSRect ns_rect) { |
| 17 // Primary monitor is defined as the monitor with the menubar, | 19 // Primary monitor is defined as the monitor with the menubar, |
| 18 // which is always at index 0. | 20 // which is always at index 0. |
| 19 NSScreen* primary_screen = [[NSScreen screens] objectAtIndex:0]; | 21 NSScreen* primary_screen = [[NSScreen screens] objectAtIndex:0]; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 return gfx::NativeWindow(); | 92 return gfx::NativeWindow(); |
| 91 } | 93 } |
| 92 | 94 |
| 93 virtual gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) | 95 virtual gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) |
| 94 OVERRIDE { | 96 OVERRIDE { |
| 95 NOTIMPLEMENTED(); | 97 NOTIMPLEMENTED(); |
| 96 return gfx::NativeWindow(); | 98 return gfx::NativeWindow(); |
| 97 } | 99 } |
| 98 | 100 |
| 99 virtual int GetNumDisplays() const OVERRIDE { | 101 virtual int GetNumDisplays() const OVERRIDE { |
| 100 // Don't just return the number of online displays. It includes displays | 102 return GetAllDisplays().size(); |
| 101 // that mirror other displays, which are not desired in the count. It's | 103 |
| 104 } |
| 105 |
| 106 virtual std::vector<gfx::Display> GetAllDisplays() const OVERRIDE { |
| 107 // Don't just return all online displays. This would include displays |
| 108 // that mirror other displays, which are not desired in this list. It's |
| 102 // tempting to use the count returned by CGGetActiveDisplayList, but active | 109 // tempting to use the count returned by CGGetActiveDisplayList, but active |
| 103 // displays exclude sleeping displays, and those are desired in the count. | 110 // displays exclude sleeping displays, and those are desired. |
| 104 | 111 |
| 105 // It would be ridiculous to have this many displays connected, but | 112 // It would be ridiculous to have this many displays connected, but |
| 106 // CGDirectDisplayID is just an integer, so supporting up to this many | 113 // CGDirectDisplayID is just an integer, so supporting up to this many |
| 107 // doesn't hurt. | 114 // doesn't hurt. |
| 108 CGDirectDisplayID online_displays[128]; | 115 CGDirectDisplayID online_displays[128]; |
| 109 CGDisplayCount online_display_count = 0; | 116 CGDisplayCount online_display_count = 0; |
| 110 if (CGGetOnlineDisplayList(arraysize(online_displays), | 117 if (CGGetOnlineDisplayList(arraysize(online_displays), |
| 111 online_displays, | 118 online_displays, |
| 112 &online_display_count) != kCGErrorSuccess) { | 119 &online_display_count) != kCGErrorSuccess) { |
| 113 // 1 is a reasonable assumption. | 120 return std::vector<gfx::Display>(1, GetPrimaryDisplay()); |
| 114 return 1; | |
| 115 } | 121 } |
| 116 | 122 |
| 117 int display_count = 0; | 123 typedef std::map<int64, NSScreen*> ScreenIdsToScreensMap; |
| 124 ScreenIdsToScreensMap screen_ids_to_screens; |
| 125 for (NSScreen* screen in [NSScreen screens]) { |
| 126 NSDictionary* screen_device_description = [screen deviceDescription]; |
| 127 int64 screen_id = [[screen_device_description |
| 128 objectForKey:@"NSScreenNumber"] unsignedIntValue]; |
| 129 screen_ids_to_screens[screen_id] = screen; |
| 130 } |
| 131 |
| 132 std::vector<gfx::Display> displays; |
| 118 for (CGDisplayCount online_display_index = 0; | 133 for (CGDisplayCount online_display_index = 0; |
| 119 online_display_index < online_display_count; | 134 online_display_index < online_display_count; |
| 120 ++online_display_index) { | 135 ++online_display_index) { |
| 121 CGDirectDisplayID online_display = online_displays[online_display_index]; | 136 CGDirectDisplayID online_display = online_displays[online_display_index]; |
| 122 if (CGDisplayMirrorsDisplay(online_display) == kCGNullDirectDisplay) { | 137 if (CGDisplayMirrorsDisplay(online_display) == kCGNullDirectDisplay) { |
| 123 // If this display doesn't mirror any other, include it in the count. | 138 // If this display doesn't mirror any other, include it in the list. |
| 124 // The primary display in a mirrored set will be counted, but those that | 139 // The primary display in a mirrored set will be counted, but those that |
| 125 // mirror it will not be. | 140 // mirror it will not be. |
| 126 ++display_count; | 141 ScreenIdsToScreensMap::iterator foundScreen = |
| 142 screen_ids_to_screens.find(online_display); |
| 143 if (foundScreen != screen_ids_to_screens.end()) { |
| 144 displays.push_back(GetDisplayForScreen(foundScreen->second)); |
| 145 } |
| 127 } | 146 } |
| 128 } | 147 } |
| 129 | 148 |
| 130 return display_count; | 149 if (!displays.size()) |
| 131 } | 150 return std::vector<gfx::Display>(1, GetPrimaryDisplay()); |
| 132 | 151 |
| 133 virtual std::vector<gfx::Display> GetAllDisplays() const OVERRIDE { | 152 return displays; |
| 134 NOTIMPLEMENTED(); | |
| 135 return std::vector<gfx::Display>(1, GetPrimaryDisplay()); | |
| 136 } | 153 } |
| 137 | 154 |
| 138 virtual gfx::Display GetDisplayNearestWindow( | 155 virtual gfx::Display GetDisplayNearestWindow( |
| 139 gfx::NativeView view) const OVERRIDE { | 156 gfx::NativeView view) const OVERRIDE { |
| 140 NSWindow* window = [view window]; | 157 NSWindow* window = [view window]; |
| 141 if (!window) | 158 if (!window) |
| 142 return GetPrimaryDisplay(); | 159 return GetPrimaryDisplay(); |
| 143 NSScreen* match_screen = [window screen]; | 160 NSScreen* match_screen = [window screen]; |
| 144 if (!match_screen) | 161 if (!match_screen) |
| 145 return GetPrimaryDisplay(); | 162 return GetPrimaryDisplay(); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 | 207 |
| 191 } // namespace | 208 } // namespace |
| 192 | 209 |
| 193 namespace gfx { | 210 namespace gfx { |
| 194 | 211 |
| 195 Screen* CreateNativeScreen() { | 212 Screen* CreateNativeScreen() { |
| 196 return new ScreenMac; | 213 return new ScreenMac; |
| 197 } | 214 } |
| 198 | 215 |
| 199 } | 216 } |
| OLD | NEW |