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 <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include <X11/Xatom.h> | 9 #include <X11/Xatom.h> |
10 #include <X11/Xlib.h> | 10 #include <X11/Xlib.h> |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 : is_running_on_chrome_os_(base::chromeos::IsRunningOnChromeOS()), | 532 : is_running_on_chrome_os_(base::chromeos::IsRunningOnChromeOS()), |
533 is_panel_fitting_enabled_(false), | 533 is_panel_fitting_enabled_(false), |
534 connected_output_count_(0), | 534 connected_output_count_(0), |
535 xrandr_event_base_(0), | 535 xrandr_event_base_(0), |
536 output_state_(STATE_INVALID), | 536 output_state_(STATE_INVALID), |
537 mirror_mode_will_preserve_aspect_(false), | 537 mirror_mode_will_preserve_aspect_(false), |
538 mirror_mode_preserved_aspect_(false), | 538 mirror_mode_preserved_aspect_(false), |
539 last_enter_state_time_() { | 539 last_enter_state_time_() { |
540 } | 540 } |
541 | 541 |
542 void OutputConfigurator::Init(bool is_panel_fitting_enabled) { | 542 OutputConfigurator::~OutputConfigurator() { |
| 543 RecordPreviousStateUMA(); |
| 544 } |
| 545 |
| 546 void OutputConfigurator::Init(bool is_panel_fitting_enabled, |
| 547 uint32 background_color_argb) { |
543 TRACE_EVENT0("chromeos", "OutputConfigurator::Init"); | 548 TRACE_EVENT0("chromeos", "OutputConfigurator::Init"); |
544 if (!is_running_on_chrome_os_) | 549 if (!is_running_on_chrome_os_) |
545 return; | 550 return; |
546 | |
547 is_panel_fitting_enabled_ = is_panel_fitting_enabled; | 551 is_panel_fitting_enabled_ = is_panel_fitting_enabled; |
548 | 552 |
549 // Cache the initial output state. | 553 // Cache the initial output state. |
550 Display* display = base::MessagePumpAuraX11::GetDefaultXDisplay(); | 554 Display* display = base::MessagePumpAuraX11::GetDefaultXDisplay(); |
551 CHECK(display != NULL); | 555 CHECK(display != NULL); |
552 XGrabServer(display); | 556 XGrabServer(display); |
553 Window window = DefaultRootWindow(display); | 557 Window window = DefaultRootWindow(display); |
554 XRRScreenResources* screen = GetScreenResourcesAndRecordUMA(display, window); | 558 XRRScreenResources* screen = GetScreenResourcesAndRecordUMA(display, window); |
555 CHECK(screen != NULL); | 559 CHECK(screen != NULL); |
556 | 560 |
557 // Detect our initial state. | 561 // Detect our initial state. |
558 std::vector<OutputSnapshot> outputs = GetDualOutputs(display, screen); | 562 std::vector<OutputSnapshot> outputs = GetDualOutputs(display, screen); |
559 connected_output_count_ = outputs.size(); | 563 connected_output_count_ = outputs.size(); |
| 564 if (outputs.size() > 1 && background_color_argb) { |
| 565 // Configuring CRTCs/Framebuffer clears the boot screen image. |
| 566 // Set the same background color while configuring the |
| 567 // display to minimize the duration of black screen at boot |
| 568 // time. The background is filled with black later in |
| 569 // ash::DisplayManager. |
| 570 // crbug.com/171050. |
| 571 XSetWindowAttributes swa = {0}; |
| 572 XColor color; |
| 573 Colormap colormap = DefaultColormap(display, 0); |
| 574 // XColor uses 16 bits per color. |
| 575 color.red = (background_color_argb & 0x00FF0000) >> 8; |
| 576 color.green = (background_color_argb & 0x0000FF00); |
| 577 color.blue = (background_color_argb & 0x000000FF) << 8; |
| 578 color.flags = DoRed | DoGreen | DoBlue; |
| 579 XAllocColor(display, colormap, &color); |
| 580 swa.background_pixel = color.pixel; |
| 581 XChangeWindowAttributes(display, window, CWBackPixel, &swa); |
| 582 XFreeColors(display, colormap, &color.pixel, 1, 0); |
| 583 } |
| 584 |
560 output_state_ = InferCurrentState(display, screen, outputs); | 585 output_state_ = InferCurrentState(display, screen, outputs); |
561 // Ensure that we are in a supported state with all connected displays powered | 586 // Ensure that we are in a supported state with all connected displays powered |
562 // on. | 587 // on. |
563 OutputState starting_state = GetNextState(display, | 588 OutputState starting_state = GetNextState(display, |
564 screen, | 589 screen, |
565 STATE_INVALID, | 590 STATE_INVALID, |
566 outputs); | 591 outputs); |
567 if (output_state_ != starting_state && | 592 if (output_state_ != starting_state && |
568 EnterState(display, | 593 EnterState(display, |
569 screen, | 594 screen, |
(...skipping 14 matching lines...) Expand all Loading... |
584 CHECK(DPMSForceLevel(display, DPMSModeOn)); | 609 CHECK(DPMSForceLevel(display, DPMSModeOn)); |
585 | 610 |
586 // Relinquish X resources. | 611 // Relinquish X resources. |
587 XRRFreeScreenResources(screen); | 612 XRRFreeScreenResources(screen); |
588 XUngrabServer(display); | 613 XUngrabServer(display); |
589 | 614 |
590 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()-> | 615 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()-> |
591 SetIsProjecting(is_projecting); | 616 SetIsProjecting(is_projecting); |
592 } | 617 } |
593 | 618 |
594 OutputConfigurator::~OutputConfigurator() { | |
595 RecordPreviousStateUMA(); | |
596 } | |
597 | |
598 bool OutputConfigurator::CycleDisplayMode() { | 619 bool OutputConfigurator::CycleDisplayMode() { |
599 TRACE_EVENT0("chromeos", "OutputConfigurator::CycleDisplayMode"); | 620 TRACE_EVENT0("chromeos", "OutputConfigurator::CycleDisplayMode"); |
600 VLOG(1) << "CycleDisplayMode"; | 621 VLOG(1) << "CycleDisplayMode"; |
601 if (!is_running_on_chrome_os_) | 622 if (!is_running_on_chrome_os_) |
602 return false; | 623 return false; |
603 | 624 |
604 bool did_change = false; | 625 bool did_change = false; |
605 Display* display = base::MessagePumpAuraX11::GetDefaultXDisplay(); | 626 Display* display = base::MessagePumpAuraX11::GetDefaultXDisplay(); |
606 CHECK(display != NULL); | 627 CHECK(display != NULL); |
607 XGrabServer(display); | 628 XGrabServer(display); |
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1318 // static | 1339 // static |
1319 RRMode OutputConfigurator::GetOutputNativeMode( | 1340 RRMode OutputConfigurator::GetOutputNativeMode( |
1320 const XRROutputInfo* output_info) { | 1341 const XRROutputInfo* output_info) { |
1321 if (output_info->nmode <= 0) | 1342 if (output_info->nmode <= 0) |
1322 return None; | 1343 return None; |
1323 | 1344 |
1324 return output_info->modes[0]; | 1345 return output_info->modes[0]; |
1325 } | 1346 } |
1326 | 1347 |
1327 } // namespace chromeos | 1348 } // namespace chromeos |
OLD | NEW |