| 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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 | 58 |
| 59 // The list of device scale factors (in addition to 1.0f) which is | 59 // The list of device scale factors (in addition to 1.0f) which is |
| 60 // available in extrenal large monitors. | 60 // available in extrenal large monitors. |
| 61 const float kAdditionalDeviceScaleFactorsFor4k[] = {1.25f, 2.0f}; | 61 const float kAdditionalDeviceScaleFactorsFor4k[] = {1.25f, 2.0f}; |
| 62 | 62 |
| 63 } // namespace | 63 } // namespace |
| 64 | 64 |
| 65 // static | 65 // static |
| 66 std::vector<DisplayMode> DisplayChangeObserver::GetInternalDisplayModeList( | 66 std::vector<DisplayMode> DisplayChangeObserver::GetInternalDisplayModeList( |
| 67 const DisplayInfo& display_info, | 67 const DisplayInfo& display_info, |
| 68 const DisplayConfigurator::DisplayState& output) { | 68 const ui::DisplaySnapshot& output) { |
| 69 const ui::DisplayMode* ui_native_mode = output.display->native_mode(); | 69 const ui::DisplayMode* ui_native_mode = output.native_mode(); |
| 70 DisplayMode native_mode(ui_native_mode->size(), | 70 DisplayMode native_mode(ui_native_mode->size(), |
| 71 ui_native_mode->refresh_rate(), | 71 ui_native_mode->refresh_rate(), |
| 72 ui_native_mode->is_interlaced(), | 72 ui_native_mode->is_interlaced(), |
| 73 true); | 73 true); |
| 74 native_mode.device_scale_factor = display_info.device_scale_factor(); | 74 native_mode.device_scale_factor = display_info.device_scale_factor(); |
| 75 | 75 |
| 76 return CreateInternalDisplayModeList(native_mode); | 76 return CreateInternalDisplayModeList(native_mode); |
| 77 } | 77 } |
| 78 | 78 |
| 79 // static | 79 // static |
| 80 std::vector<DisplayMode> DisplayChangeObserver::GetExternalDisplayModeList( | 80 std::vector<DisplayMode> DisplayChangeObserver::GetExternalDisplayModeList( |
| 81 const DisplayConfigurator::DisplayState& output) { | 81 const ui::DisplaySnapshot& output) { |
| 82 typedef std::map<std::pair<int, int>, DisplayMode> DisplayModeMap; | 82 typedef std::map<std::pair<int, int>, DisplayMode> DisplayModeMap; |
| 83 DisplayModeMap display_mode_map; | 83 DisplayModeMap display_mode_map; |
| 84 | 84 |
| 85 DisplayMode native_mode; | 85 DisplayMode native_mode; |
| 86 for (std::vector<const ui::DisplayMode*>::const_iterator it = | 86 for (const ui::DisplayMode* mode_info : output.modes()) { |
| 87 output.display->modes().begin(); | 87 const std::pair<int, int> size(mode_info->size().width(), |
| 88 it != output.display->modes().end(); | 88 mode_info->size().height()); |
| 89 ++it) { | 89 const DisplayMode display_mode(mode_info->size(), mode_info->refresh_rate(), |
| 90 const ui::DisplayMode& mode_info = **it; | 90 mode_info->is_interlaced(), |
| 91 const std::pair<int, int> size(mode_info.size().width(), | 91 output.native_mode() == mode_info); |
| 92 mode_info.size().height()); | |
| 93 const DisplayMode display_mode(mode_info.size(), | |
| 94 mode_info.refresh_rate(), | |
| 95 mode_info.is_interlaced(), | |
| 96 output.display->native_mode() == *it); | |
| 97 if (display_mode.native) | 92 if (display_mode.native) |
| 98 native_mode = display_mode; | 93 native_mode = display_mode; |
| 99 | 94 |
| 100 // Add the display mode if it isn't already present and override interlaced | 95 // Add the display mode if it isn't already present and override interlaced |
| 101 // display modes with non-interlaced ones. | 96 // display modes with non-interlaced ones. |
| 102 DisplayModeMap::iterator display_mode_it = display_mode_map.find(size); | 97 DisplayModeMap::iterator display_mode_it = display_mode_map.find(size); |
| 103 if (display_mode_it == display_mode_map.end()) | 98 if (display_mode_it == display_mode_map.end()) |
| 104 display_mode_map.insert(std::make_pair(size, display_mode)); | 99 display_mode_map.insert(std::make_pair(size, display_mode)); |
| 105 else if (display_mode_it->second.interlaced && !display_mode.interlaced) | 100 else if (display_mode_it->second.interlaced && !display_mode.interlaced) |
| 106 display_mode_it->second = display_mode; | 101 display_mode_it->second = display_mode; |
| 107 } | 102 } |
| 108 | 103 |
| 109 std::vector<DisplayMode> display_mode_list; | 104 std::vector<DisplayMode> display_mode_list; |
| 110 for (DisplayModeMap::const_iterator iter = display_mode_map.begin(); | 105 for (const auto& display_mode_pair : display_mode_map) |
| 111 iter != display_mode_map.end(); | 106 display_mode_list.push_back(display_mode_pair.second); |
| 112 ++iter) { | |
| 113 display_mode_list.push_back(iter->second); | |
| 114 } | |
| 115 | 107 |
| 116 if (output.display->native_mode()) { | 108 if (output.native_mode()) { |
| 117 const std::pair<int, int> size(native_mode.size.width(), | 109 const std::pair<int, int> size(native_mode.size.width(), |
| 118 native_mode.size.height()); | 110 native_mode.size.height()); |
| 119 DisplayModeMap::iterator it = display_mode_map.find(size); | 111 DisplayModeMap::iterator it = display_mode_map.find(size); |
| 120 DCHECK(it != display_mode_map.end()) | 112 DCHECK(it != display_mode_map.end()) |
| 121 << "Native mode must be part of the mode list."; | 113 << "Native mode must be part of the mode list."; |
| 122 | 114 |
| 123 // If the native mode was replaced re-add it. | 115 // If the native mode was replaced re-add it. |
| 124 if (!it->second.native) | 116 if (!it->second.native) |
| 125 display_mode_list.push_back(native_mode); | 117 display_mode_list.push_back(native_mode); |
| 126 } | 118 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 DisplayMode mode; | 155 DisplayMode mode; |
| 164 if (!Shell::GetInstance()->display_manager()->GetSelectedModeForDisplayId( | 156 if (!Shell::GetInstance()->display_manager()->GetSelectedModeForDisplayId( |
| 165 display_id, &mode)) | 157 display_id, &mode)) |
| 166 return false; | 158 return false; |
| 167 | 159 |
| 168 *size = mode.size; | 160 *size = mode.size; |
| 169 return true; | 161 return true; |
| 170 } | 162 } |
| 171 | 163 |
| 172 void DisplayChangeObserver::OnDisplayModeChanged( | 164 void DisplayChangeObserver::OnDisplayModeChanged( |
| 173 const std::vector<DisplayConfigurator::DisplayState>& display_states) { | 165 const ui::DisplayConfigurator::DisplayStateList& display_states) { |
| 174 std::vector<DisplayInfo> displays; | 166 std::vector<DisplayInfo> displays; |
| 175 std::set<int64> ids; | 167 std::set<int64> ids; |
| 176 for (size_t i = 0; i < display_states.size(); ++i) { | 168 for (const ui::DisplaySnapshot* state : display_states) { |
| 177 const DisplayConfigurator::DisplayState& state = display_states[i]; | 169 if (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) { |
| 178 | |
| 179 if (state.display->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) { | |
| 180 if (gfx::Display::InternalDisplayId() == | 170 if (gfx::Display::InternalDisplayId() == |
| 181 gfx::Display::kInvalidDisplayID) { | 171 gfx::Display::kInvalidDisplayID) { |
| 182 gfx::Display::SetInternalDisplayId(state.display->display_id()); | 172 gfx::Display::SetInternalDisplayId(state->display_id()); |
| 183 } else { | 173 } else { |
| 184 #if defined(USE_OZONE) | 174 #if defined(USE_OZONE) |
| 185 // TODO(dnicoara) Remove when Ozone can properly perform the initial | 175 // TODO(dnicoara) Remove when Ozone can properly perform the initial |
| 186 // display configuration. | 176 // display configuration. |
| 187 gfx::Display::SetInternalDisplayId(state.display->display_id()); | 177 gfx::Display::SetInternalDisplayId(state->display_id()); |
| 188 #endif | 178 #endif |
| 189 DCHECK_EQ(gfx::Display::InternalDisplayId(), | 179 DCHECK_EQ(gfx::Display::InternalDisplayId(), state->display_id()); |
| 190 state.display->display_id()); | |
| 191 } | 180 } |
| 192 } | 181 } |
| 193 | 182 |
| 194 const ui::DisplayMode* mode_info = state.display->current_mode(); | 183 const ui::DisplayMode* mode_info = state->current_mode(); |
| 195 if (!mode_info) | 184 if (!mode_info) |
| 196 continue; | 185 continue; |
| 197 | 186 |
| 198 float device_scale_factor = 1.0f; | 187 float device_scale_factor = 1.0f; |
| 199 if (state.display->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) { | 188 if (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) { |
| 200 if (!ui::IsDisplaySizeBlackListed(state.display->physical_size())) { | 189 if (!ui::IsDisplaySizeBlackListed(state->physical_size())) { |
| 201 device_scale_factor = | 190 device_scale_factor = |
| 202 FindDeviceScaleFactor((kInchInMm * mode_info->size().width() / | 191 FindDeviceScaleFactor((kInchInMm * mode_info->size().width() / |
| 203 state.display->physical_size().width())); | 192 state->physical_size().width())); |
| 204 } | 193 } |
| 205 } else { | 194 } else { |
| 206 DisplayMode mode; | 195 DisplayMode mode; |
| 207 if (Shell::GetInstance()->display_manager()->GetSelectedModeForDisplayId( | 196 if (Shell::GetInstance()->display_manager()->GetSelectedModeForDisplayId( |
| 208 state.display->display_id(), &mode)) { | 197 state->display_id(), &mode)) { |
| 209 device_scale_factor = mode.device_scale_factor; | 198 device_scale_factor = mode.device_scale_factor; |
| 210 } | 199 } |
| 211 } | 200 } |
| 212 gfx::Rect display_bounds(state.display->origin(), mode_info->size()); | 201 gfx::Rect display_bounds(state->origin(), mode_info->size()); |
| 213 | 202 |
| 214 std::string name = | 203 std::string name = |
| 215 state.display->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL ? | 204 state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL |
| 216 l10n_util::GetStringUTF8(IDS_ASH_INTERNAL_DISPLAY_NAME) : | 205 ? l10n_util::GetStringUTF8(IDS_ASH_INTERNAL_DISPLAY_NAME) |
| 217 state.display->display_name(); | 206 : state->display_name(); |
| 218 if (name.empty()) | 207 if (name.empty()) |
| 219 name = l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME); | 208 name = l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME); |
| 220 | 209 |
| 221 bool has_overscan = state.display->has_overscan(); | 210 bool has_overscan = state->has_overscan(); |
| 222 int64 id = state.display->display_id(); | 211 int64 id = state->display_id(); |
| 223 ids.insert(id); | 212 ids.insert(id); |
| 224 | 213 |
| 225 displays.push_back(DisplayInfo(id, name, has_overscan)); | 214 displays.push_back(DisplayInfo(id, name, has_overscan)); |
| 226 DisplayInfo& new_info = displays.back(); | 215 DisplayInfo& new_info = displays.back(); |
| 227 new_info.set_device_scale_factor(device_scale_factor); | 216 new_info.set_device_scale_factor(device_scale_factor); |
| 228 new_info.SetBounds(display_bounds); | 217 new_info.SetBounds(display_bounds); |
| 229 new_info.set_native(true); | 218 new_info.set_native(true); |
| 230 new_info.set_is_aspect_preserving_scaling( | 219 new_info.set_is_aspect_preserving_scaling( |
| 231 state.display->is_aspect_preserving_scaling()); | 220 state->is_aspect_preserving_scaling()); |
| 232 | 221 |
| 233 std::vector<DisplayMode> display_modes = | 222 std::vector<DisplayMode> display_modes = |
| 234 (state.display->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) ? | 223 (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) |
| 235 GetInternalDisplayModeList(new_info, state) : | 224 ? GetInternalDisplayModeList(new_info, *state) |
| 236 GetExternalDisplayModeList(state); | 225 : GetExternalDisplayModeList(*state); |
| 237 new_info.SetDisplayModes(display_modes); | 226 new_info.SetDisplayModes(display_modes); |
| 238 | 227 |
| 239 new_info.set_available_color_profiles( | 228 new_info.set_available_color_profiles( |
| 240 Shell::GetInstance() | 229 Shell::GetInstance() |
| 241 ->display_configurator() | 230 ->display_configurator() |
| 242 ->GetAvailableColorCalibrationProfiles(id)); | 231 ->GetAvailableColorCalibrationProfiles(id)); |
| 243 } | 232 } |
| 244 | 233 |
| 245 AssociateTouchscreens( | 234 AssociateTouchscreens( |
| 246 &displays, ui::DeviceDataManager::GetInstance()->touchscreen_devices()); | 235 &displays, ui::DeviceDataManager::GetInstance()->touchscreen_devices()); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 } | 270 } |
| 282 return 1.0f; | 271 return 1.0f; |
| 283 } | 272 } |
| 284 | 273 |
| 285 void DisplayChangeObserver::OnTouchscreenDeviceConfigurationChanged() { | 274 void DisplayChangeObserver::OnTouchscreenDeviceConfigurationChanged() { |
| 286 OnDisplayModeChanged( | 275 OnDisplayModeChanged( |
| 287 Shell::GetInstance()->display_configurator()->cached_displays()); | 276 Shell::GetInstance()->display_configurator()->cached_displays()); |
| 288 } | 277 } |
| 289 | 278 |
| 290 } // namespace ash | 279 } // namespace ash |
| OLD | NEW |