| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "ash/display/display_change_observer_chromeos.h" | 5 #include "ash/display/display_change_observer_chromeos.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 if (display::Display::HasInternalDisplay()) | 68 if (display::Display::HasInternalDisplay()) |
| 69 DCHECK_EQ(display::Display::InternalDisplayId(), state->display_id()); | 69 DCHECK_EQ(display::Display::InternalDisplayId(), state->display_id()); |
| 70 display::Display::SetInternalDisplayId(state->display_id()); | 70 display::Display::SetInternalDisplayId(state->display_id()); |
| 71 } | 71 } |
| 72 } | 72 } |
| 73 } | 73 } |
| 74 | 74 |
| 75 } // namespace | 75 } // namespace |
| 76 | 76 |
| 77 // static | 77 // static |
| 78 DisplayInfo::ManagedDisplayModeList | 78 display::ManagedDisplayInfo::ManagedDisplayModeList |
| 79 DisplayChangeObserver::GetInternalManagedDisplayModeList( | 79 DisplayChangeObserver::GetInternalManagedDisplayModeList( |
| 80 const DisplayInfo& display_info, | 80 const display::ManagedDisplayInfo& display_info, |
| 81 const ui::DisplaySnapshot& output) { | 81 const ui::DisplaySnapshot& output) { |
| 82 const ui::DisplayMode* ui_native_mode = output.native_mode(); | 82 const ui::DisplayMode* ui_native_mode = output.native_mode(); |
| 83 scoped_refptr<ManagedDisplayMode> native_mode = new ManagedDisplayMode( | 83 scoped_refptr<display::ManagedDisplayMode> native_mode = |
| 84 ui_native_mode->size(), ui_native_mode->refresh_rate(), | 84 new display::ManagedDisplayMode(ui_native_mode->size(), |
| 85 ui_native_mode->is_interlaced(), true, 1.0, | 85 ui_native_mode->refresh_rate(), |
| 86 display_info.device_scale_factor()); | 86 ui_native_mode->is_interlaced(), true, |
| 87 1.0, display_info.device_scale_factor()); |
| 87 | 88 |
| 88 return CreateInternalManagedDisplayModeList(native_mode); | 89 return CreateInternalManagedDisplayModeList(native_mode); |
| 89 } | 90 } |
| 90 | 91 |
| 91 // static | 92 // static |
| 92 DisplayInfo::ManagedDisplayModeList | 93 display::ManagedDisplayInfo::ManagedDisplayModeList |
| 93 DisplayChangeObserver::GetExternalManagedDisplayModeList( | 94 DisplayChangeObserver::GetExternalManagedDisplayModeList( |
| 94 const ui::DisplaySnapshot& output) { | 95 const ui::DisplaySnapshot& output) { |
| 95 using DisplayModeMap = | 96 using DisplayModeMap = |
| 96 std::map<std::pair<int, int>, scoped_refptr<ManagedDisplayMode>>; | 97 std::map<std::pair<int, int>, scoped_refptr<display::ManagedDisplayMode>>; |
| 97 DisplayModeMap display_mode_map; | 98 DisplayModeMap display_mode_map; |
| 98 | 99 |
| 99 scoped_refptr<ManagedDisplayMode> native_mode = new ManagedDisplayMode(); | 100 scoped_refptr<display::ManagedDisplayMode> native_mode = |
| 101 new display::ManagedDisplayMode(); |
| 100 for (const auto& mode_info : output.modes()) { | 102 for (const auto& mode_info : output.modes()) { |
| 101 const std::pair<int, int> size(mode_info->size().width(), | 103 const std::pair<int, int> size(mode_info->size().width(), |
| 102 mode_info->size().height()); | 104 mode_info->size().height()); |
| 103 scoped_refptr<ManagedDisplayMode> display_mode = new ManagedDisplayMode( | 105 scoped_refptr<display::ManagedDisplayMode> display_mode = |
| 104 mode_info->size(), mode_info->refresh_rate(), | 106 new display::ManagedDisplayMode( |
| 105 mode_info->is_interlaced(), output.native_mode() == mode_info.get(), | 107 mode_info->size(), mode_info->refresh_rate(), |
| 106 1.0, 1.0); | 108 mode_info->is_interlaced(), output.native_mode() == mode_info.get(), |
| 109 1.0, 1.0); |
| 107 if (display_mode->native()) | 110 if (display_mode->native()) |
| 108 native_mode = display_mode; | 111 native_mode = display_mode; |
| 109 | 112 |
| 110 // Add the display mode if it isn't already present and override interlaced | 113 // Add the display mode if it isn't already present and override interlaced |
| 111 // display modes with non-interlaced ones. | 114 // display modes with non-interlaced ones. |
| 112 DisplayModeMap::iterator display_mode_it = display_mode_map.find(size); | 115 DisplayModeMap::iterator display_mode_it = display_mode_map.find(size); |
| 113 if (display_mode_it == display_mode_map.end()) | 116 if (display_mode_it == display_mode_map.end()) |
| 114 display_mode_map.insert(std::make_pair(size, display_mode)); | 117 display_mode_map.insert(std::make_pair(size, display_mode)); |
| 115 else if (display_mode_it->second->is_interlaced() && | 118 else if (display_mode_it->second->is_interlaced() && |
| 116 !display_mode->is_interlaced()) | 119 !display_mode->is_interlaced()) |
| 117 display_mode_it->second = std::move(display_mode); | 120 display_mode_it->second = std::move(display_mode); |
| 118 } | 121 } |
| 119 | 122 |
| 120 DisplayInfo::ManagedDisplayModeList display_mode_list; | 123 display::ManagedDisplayInfo::ManagedDisplayModeList display_mode_list; |
| 121 for (const auto& display_mode_pair : display_mode_map) | 124 for (const auto& display_mode_pair : display_mode_map) |
| 122 display_mode_list.push_back(std::move(display_mode_pair.second)); | 125 display_mode_list.push_back(std::move(display_mode_pair.second)); |
| 123 | 126 |
| 124 if (output.native_mode()) { | 127 if (output.native_mode()) { |
| 125 const std::pair<int, int> size(native_mode->size().width(), | 128 const std::pair<int, int> size(native_mode->size().width(), |
| 126 native_mode->size().height()); | 129 native_mode->size().height()); |
| 127 DisplayModeMap::iterator it = display_mode_map.find(size); | 130 DisplayModeMap::iterator it = display_mode_map.find(size); |
| 128 DCHECK(it != display_mode_map.end()) | 131 DCHECK(it != display_mode_map.end()) |
| 129 << "Native mode must be part of the mode list."; | 132 << "Native mode must be part of the mode list."; |
| 130 | 133 |
| 131 // If the native mode was replaced re-add it. | 134 // If the native mode was replaced re-add it. |
| 132 if (!it->second->native()) | 135 if (!it->second->native()) |
| 133 display_mode_list.push_back(native_mode); | 136 display_mode_list.push_back(native_mode); |
| 134 } | 137 } |
| 135 | 138 |
| 136 if (native_mode->size().width() >= kMinimumWidthFor4K) { | 139 if (native_mode->size().width() >= kMinimumWidthFor4K) { |
| 137 for (size_t i = 0; i < arraysize(kAdditionalDeviceScaleFactorsFor4k); ++i) { | 140 for (size_t i = 0; i < arraysize(kAdditionalDeviceScaleFactorsFor4k); ++i) { |
| 138 scoped_refptr<ManagedDisplayMode> mode = new ManagedDisplayMode( | 141 scoped_refptr<display::ManagedDisplayMode> mode = |
| 139 native_mode->size(), native_mode->refresh_rate(), | 142 new display::ManagedDisplayMode( |
| 140 native_mode->is_interlaced(), false /* native */, | 143 native_mode->size(), native_mode->refresh_rate(), |
| 141 native_mode->ui_scale(), kAdditionalDeviceScaleFactorsFor4k[i]); | 144 native_mode->is_interlaced(), false /* native */, |
| 145 native_mode->ui_scale(), kAdditionalDeviceScaleFactorsFor4k[i]); |
| 142 display_mode_list.push_back(mode); | 146 display_mode_list.push_back(mode); |
| 143 } | 147 } |
| 144 } | 148 } |
| 145 | 149 |
| 146 return display_mode_list; | 150 return display_mode_list; |
| 147 } | 151 } |
| 148 | 152 |
| 149 DisplayChangeObserver::DisplayChangeObserver() { | 153 DisplayChangeObserver::DisplayChangeObserver() { |
| 150 WmShell::Get()->AddShellObserver(this); | 154 WmShell::Get()->AddShellObserver(this); |
| 151 ui::InputDeviceManager::GetInstance()->AddObserver(this); | 155 ui::InputDeviceManager::GetInstance()->AddObserver(this); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 170 const display::DisplayLayout& layout = Shell::GetInstance() | 174 const display::DisplayLayout& layout = Shell::GetInstance() |
| 171 ->display_manager() | 175 ->display_manager() |
| 172 ->layout_store() | 176 ->layout_store() |
| 173 ->GetRegisteredDisplayLayout(list); | 177 ->GetRegisteredDisplayLayout(list); |
| 174 return layout.mirrored ? ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR | 178 return layout.mirrored ? ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR |
| 175 : ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED; | 179 : ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED; |
| 176 } | 180 } |
| 177 | 181 |
| 178 bool DisplayChangeObserver::GetResolutionForDisplayId(int64_t display_id, | 182 bool DisplayChangeObserver::GetResolutionForDisplayId(int64_t display_id, |
| 179 gfx::Size* size) const { | 183 gfx::Size* size) const { |
| 180 scoped_refptr<ManagedDisplayMode> mode = | 184 scoped_refptr<display::ManagedDisplayMode> mode = |
| 181 Shell::GetInstance()->display_manager()->GetSelectedModeForDisplayId( | 185 Shell::GetInstance()->display_manager()->GetSelectedModeForDisplayId( |
| 182 display_id); | 186 display_id); |
| 183 if (!mode) | 187 if (!mode) |
| 184 return false; | 188 return false; |
| 185 *size = mode->size(); | 189 *size = mode->size(); |
| 186 return true; | 190 return true; |
| 187 } | 191 } |
| 188 | 192 |
| 189 void DisplayChangeObserver::OnDisplayModeChanged( | 193 void DisplayChangeObserver::OnDisplayModeChanged( |
| 190 const ui::DisplayConfigurator::DisplayStateList& display_states) { | 194 const ui::DisplayConfigurator::DisplayStateList& display_states) { |
| 191 UpdateInternalDisplayId(display_states); | 195 UpdateInternalDisplayId(display_states); |
| 192 | 196 |
| 193 std::vector<DisplayInfo> displays; | 197 std::vector<display::ManagedDisplayInfo> displays; |
| 194 std::set<int64_t> ids; | 198 std::set<int64_t> ids; |
| 195 for (const ui::DisplaySnapshot* state : display_states) { | 199 for (const ui::DisplaySnapshot* state : display_states) { |
| 196 const ui::DisplayMode* mode_info = state->current_mode(); | 200 const ui::DisplayMode* mode_info = state->current_mode(); |
| 197 if (!mode_info) | 201 if (!mode_info) |
| 198 continue; | 202 continue; |
| 199 | 203 |
| 200 float device_scale_factor = 1.0f; | 204 float device_scale_factor = 1.0f; |
| 201 // Sets dpi only if the screen size is not blacklisted. | 205 // Sets dpi only if the screen size is not blacklisted. |
| 202 float dpi = ui::IsDisplaySizeBlackListed(state->physical_size()) | 206 float dpi = ui::IsDisplaySizeBlackListed(state->physical_size()) |
| 203 ? 0 | 207 ? 0 |
| 204 : kInchInMm * mode_info->size().width() / | 208 : kInchInMm * mode_info->size().width() / |
| 205 state->physical_size().width(); | 209 state->physical_size().width(); |
| 206 if (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) { | 210 if (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) { |
| 207 if (dpi) | 211 if (dpi) |
| 208 device_scale_factor = FindDeviceScaleFactor(dpi); | 212 device_scale_factor = FindDeviceScaleFactor(dpi); |
| 209 } else { | 213 } else { |
| 210 scoped_refptr<ManagedDisplayMode> mode = | 214 scoped_refptr<display::ManagedDisplayMode> mode = |
| 211 Shell::GetInstance()->display_manager()->GetSelectedModeForDisplayId( | 215 Shell::GetInstance()->display_manager()->GetSelectedModeForDisplayId( |
| 212 state->display_id()); | 216 state->display_id()); |
| 213 if (mode) { | 217 if (mode) { |
| 214 device_scale_factor = mode->device_scale_factor(); | 218 device_scale_factor = mode->device_scale_factor(); |
| 215 } else { | 219 } else { |
| 216 // For monitors that are 40 inches and 4K or above, set | 220 // For monitors that are 40 inches and 4K or above, set |
| 217 // |device_scale_factor| to 2x. For margin purposes, 100 is subtracted | 221 // |device_scale_factor| to 2x. For margin purposes, 100 is subtracted |
| 218 // from the value of |k2xThreshouldSizeSquaredFor4KInMm| | 222 // from the value of |k2xThreshouldSizeSquaredFor4KInMm| |
| 219 const int k2xThreshouldSizeSquaredFor4KInMm = | 223 const int k2xThreshouldSizeSquaredFor4KInMm = |
| 220 (40 * 40 * kInchInMm * kInchInMm) - 100; | 224 (40 * 40 * kInchInMm * kInchInMm) - 100; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 242 name = state->display_name(); | 246 name = state->display_name(); |
| 243 } | 247 } |
| 244 | 248 |
| 245 if (name.empty()) | 249 if (name.empty()) |
| 246 name = l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME); | 250 name = l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME); |
| 247 | 251 |
| 248 bool has_overscan = state->has_overscan(); | 252 bool has_overscan = state->has_overscan(); |
| 249 int64_t id = state->display_id(); | 253 int64_t id = state->display_id(); |
| 250 ids.insert(id); | 254 ids.insert(id); |
| 251 | 255 |
| 252 displays.push_back(DisplayInfo(id, name, has_overscan)); | 256 displays.push_back(display::ManagedDisplayInfo(id, name, has_overscan)); |
| 253 DisplayInfo& new_info = displays.back(); | 257 display::ManagedDisplayInfo& new_info = displays.back(); |
| 254 new_info.set_sys_path(state->sys_path()); | 258 new_info.set_sys_path(state->sys_path()); |
| 255 new_info.set_device_scale_factor(device_scale_factor); | 259 new_info.set_device_scale_factor(device_scale_factor); |
| 256 new_info.SetBounds(display_bounds); | 260 new_info.SetBounds(display_bounds); |
| 257 new_info.set_native(true); | 261 new_info.set_native(true); |
| 258 new_info.set_is_aspect_preserving_scaling( | 262 new_info.set_is_aspect_preserving_scaling( |
| 259 state->is_aspect_preserving_scaling()); | 263 state->is_aspect_preserving_scaling()); |
| 260 if (dpi) | 264 if (dpi) |
| 261 new_info.set_device_dpi(dpi); | 265 new_info.set_device_dpi(dpi); |
| 262 | 266 |
| 263 DisplayInfo::ManagedDisplayModeList display_modes = | 267 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = |
| 264 (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) | 268 (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) |
| 265 ? GetInternalManagedDisplayModeList(new_info, *state) | 269 ? GetInternalManagedDisplayModeList(new_info, *state) |
| 266 : GetExternalManagedDisplayModeList(*state); | 270 : GetExternalManagedDisplayModeList(*state); |
| 267 new_info.SetManagedDisplayModes(display_modes); | 271 new_info.SetManagedDisplayModes(display_modes); |
| 268 | 272 |
| 269 new_info.set_available_color_profiles( | 273 new_info.set_available_color_profiles( |
| 270 Shell::GetInstance() | 274 Shell::GetInstance() |
| 271 ->display_configurator() | 275 ->display_configurator() |
| 272 ->GetAvailableColorCalibrationProfiles(id)); | 276 ->GetAvailableColorCalibrationProfiles(id)); |
| 273 new_info.set_maximum_cursor_size(state->maximum_cursor_size()); | 277 new_info.set_maximum_cursor_size(state->maximum_cursor_size()); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 } | 315 } |
| 312 return 1.0f; | 316 return 1.0f; |
| 313 } | 317 } |
| 314 | 318 |
| 315 void DisplayChangeObserver::OnTouchscreenDeviceConfigurationChanged() { | 319 void DisplayChangeObserver::OnTouchscreenDeviceConfigurationChanged() { |
| 316 OnDisplayModeChanged( | 320 OnDisplayModeChanged( |
| 317 Shell::GetInstance()->display_configurator()->cached_displays()); | 321 Shell::GetInstance()->display_configurator()->cached_displays()); |
| 318 } | 322 } |
| 319 | 323 |
| 320 } // namespace ash | 324 } // namespace ash |
| OLD | NEW |