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 "chromeos/display/output_configurator.h" | 5 #include "chromeos/display/output_configurator.h" |
6 | 6 |
7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
8 #include <X11/extensions/Xrandr.h> | 8 #include <X11/extensions/Xrandr.h> |
9 #include <X11/extensions/XInput2.h> | 9 #include <X11/extensions/XInput2.h> |
10 | 10 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
99 (state == DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON && !internal) || | 99 (state == DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON && !internal) || |
100 (state == DISPLAY_POWER_INTERNAL_ON_EXTERNAL_OFF && internal); | 100 (state == DISPLAY_POWER_INTERNAL_ON_EXTERNAL_OFF && internal); |
101 if (output_power) | 101 if (output_power) |
102 (*output_power)[i] = on; | 102 (*output_power)[i] = on; |
103 if (on) | 103 if (on) |
104 num_on_outputs++; | 104 num_on_outputs++; |
105 } | 105 } |
106 return num_on_outputs; | 106 return num_on_outputs; |
107 } | 107 } |
108 | 108 |
109 // Determine if there is an "internal" output and how many outputs are | |
110 // connected. | |
111 bool IsProjecting( | |
112 const std::vector<OutputConfigurator::OutputSnapshot>& outputs) { | |
113 bool has_internal_output = false; | |
114 int connected_output_count = outputs.size(); | |
115 for (size_t i = 0; i < outputs.size(); ++i) | |
116 has_internal_output |= outputs[i].type == OUTPUT_TYPE_INTERNAL; | |
117 | |
118 // "Projecting" is defined as having more than 1 output connected while at | |
119 // least one of them is an internal output. | |
120 return has_internal_output && (connected_output_count > 1); | |
121 } | |
122 | |
123 } // namespace | 109 } // namespace |
124 | 110 |
125 OutputConfigurator::ModeInfo::ModeInfo() | 111 OutputConfigurator::ModeInfo::ModeInfo() |
126 : width(0), | 112 : width(0), |
127 height(0), | 113 height(0), |
128 interlaced(false), | 114 interlaced(false), |
129 refresh_rate(0.0) {} | 115 refresh_rate(0.0) {} |
130 | 116 |
131 OutputConfigurator::ModeInfo::ModeInfo(int width, | 117 OutputConfigurator::ModeInfo::ModeInfo(int width, |
132 int height, | 118 int height, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
245 } | 231 } |
246 | 232 |
247 OutputConfigurator::OutputConfigurator() | 233 OutputConfigurator::OutputConfigurator() |
248 : state_controller_(NULL), | 234 : state_controller_(NULL), |
249 mirroring_controller_(NULL), | 235 mirroring_controller_(NULL), |
250 is_panel_fitting_enabled_(false), | 236 is_panel_fitting_enabled_(false), |
251 configure_display_(base::SysInfo::IsRunningOnChromeOS()), | 237 configure_display_(base::SysInfo::IsRunningOnChromeOS()), |
252 xrandr_event_base_(0), | 238 xrandr_event_base_(0), |
253 output_state_(STATE_INVALID), | 239 output_state_(STATE_INVALID), |
254 power_state_(DISPLAY_POWER_ALL_ON), | 240 power_state_(DISPLAY_POWER_ALL_ON), |
255 next_output_protection_client_id_(1) { | 241 next_output_protection_client_id_(1), |
242 screen_sharing_count_(0) { | |
256 } | 243 } |
257 | 244 |
258 OutputConfigurator::~OutputConfigurator() {} | 245 OutputConfigurator::~OutputConfigurator() {} |
259 | 246 |
260 void OutputConfigurator::SetDelegateForTesting(scoped_ptr<Delegate> delegate) { | 247 void OutputConfigurator::SetDelegateForTesting(scoped_ptr<Delegate> delegate) { |
261 delegate_ = delegate.Pass(); | 248 delegate_ = delegate.Pass(); |
262 configure_display_ = true; | 249 configure_display_ = true; |
263 } | 250 } |
264 | 251 |
265 void OutputConfigurator::SetInitialDisplayPower(DisplayPowerState power_state) { | 252 void OutputConfigurator::SetInitialDisplayPower(DisplayPowerState power_state) { |
266 DCHECK_EQ(output_state_, STATE_INVALID); | 253 DCHECK_EQ(output_state_, STATE_INVALID); |
267 power_state_ = power_state; | 254 power_state_ = power_state; |
268 } | 255 } |
269 | 256 |
257 void OutputConfigurator::SendProjectingStateToPowerManager() { | |
Daniel Erat
2014/01/15 22:42:59
the order of methods in the .cc file should match
hshi1
2014/01/16 02:01:44
Done.
| |
258 bool has_internal_output = false; | |
259 int connected_output_count = cached_outputs_.size() + screen_sharing_count_; | |
260 for (size_t i = 0; i < cached_outputs_.size(); ++i) | |
261 has_internal_output |= cached_outputs_[i].type == OUTPUT_TYPE_INTERNAL; | |
Daniel Erat
2014/01/15 22:42:59
nit: just do:
if (cached_outputs_[i].type == OU
hshi1
2014/01/16 02:01:44
Done.
| |
262 | |
263 // "Projecting" is defined as having more than 1 output connected while at | |
264 // least one of them is an internal output. | |
265 bool is_projecting = has_internal_output && (connected_output_count > 1); | |
266 delegate_->SendProjectingStateToPowerManager(is_projecting); | |
267 } | |
268 | |
270 void OutputConfigurator::Init(bool is_panel_fitting_enabled) { | 269 void OutputConfigurator::Init(bool is_panel_fitting_enabled) { |
271 is_panel_fitting_enabled_ = is_panel_fitting_enabled; | 270 is_panel_fitting_enabled_ = is_panel_fitting_enabled; |
272 if (!configure_display_) | 271 if (!configure_display_) |
273 return; | 272 return; |
274 | 273 |
275 if (!delegate_) | 274 if (!delegate_) |
276 delegate_.reset(new RealOutputConfiguratorDelegate()); | 275 delegate_.reset(new RealOutputConfiguratorDelegate()); |
277 } | 276 } |
278 | 277 |
279 void OutputConfigurator::Start(uint32 background_color_argb) { | 278 void OutputConfigurator::Start(uint32 background_color_argb) { |
280 if (!configure_display_) | 279 if (!configure_display_) |
281 return; | 280 return; |
282 | 281 |
283 delegate_->GrabServer(); | 282 delegate_->GrabServer(); |
284 delegate_->InitXRandRExtension(&xrandr_event_base_); | 283 delegate_->InitXRandRExtension(&xrandr_event_base_); |
285 | 284 |
286 UpdateCachedOutputs(); | 285 UpdateCachedOutputs(); |
287 if (cached_outputs_.size() > 1 && background_color_argb) | 286 if (cached_outputs_.size() > 1 && background_color_argb) |
288 delegate_->SetBackgroundColor(background_color_argb); | 287 delegate_->SetBackgroundColor(background_color_argb); |
289 const OutputState new_state = ChooseOutputState(power_state_); | 288 const OutputState new_state = ChooseOutputState(power_state_); |
290 const bool success = EnterStateOrFallBackToSoftwareMirroring( | 289 const bool success = EnterStateOrFallBackToSoftwareMirroring( |
291 new_state, power_state_); | 290 new_state, power_state_); |
292 | 291 |
293 // Force the DPMS on chrome startup as the driver doesn't always detect | 292 // Force the DPMS on chrome startup as the driver doesn't always detect |
294 // that all displays are on when signing out. | 293 // that all displays are on when signing out. |
295 delegate_->ForceDPMSOn(); | 294 delegate_->ForceDPMSOn(); |
296 delegate_->UngrabServer(); | 295 delegate_->UngrabServer(); |
297 delegate_->SendProjectingStateToPowerManager(IsProjecting(cached_outputs_)); | 296 SendProjectingStateToPowerManager(); |
298 NotifyObservers(success, new_state); | 297 NotifyObservers(success, new_state); |
299 } | 298 } |
300 | 299 |
301 bool OutputConfigurator::ApplyProtections(const DisplayProtections& requests) { | 300 bool OutputConfigurator::ApplyProtections(const DisplayProtections& requests) { |
302 for (std::vector<OutputSnapshot>::const_iterator it = cached_outputs_.begin(); | 301 for (std::vector<OutputSnapshot>::const_iterator it = cached_outputs_.begin(); |
303 it != cached_outputs_.end(); ++it) { | 302 it != cached_outputs_.end(); ++it) { |
304 RROutput this_id = it->output; | 303 RROutput this_id = it->output; |
305 uint32_t all_desired = 0; | 304 uint32_t all_desired = 0; |
306 DisplayProtections::const_iterator request_it = requests.find( | 305 DisplayProtections::const_iterator request_it = requests.find( |
307 it->display_id); | 306 it->display_id); |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
770 configure_timer_.reset(); | 769 configure_timer_.reset(); |
771 | 770 |
772 delegate_->GrabServer(); | 771 delegate_->GrabServer(); |
773 UpdateCachedOutputs(); | 772 UpdateCachedOutputs(); |
774 const OutputState new_state = ChooseOutputState(power_state_); | 773 const OutputState new_state = ChooseOutputState(power_state_); |
775 const bool success = EnterStateOrFallBackToSoftwareMirroring( | 774 const bool success = EnterStateOrFallBackToSoftwareMirroring( |
776 new_state, power_state_); | 775 new_state, power_state_); |
777 delegate_->UngrabServer(); | 776 delegate_->UngrabServer(); |
778 | 777 |
779 NotifyObservers(success, new_state); | 778 NotifyObservers(success, new_state); |
780 delegate_->SendProjectingStateToPowerManager(IsProjecting(cached_outputs_)); | 779 SendProjectingStateToPowerManager(); |
781 } | 780 } |
782 | 781 |
783 void OutputConfigurator::NotifyObservers(bool success, | 782 void OutputConfigurator::NotifyObservers(bool success, |
784 OutputState attempted_state) { | 783 OutputState attempted_state) { |
785 if (success) { | 784 if (success) { |
786 FOR_EACH_OBSERVER(Observer, observers_, | 785 FOR_EACH_OBSERVER(Observer, observers_, |
787 OnDisplayModeChanged(cached_outputs_)); | 786 OnDisplayModeChanged(cached_outputs_)); |
788 } else { | 787 } else { |
789 FOR_EACH_OBSERVER(Observer, observers_, | 788 FOR_EACH_OBSERVER(Observer, observers_, |
790 OnDisplayModeChangeFailed(attempted_state)); | 789 OnDisplayModeChangeFailed(attempted_state)); |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1129 | 1128 |
1130 float width_ratio = static_cast<float>(mirror_mode_info->width) / | 1129 float width_ratio = static_cast<float>(mirror_mode_info->width) / |
1131 static_cast<float>(native_mode_info->width); | 1130 static_cast<float>(native_mode_info->width); |
1132 float height_ratio = static_cast<float>(mirror_mode_info->height) / | 1131 float height_ratio = static_cast<float>(mirror_mode_info->height) / |
1133 static_cast<float>(native_mode_info->height); | 1132 static_cast<float>(native_mode_info->height); |
1134 | 1133 |
1135 area_ratio = width_ratio * height_ratio; | 1134 area_ratio = width_ratio * height_ratio; |
1136 return area_ratio; | 1135 return area_ratio; |
1137 } | 1136 } |
1138 | 1137 |
1138 void OutputConfigurator::OnScreenSharingStateChanged(bool started) { | |
Daniel Erat
2014/01/15 22:42:59
same here
hshi1
2014/01/16 02:01:44
Done.
| |
1139 if (started) { | |
1140 ++screen_sharing_count_; | |
Daniel Erat
2014/01/15 22:42:59
indent two spaces beyond the previous line, not fo
hshi1
2014/01/16 02:01:44
Done.
| |
1141 } else { | |
1142 DCHECK_GT(screen_sharing_count_, 0); | |
1143 --screen_sharing_count_; | |
1144 } | |
1145 SendProjectingStateToPowerManager(); | |
1146 } | |
1147 | |
1139 } // namespace chromeos | 1148 } // namespace chromeos |
OLD | NEW |