Index: chromeos/display/real_output_configurator_delegate.cc |
diff --git a/chromeos/display/real_output_configurator_delegate.cc b/chromeos/display/real_output_configurator_delegate.cc |
index 0ed04378b76643737c39a47f0a71821b30124ea0..47fbd581a6159a346532a4e45191946757493ee0 100644 |
--- a/chromeos/display/real_output_configurator_delegate.cc |
+++ b/chromeos/display/real_output_configurator_delegate.cc |
@@ -138,7 +138,7 @@ RealOutputConfiguratorDelegate::GetOutputs( |
XRRCrtcInfo* crtc_info = XRRGetCrtcInfo( |
display_, screen_, output_info->crtc); |
to_populate.current_mode = crtc_info->mode; |
- to_populate.height = crtc_info->height; |
+ to_populate.x = crtc_info->x; |
to_populate.y = crtc_info->y; |
XRRFreeCrtcInfo(crtc_info); |
} |
@@ -252,38 +252,37 @@ bool RealOutputConfiguratorDelegate::GetModeDetails(RRMode mode, |
return false; |
} |
-void RealOutputConfiguratorDelegate::ConfigureCrtc( |
- OutputConfigurator::CrtcConfig* config) { |
+bool RealOutputConfiguratorDelegate::ConfigureCrtc( |
+ RRCrtc crtc, |
+ RRMode mode, |
+ RROutput output, |
+ int x, |
+ int y) { |
CHECK(screen_) << "Server not grabbed"; |
- VLOG(1) << "ConfigureCrtc: crtc=" << config->crtc |
- << " mode=" << config->mode |
- << " output=" << config->output |
- << " x=" << config->x |
- << " y=" << config->y; |
- |
- RROutput* outputs = NULL; |
- int num_outputs = 0; |
- if (config->output && config->mode) { |
- outputs = &config->output; |
- num_outputs = 1; |
- } |
- |
- XRRSetCrtcConfig(display_, |
- screen_, |
- config->crtc, |
- CurrentTime, |
- config->x, |
- config->y, |
- config->mode, |
- RR_Rotate_0, |
- outputs, |
- num_outputs); |
+ VLOG(1) << "ConfigureCrtc: crtc=" << crtc |
+ << " mode=" << mode |
+ << " output=" << output |
+ << " x=" << x |
+ << " y=" << y; |
+ // Xrandr.h is full of lies. XRRSetCrtcConfig() is defined as returning a |
+ // Status, which is typically 0 for failure and 1 for success. In |
+ // actuality it returns a RRCONFIGSTATUS, which uses 0 for success. |
+ return XRRSetCrtcConfig(display_, |
+ screen_, |
+ crtc, |
+ CurrentTime, |
+ x, |
+ y, |
+ mode, |
+ RR_Rotate_0, |
+ (output && mode) ? &output : NULL, |
+ (output && mode) ? 1 : 0) == RRSetConfigSuccess; |
} |
void RealOutputConfiguratorDelegate::CreateFrameBuffer( |
int width, |
int height, |
- const std::vector<OutputConfigurator::CrtcConfig>& configs) { |
+ const std::vector<OutputConfigurator::OutputSnapshot>& outputs) { |
CHECK(screen_) << "Server not grabbed"; |
int current_width = DisplayWidth(display_, DefaultScreen(display_)); |
int current_height = DisplayHeight(display_, DefaultScreen(display_)); |
@@ -292,7 +291,7 @@ void RealOutputConfiguratorDelegate::CreateFrameBuffer( |
if (width == current_width && height == current_height) |
return; |
- DestroyUnusedCrtcs(configs); |
+ DestroyUnusedCrtcs(outputs); |
int mm_width = width * kPixelsToMmScale; |
int mm_height = height * kPixelsToMmScale; |
XRRSetScreenSize(display_, window_, width, height, mm_width, mm_height); |
@@ -345,7 +344,7 @@ void RealOutputConfiguratorDelegate::SendProjectingStateToPowerManager( |
} |
void RealOutputConfiguratorDelegate::DestroyUnusedCrtcs( |
- const std::vector<OutputConfigurator::CrtcConfig>& configs) { |
+ const std::vector<OutputConfigurator::OutputSnapshot>& outputs) { |
CHECK(screen_) << "Server not grabbed"; |
// Setting the screen size will fail if any CRTC doesn't fit afterwards. |
// At the same time, turning CRTCs off and back on uses up a lot of time. |
@@ -360,31 +359,32 @@ void RealOutputConfiguratorDelegate::DestroyUnusedCrtcs( |
// out of the way so we can rebuild the frame buffer. |
for (int i = 0; i < screen_->ncrtc; ++i) { |
// Default config is to disable the crtcs. |
- OutputConfigurator::CrtcConfig config( |
- screen_->crtcs[i], 0, 0, None, None); |
- for (std::vector<OutputConfigurator::CrtcConfig>::const_iterator it = |
- configs.begin(); it != configs.end(); ++it) { |
- if (config.crtc == it->crtc) { |
- config.mode = it->mode; |
- config.output = it->output; |
+ RRCrtc crtc = screen_->crtcs[i]; |
+ RRMode mode = None; |
+ RROutput output = None; |
+ for (std::vector<OutputConfigurator::OutputSnapshot>::const_iterator it = |
+ outputs.begin(); it != outputs.end(); ++it) { |
+ if (crtc == it->crtc) { |
+ mode = it->current_mode; |
+ output = it->output; |
break; |
} |
} |
- if (config.mode != None) { |
+ if (mode != None) { |
// In case our CRTC doesn't fit in our current framebuffer, disable it. |
// It'll get reenabled after we resize the framebuffer. |
int mode_width = 0, mode_height = 0; |
- CHECK(GetModeDetails(config.mode, &mode_width, &mode_height, NULL)); |
+ CHECK(GetModeDetails(mode, &mode_width, &mode_height, NULL)); |
int current_width = DisplayWidth(display_, DefaultScreen(display_)); |
int current_height = DisplayHeight(display_, DefaultScreen(display_)); |
if (mode_width > current_width || mode_height > current_height) { |
- config.mode = None; |
- config.output = None; |
+ mode = None; |
+ output = None; |
} |
} |
- ConfigureCrtc(&config); |
+ ConfigureCrtc(crtc, mode, output, 0, 0); |
} |
} |