diff options
-rw-r--r-- | ash/ash.gyp | 5 | ||||
-rw-r--r-- | ash/display/projecting_observer_chromeos.cc | 61 | ||||
-rw-r--r-- | ash/display/projecting_observer_chromeos.h | 49 | ||||
-rw-r--r-- | ash/display/projecting_observer_chromeos_unittest.cc | 173 | ||||
-rw-r--r-- | ash/shell.cc | 10 | ||||
-rw-r--r-- | ash/shell.h | 2 | ||||
-rw-r--r-- | chromeos/chromeos.gyp | 4 | ||||
-rw-r--r-- | chromeos/dbus/fake_power_manager_client.cc | 6 | ||||
-rw-r--r-- | chromeos/dbus/fake_power_manager_client.h | 12 | ||||
-rw-r--r-- | chromeos/display/native_display_delegate_x11.cc (renamed from chromeos/display/real_output_configurator_delegate.cc) | 147 | ||||
-rw-r--r-- | chromeos/display/native_display_delegate_x11.h (renamed from chromeos/display/real_output_configurator_delegate.h) | 42 | ||||
-rw-r--r-- | chromeos/display/output_configurator.cc | 90 | ||||
-rw-r--r-- | chromeos/display/output_configurator.h | 29 | ||||
-rw-r--r-- | chromeos/display/output_configurator_unittest.cc | 138 |
14 files changed, 486 insertions, 282 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp index 9858260..4140801 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp @@ -124,6 +124,8 @@ 'display/mouse_cursor_event_filter.h', 'display/output_configurator_animation.cc', 'display/output_configurator_animation.h', + 'display/projecting_observer_chromeos.cc', + 'display/projecting_observer_chromeos.h', 'display/resolution_notification_controller.cc', 'display/resolution_notification_controller.h', 'display/root_window_transformers.cc', @@ -838,6 +840,7 @@ 'display/mirror_window_controller_unittest.cc', 'display/virtual_keyboard_window_controller_unittest.cc', 'display/mouse_cursor_event_filter_unittest.cc', + 'display/projecting_observer_chromeos_unittest.cc', 'display/resolution_notification_controller_unittest.cc', 'display/root_window_transformers_unittest.cc', 'display/screen_position_controller_unittest.cc', @@ -980,7 +983,7 @@ 'sources/': [ ['exclude', 'display/display_change_observer_chromeos_unittest.cc'], ['exclude', 'display/display_error_observer_chromeos_unittest.cc'], - ['exclude', 'magnifier/magnifier_key_scroller_unittest.cc'], + ['exclude', 'magnifier/magnifier_key_scroller_unittest.cc'], ], }], ['chromeos==1', { diff --git a/ash/display/projecting_observer_chromeos.cc b/ash/display/projecting_observer_chromeos.cc new file mode 100644 index 0000000..1cc586d --- /dev/null +++ b/ash/display/projecting_observer_chromeos.cc @@ -0,0 +1,61 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/display/projecting_observer_chromeos.h" + +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/power_manager_client.h" + +namespace ash { + +namespace internal { + +ProjectingObserver::ProjectingObserver() + : has_internal_output_(false), + output_count_(0), + casting_session_count_(0) {} + +ProjectingObserver::~ProjectingObserver() {} + +void ProjectingObserver::OnDisplayModeChanged( + const std::vector<chromeos::OutputConfigurator::OutputSnapshot>& outputs) { + has_internal_output_ = false; + output_count_ = outputs.size(); + + for (size_t i = 0; i < outputs.size(); ++i) { + if (outputs[i].type == chromeos::OUTPUT_TYPE_INTERNAL) { + has_internal_output_ = true; + break; + } + } + + SetIsProjecting(); +} + +void ProjectingObserver::OnCastingSessionStartedOrStopped(bool started) { + if (started) { + ++casting_session_count_; + } else { + DCHECK_GT(casting_session_count_, 0); + --casting_session_count_; + if (casting_session_count_ < 0) + casting_session_count_ = 0; + } + + SetIsProjecting(); +} + +void ProjectingObserver::SetIsProjecting() { + // "Projecting" is defined as having more than 1 output connected while at + // least one of them is an internal output. + bool projecting = has_internal_output_ && + (output_count_ + casting_session_count_ > 1); + + chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->SetIsProjecting( + projecting); +} + +} // namespace internal + +} // namespace ash diff --git a/ash/display/projecting_observer_chromeos.h b/ash/display/projecting_observer_chromeos.h new file mode 100644 index 0000000..45aca74c --- /dev/null +++ b/ash/display/projecting_observer_chromeos.h @@ -0,0 +1,49 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_DISPLAY_PROJECTING_OBSERVER_CHROMEOS_H_ +#define ASH_DISPLAY_PROJECTING_OBSERVER_CHROMEOS_H_ + +#include "ash/ash_export.h" +#include "chromeos/display/output_configurator.h" + +namespace ash { + +namespace internal { + +class ASH_EXPORT ProjectingObserver + : public chromeos::OutputConfigurator::Observer { + public: + ProjectingObserver(); + virtual ~ProjectingObserver(); + + // Called when a casting session is started or stopped. + void OnCastingSessionStartedOrStopped(bool started); + + // OutputConfigurator::Observer implementation: + virtual void OnDisplayModeChanged(const std::vector< + chromeos::OutputConfigurator::OutputSnapshot>& outputs) OVERRIDE; + + private: + // Sends the current projecting state to power manager. + void SetIsProjecting(); + + // True if at least one output is internal. This value is updated when + // |OnDisplayModeChanged| is called. + bool has_internal_output_; + + // Keeps track of the number of connected outputs. + int output_count_; + + // Number of outstanding casting sessions. + int casting_session_count_; + + DISALLOW_COPY_AND_ASSIGN(ProjectingObserver); +}; + +} // namespace internal + +} // namespace ash + +#endif // ASH_DISPLAY_PROJECTING_OBSERVER_CHROMEOS_H_ diff --git a/ash/display/projecting_observer_chromeos_unittest.cc b/ash/display/projecting_observer_chromeos_unittest.cc new file mode 100644 index 0000000..1cef970 --- /dev/null +++ b/ash/display/projecting_observer_chromeos_unittest.cc @@ -0,0 +1,173 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/display/projecting_observer_chromeos.h" + +#include "chromeos/dbus/fake_dbus_thread_manager.h" +#include "chromeos/dbus/fake_power_manager_client.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { + +namespace internal { + +namespace { + +chromeos::OutputConfigurator::OutputSnapshot CreateInternalSnapshot() { + chromeos::OutputConfigurator::OutputSnapshot output; + output.type = chromeos::OUTPUT_TYPE_INTERNAL; + return output; +} + +chromeos::OutputConfigurator::OutputSnapshot CreateVGASnapshot() { + chromeos::OutputConfigurator::OutputSnapshot output; + output.type = chromeos::OUTPUT_TYPE_VGA; + return output; +} + +class ProjectingObserverTest : public testing::Test { + public: + ProjectingObserverTest() : observer_(new ProjectingObserver()) { + chromeos::FakeDBusThreadManager* dbus_manager = + new chromeos::FakeDBusThreadManager(); + fake_power_client_ = new chromeos::FakePowerManagerClient(); + + dbus_manager->SetPowerManagerClient( + scoped_ptr<chromeos::PowerManagerClient>(fake_power_client_)); + + // Takes ownership of |dbus_manager|. + chromeos::DBusThreadManager::InitializeForTesting(dbus_manager); + } + + virtual ~ProjectingObserverTest() { + chromeos::DBusThreadManager::Shutdown(); + } + + protected: + scoped_ptr<ProjectingObserver> observer_; + chromeos::FakePowerManagerClient* fake_power_client_; // Not owned. + + DISALLOW_COPY_AND_ASSIGN(ProjectingObserverTest); +}; + +} // namespace + +TEST_F(ProjectingObserverTest, CheckNoDisplay) { + std::vector<chromeos::OutputConfigurator::OutputSnapshot> outputs; + observer_->OnDisplayModeChanged(outputs); + + EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls()); + EXPECT_FALSE(fake_power_client_->is_projecting()); +} + +TEST_F(ProjectingObserverTest, CheckWithoutInternalDisplay) { + std::vector<chromeos::OutputConfigurator::OutputSnapshot> outputs; + outputs.push_back(CreateVGASnapshot()); + observer_->OnDisplayModeChanged(outputs); + + EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls()); + EXPECT_FALSE(fake_power_client_->is_projecting()); +} + +TEST_F(ProjectingObserverTest, CheckWithInternalDisplay) { + std::vector<chromeos::OutputConfigurator::OutputSnapshot> outputs; + outputs.push_back(CreateInternalSnapshot()); + observer_->OnDisplayModeChanged(outputs); + + EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls()); + EXPECT_FALSE(fake_power_client_->is_projecting()); +} + +TEST_F(ProjectingObserverTest, CheckWithTwoVGADisplays) { + std::vector<chromeos::OutputConfigurator::OutputSnapshot> outputs; + outputs.push_back(CreateVGASnapshot()); + outputs.push_back(CreateVGASnapshot()); + observer_->OnDisplayModeChanged(outputs); + + EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls()); + // We need at least 1 internal display to set projecting to on. + EXPECT_FALSE(fake_power_client_->is_projecting()); +} + +TEST_F(ProjectingObserverTest, CheckWithInternalAndVGADisplays) { + std::vector<chromeos::OutputConfigurator::OutputSnapshot> outputs; + outputs.push_back(CreateInternalSnapshot()); + outputs.push_back(CreateVGASnapshot()); + observer_->OnDisplayModeChanged(outputs); + + EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls()); + EXPECT_TRUE(fake_power_client_->is_projecting()); +} + +TEST_F(ProjectingObserverTest, CheckWithVGADisplayAndOneCastingSession) { + std::vector<chromeos::OutputConfigurator::OutputSnapshot> outputs; + outputs.push_back(CreateVGASnapshot()); + observer_->OnDisplayModeChanged(outputs); + + observer_->OnCastingSessionStartedOrStopped(true); + + EXPECT_EQ(2, fake_power_client_->num_set_is_projecting_calls()); + // Need at least one internal display to set projecting state to |true|. + EXPECT_FALSE(fake_power_client_->is_projecting()); +} + +TEST_F(ProjectingObserverTest, CheckWithInternalDisplayAndOneCastingSession) { + std::vector<chromeos::OutputConfigurator::OutputSnapshot> outputs; + outputs.push_back(CreateInternalSnapshot()); + observer_->OnDisplayModeChanged(outputs); + + observer_->OnCastingSessionStartedOrStopped(true); + + EXPECT_EQ(2, fake_power_client_->num_set_is_projecting_calls()); + EXPECT_TRUE(fake_power_client_->is_projecting()); +} + +TEST_F(ProjectingObserverTest, CheckProjectingAfterClosingACastingSession) { + std::vector<chromeos::OutputConfigurator::OutputSnapshot> outputs; + outputs.push_back(CreateInternalSnapshot()); + observer_->OnDisplayModeChanged(outputs); + + observer_->OnCastingSessionStartedOrStopped(true); + observer_->OnCastingSessionStartedOrStopped(true); + + EXPECT_EQ(3, fake_power_client_->num_set_is_projecting_calls()); + EXPECT_TRUE(fake_power_client_->is_projecting()); + + observer_->OnCastingSessionStartedOrStopped(false); + + EXPECT_EQ(4, fake_power_client_->num_set_is_projecting_calls()); + EXPECT_TRUE(fake_power_client_->is_projecting()); +} + +TEST_F(ProjectingObserverTest, + CheckStopProjectingAfterClosingAllCastingSessions) { + std::vector<chromeos::OutputConfigurator::OutputSnapshot> outputs; + outputs.push_back(CreateInternalSnapshot()); + observer_->OnDisplayModeChanged(outputs); + + observer_->OnCastingSessionStartedOrStopped(true); + observer_->OnCastingSessionStartedOrStopped(false); + + EXPECT_EQ(3, fake_power_client_->num_set_is_projecting_calls()); + EXPECT_FALSE(fake_power_client_->is_projecting()); +} + +TEST_F(ProjectingObserverTest, + CheckStopProjectingAfterDisconnectingSecondOutput) { + std::vector<chromeos::OutputConfigurator::OutputSnapshot> outputs; + outputs.push_back(CreateInternalSnapshot()); + outputs.push_back(CreateVGASnapshot()); + observer_->OnDisplayModeChanged(outputs); + + // Remove VGA output. + outputs.erase(outputs.begin() + 1); + observer_->OnDisplayModeChanged(outputs); + + EXPECT_EQ(2, fake_power_client_->num_set_is_projecting_calls()); + EXPECT_FALSE(fake_power_client_->is_projecting()); +} + +} // namespace internal + +} // namespace ash diff --git a/ash/shell.cc b/ash/shell.cc index e39d265..5a9f024 100644 --- a/ash/shell.cc +++ b/ash/shell.cc @@ -120,6 +120,7 @@ #include "ash/display/display_change_observer_chromeos.h" #include "ash/display/display_error_observer_chromeos.h" #include "ash/display/output_configurator_animation.h" +#include "ash/display/projecting_observer_chromeos.h" #include "ash/magnifier/magnifier_key_scroller.h" #include "base/message_loop/message_pump_x11.h" #include "base/sys_info.h" @@ -375,8 +376,8 @@ void Shell::OnLockStateChanged(bool locked) { void Shell::OnCastingSessionStartedOrStopped(bool started) { #if defined(OS_CHROMEOS) && defined(USE_X11) - if (output_configurator_) - output_configurator_->OnCastingSessionStartedOrStopped(started); + if (projecting_observer_) + projecting_observer_->OnCastingSessionStartedOrStopped(started); #endif } @@ -732,6 +733,8 @@ Shell::~Shell() { output_configurator_->RemoveObserver(output_configurator_animation_.get()); if (display_error_observer_) output_configurator_->RemoveObserver(display_error_observer_.get()); + if (projecting_observer_) + output_configurator_->RemoveObserver(projecting_observer_.get()); base::MessagePumpX11::Current()->RemoveDispatcherForRootWindow( output_configurator()); base::MessagePumpX11::Current()->RemoveObserver(output_configurator()); @@ -760,6 +763,9 @@ void Shell::Init() { new internal::OutputConfiguratorAnimation()); output_configurator_->AddObserver(output_configurator_animation_.get()); + projecting_observer_.reset(new internal::ProjectingObserver()); + output_configurator_->AddObserver(projecting_observer_.get()); + if (!display_initialized && base::SysInfo::IsRunningOnChromeOS()) { display_change_observer_.reset(new internal::DisplayChangeObserver); // Register |display_change_observer_| first so that the rest of diff --git a/ash/shell.h b/ash/shell.h index e0905a8..3163c4c 100644 --- a/ash/shell.h +++ b/ash/shell.h @@ -134,6 +134,7 @@ class MouseCursorEventFilter; class OutputConfiguratorAnimation; class OverlayEventFilter; class PowerEventObserver; +class ProjectingObserver; class ResizeShadowController; class ResolutionNotificationController; class RootWindowController; @@ -700,6 +701,7 @@ class ASH_EXPORT Shell scoped_ptr<internal::OutputConfiguratorAnimation> output_configurator_animation_; scoped_ptr<internal::DisplayErrorObserver> display_error_observer_; + scoped_ptr<internal::ProjectingObserver> projecting_observer_; // Listens for output changes and updates the display manager. scoped_ptr<internal::DisplayChangeObserver> display_change_observer_; diff --git a/chromeos/chromeos.gyp b/chromeos/chromeos.gyp index b0b69da..9eb13ae 100644 --- a/chromeos/chromeos.gyp +++ b/chromeos/chromeos.gyp @@ -204,12 +204,12 @@ 'dbus/volume_state.h', 'disks/disk_mount_manager.cc', 'disks/disk_mount_manager.h', + 'display/native_display_delegate_x11.cc', + 'display/native_display_delegate_x11.h', 'display/output_configurator.cc', 'display/output_configurator.h', 'display/output_util.cc', 'display/output_util.h', - 'display/real_output_configurator_delegate.cc', - 'display/real_output_configurator_delegate.h', 'display/touchscreen_delegate_x11.cc', 'display/touchscreen_delegate_x11.h', 'ime/component_extension_ime_manager.cc', diff --git a/chromeos/dbus/fake_power_manager_client.cc b/chromeos/dbus/fake_power_manager_client.cc index 6007d753..529628a 100644 --- a/chromeos/dbus/fake_power_manager_client.cc +++ b/chromeos/dbus/fake_power_manager_client.cc @@ -9,7 +9,9 @@ namespace chromeos { FakePowerManagerClient::FakePowerManagerClient() : num_request_restart_calls_(0), - num_set_policy_calls_(0) { + num_set_policy_calls_(0), + num_set_is_projecting_calls_(0), + is_projecting_(false) { } FakePowerManagerClient::~FakePowerManagerClient() { @@ -78,6 +80,8 @@ void FakePowerManagerClient::DecreaseKeyboardBrightness() { } void FakePowerManagerClient::SetIsProjecting(bool is_projecting) { + ++num_set_is_projecting_calls_; + is_projecting_ = is_projecting; } void FakePowerManagerClient::NotifyUserActivity( diff --git a/chromeos/dbus/fake_power_manager_client.h b/chromeos/dbus/fake_power_manager_client.h index 61ad673..dd0cd26 100644 --- a/chromeos/dbus/fake_power_manager_client.h +++ b/chromeos/dbus/fake_power_manager_client.h @@ -31,6 +31,12 @@ class FakePowerManagerClient : public PowerManagerClient { int num_set_policy_calls() const { return num_set_policy_calls_; } + int num_set_is_projecting_calls() const { + return num_set_is_projecting_calls_; + } + bool is_projecting() const { + return is_projecting_; + } // PowerManagerClient overrides virtual void Init(dbus::Bus* bus) OVERRIDE; @@ -81,6 +87,12 @@ class FakePowerManagerClient : public PowerManagerClient { // Number of times that SetPolicy() has been called. int num_set_policy_calls_; + // Count the number of times SetIsProjecting() has been called. + int num_set_is_projecting_calls_; + + // Last projecting state set in SetIsProjecting(). + bool is_projecting_; + DISALLOW_COPY_AND_ASSIGN(FakePowerManagerClient); }; diff --git a/chromeos/display/real_output_configurator_delegate.cc b/chromeos/display/native_display_delegate_x11.cc index ca816bc..22d0e1e 100644 --- a/chromeos/display/real_output_configurator_delegate.cc +++ b/chromeos/display/native_display_delegate_x11.cc @@ -1,8 +1,8 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/display/real_output_configurator_delegate.h" +#include "chromeos/display/native_display_delegate_x11.h" #include <X11/Xatom.h> #include <X11/Xlib.h> @@ -15,8 +15,6 @@ #include "base/message_loop/message_pump_x11.h" #include "base/x11/edid_parser_x11.h" #include "base/x11/x11_error_tracker.h" -#include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/power_manager_client.h" #include "chromeos/display/output_util.h" namespace chromeos { @@ -49,44 +47,40 @@ RRMode GetOutputNativeMode(const XRROutputInfo* output_info) { } // namespace -RealOutputConfiguratorDelegate::RealOutputConfiguratorDelegate() +NativeDisplayDelegateX11::NativeDisplayDelegateX11() : display_(base::MessagePumpX11::GetDefaultXDisplay()), window_(DefaultRootWindow(display_)), - screen_(NULL) { -} + screen_(NULL) {} -RealOutputConfiguratorDelegate::~RealOutputConfiguratorDelegate() { -} +NativeDisplayDelegateX11::~NativeDisplayDelegateX11() {} -void RealOutputConfiguratorDelegate::InitXRandRExtension(int* event_base) { +void NativeDisplayDelegateX11::InitXRandRExtension(int* event_base) { int error_base_ignored = 0; XRRQueryExtension(display_, event_base, &error_base_ignored); } -void RealOutputConfiguratorDelegate::UpdateXRandRConfiguration( +void NativeDisplayDelegateX11::UpdateXRandRConfiguration( const base::NativeEvent& event) { XRRUpdateConfiguration(event); } -void RealOutputConfiguratorDelegate::GrabServer() { +void NativeDisplayDelegateX11::GrabServer() { CHECK(!screen_) << "Server already grabbed"; XGrabServer(display_); screen_ = XRRGetScreenResources(display_, window_); CHECK(screen_); } -void RealOutputConfiguratorDelegate::UngrabServer() { +void NativeDisplayDelegateX11::UngrabServer() { CHECK(screen_) << "Server not grabbed"; XRRFreeScreenResources(screen_); screen_ = NULL; XUngrabServer(display_); } -void RealOutputConfiguratorDelegate::SyncWithServer() { - XSync(display_, 0); -} +void NativeDisplayDelegateX11::SyncWithServer() { XSync(display_, 0); } -void RealOutputConfiguratorDelegate::SetBackgroundColor(uint32 color_argb) { +void NativeDisplayDelegateX11::SetBackgroundColor(uint32 color_argb) { // Configuring CRTCs/Framebuffer clears the boot screen image. Set the // same background color while configuring the display to minimize the // duration of black screen at boot time. The background is filled with @@ -105,13 +99,13 @@ void RealOutputConfiguratorDelegate::SetBackgroundColor(uint32 color_argb) { XFreeColors(display_, colormap, &color.pixel, 1, 0); } -void RealOutputConfiguratorDelegate::ForceDPMSOn() { +void NativeDisplayDelegateX11::ForceDPMSOn() { CHECK(DPMSEnable(display_)); CHECK(DPMSForceLevel(display_, DPMSModeOn)); } std::vector<OutputConfigurator::OutputSnapshot> -RealOutputConfiguratorDelegate::GetOutputs() { +NativeDisplayDelegateX11::GetOutputs() { CHECK(screen_) << "Server not grabbed"; std::vector<OutputConfigurator::OutputSnapshot> outputs; @@ -121,11 +115,10 @@ RealOutputConfiguratorDelegate::GetOutputs() { RROutput output_id = screen_->outputs[i]; XRROutputInfo* output_info = XRRGetOutputInfo(display_, screen_, output_id); if (output_info->connection == RR_Connected) { - OutputConfigurator::OutputSnapshot output = InitOutputSnapshot( - output_id, output_info, &last_used_crtc, i); + OutputConfigurator::OutputSnapshot output = + InitOutputSnapshot(output_id, output_info, &last_used_crtc, i); VLOG(2) << "Found display " << outputs.size() << ":" - << " output=" << output.output - << " crtc=" << output.crtc + << " output=" << output.output << " crtc=" << output.crtc << " current_mode=" << output.current_mode; outputs.push_back(output); } @@ -135,25 +128,20 @@ RealOutputConfiguratorDelegate::GetOutputs() { return outputs; } -void RealOutputConfiguratorDelegate::AddOutputMode(RROutput output, - RRMode mode) { +void NativeDisplayDelegateX11::AddOutputMode(RROutput output, RRMode mode) { CHECK(screen_) << "Server not grabbed"; VLOG(1) << "AddOutputMode: output=" << output << " mode=" << mode; XRRAddOutputMode(display_, output, mode); } -bool RealOutputConfiguratorDelegate::ConfigureCrtc( - RRCrtc crtc, - RRMode mode, - RROutput output, - int x, - int y) { +bool NativeDisplayDelegateX11::ConfigureCrtc(RRCrtc crtc, + RRMode mode, + RROutput output, + int x, + int y) { CHECK(screen_) << "Server not grabbed"; - VLOG(1) << "ConfigureCrtc: crtc=" << crtc - << " mode=" << mode - << " output=" << output - << " x=" << x - << " y=" << y; + 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. @@ -169,7 +157,7 @@ bool RealOutputConfiguratorDelegate::ConfigureCrtc( (output && mode) ? 1 : 0) == RRSetConfigSuccess; } -void RealOutputConfiguratorDelegate::CreateFrameBuffer( +void NativeDisplayDelegateX11::CreateFrameBuffer( int width, int height, const std::vector<OutputConfigurator::OutputSnapshot>& outputs) { @@ -178,7 +166,7 @@ void RealOutputConfiguratorDelegate::CreateFrameBuffer( int current_height = DisplayHeight(display_, DefaultScreen(display_)); VLOG(1) << "CreateFrameBuffer: new=" << width << "x" << height << " current=" << current_width << "x" << current_height; - if (width == current_width && height == current_height) + if (width == current_width && height == current_height) return; DestroyUnusedCrtcs(outputs); @@ -187,13 +175,7 @@ void RealOutputConfiguratorDelegate::CreateFrameBuffer( XRRSetScreenSize(display_, window_, width, height, mm_width, mm_height); } -void RealOutputConfiguratorDelegate::SendProjectingStateToPowerManager( - bool projecting) { - chromeos::DBusThreadManager::Get()->GetPowerManagerClient()-> - SetIsProjecting(projecting); -} - -bool RealOutputConfiguratorDelegate::InitModeInfo( +bool NativeDisplayDelegateX11::InitModeInfo( RRMode mode, OutputConfigurator::ModeInfo* mode_info) { DCHECK(mode_info); @@ -209,9 +191,9 @@ bool RealOutputConfiguratorDelegate::InitModeInfo( mode_info->height = info.height; mode_info->interlaced = info.modeFlags & RR_Interlace; if (info.hTotal && info.vTotal) { - mode_info->refresh_rate = static_cast<float>(info.dotClock) / - (static_cast<float>(info.hTotal) * - static_cast<float>(info.vTotal)); + mode_info->refresh_rate = + static_cast<float>(info.dotClock) / + (static_cast<float>(info.hTotal) * static_cast<float>(info.vTotal)); } else { mode_info->refresh_rate = 0.0f; } @@ -221,8 +203,7 @@ bool RealOutputConfiguratorDelegate::InitModeInfo( return false; } -OutputConfigurator::OutputSnapshot -RealOutputConfiguratorDelegate::InitOutputSnapshot( +OutputConfigurator::OutputSnapshot NativeDisplayDelegateX11::InitOutputSnapshot( RROutput id, XRROutputInfo* info, RRCrtc* last_used_crtc, @@ -290,8 +271,7 @@ RealOutputConfiguratorDelegate::InitOutputSnapshot( return output; } -bool RealOutputConfiguratorDelegate::GetHDCPState(RROutput id, - HDCPState* state) { +bool NativeDisplayDelegateX11::GetHDCPState(RROutput id, HDCPState* state) { unsigned char* values = NULL; int actual_format = 0; unsigned long nitems = 0; @@ -304,9 +284,18 @@ bool RealOutputConfiguratorDelegate::GetHDCPState(RROutput id, bool ok = true; // TODO(kcwu): Move this to x11_util (similar method calls in this file and // output_util.cc) - success = XRRGetOutputProperty(display_, id, prop, 0, 100, False, - False, AnyPropertyType, &actual_type, - &actual_format, &nitems, &bytes_after, + success = XRRGetOutputProperty(display_, + id, + prop, + 0, + 100, + False, + False, + AnyPropertyType, + &actual_type, + &actual_format, + &nitems, + &bytes_after, &values); if (actual_type == None) { LOG(ERROR) << "Property '" << kContentProtectionAtomName @@ -317,15 +306,15 @@ bool RealOutputConfiguratorDelegate::GetHDCPState(RROutput id, Atom value = reinterpret_cast<Atom*>(values)[0]; if (value == XInternAtom(display_, kProtectionUndesiredAtomName, False)) { *state = HDCP_STATE_UNDESIRED; - } else if (value == XInternAtom(display_, kProtectionDesiredAtomName, - False)) { + } else if (value == + XInternAtom(display_, kProtectionDesiredAtomName, False)) { *state = HDCP_STATE_DESIRED; - } else if (value == XInternAtom(display_, kProtectionEnabledAtomName, - False)) { + } else if (value == + XInternAtom(display_, kProtectionEnabledAtomName, False)) { *state = HDCP_STATE_ENABLED; } else { - LOG(ERROR) << "Unknown " << kContentProtectionAtomName << " value: " - << value; + LOG(ERROR) << "Unknown " << kContentProtectionAtomName + << " value: " << value; ok = false; } } else { @@ -339,8 +328,7 @@ bool RealOutputConfiguratorDelegate::GetHDCPState(RROutput id, return ok; } -bool RealOutputConfiguratorDelegate::SetHDCPState(RROutput id, - HDCPState state) { +bool NativeDisplayDelegateX11::SetHDCPState(RROutput id, HDCPState state) { Atom name = XInternAtom(display_, kContentProtectionAtomName, False); Atom value = None; switch (state) { @@ -356,8 +344,8 @@ bool RealOutputConfiguratorDelegate::SetHDCPState(RROutput id, } base::X11ErrorTracker err_tracker; unsigned char* data = reinterpret_cast<unsigned char*>(&value); - XRRChangeOutputProperty(display_, id, name, XA_ATOM, 32, - PropModeReplace, data, 1); + XRRChangeOutputProperty( + display_, id, name, XA_ATOM, 32, PropModeReplace, data, 1); if (err_tracker.FoundNewError()) { LOG(ERROR) << "XRRChangeOutputProperty failed"; return false; @@ -366,7 +354,7 @@ bool RealOutputConfiguratorDelegate::SetHDCPState(RROutput id, } } -void RealOutputConfiguratorDelegate::DestroyUnusedCrtcs( +void NativeDisplayDelegateX11::DestroyUnusedCrtcs( const std::vector<OutputConfigurator::OutputSnapshot>& outputs) { CHECK(screen_) << "Server not grabbed"; // Setting the screen size will fail if any CRTC doesn't fit afterwards. @@ -387,7 +375,9 @@ void RealOutputConfiguratorDelegate::DestroyUnusedCrtcs( RROutput output = None; const OutputConfigurator::ModeInfo* mode_info = NULL; for (std::vector<OutputConfigurator::OutputSnapshot>::const_iterator it = - outputs.begin(); it != outputs.end(); ++it) { + outputs.begin(); + it != outputs.end(); + ++it) { if (crtc == it->crtc) { mode = it->current_mode; output = it->output; @@ -414,8 +404,7 @@ void RealOutputConfiguratorDelegate::DestroyUnusedCrtcs( } } -bool RealOutputConfiguratorDelegate::IsOutputAspectPreservingScaling( - RROutput id) { +bool NativeDisplayDelegateX11::IsOutputAspectPreservingScaling(RROutput id) { bool ret = false; Atom scaling_prop = XInternAtom(display_, "scaling mode", False); @@ -435,11 +424,21 @@ bool RealOutputConfiguratorDelegate::IsOutputAspectPreservingScaling( Atom actual_type; int success; - success = XRRGetOutputProperty(display_, id, prop, 0, 100, False, False, - AnyPropertyType, &actual_type, &actual_format, &nitems, - &bytes_after, &values); - if (success == Success && actual_type == XA_ATOM && - actual_format == 32 && nitems == 1) { + success = XRRGetOutputProperty(display_, + id, + prop, + 0, + 100, + False, + False, + AnyPropertyType, + &actual_type, + &actual_format, + &nitems, + &bytes_after, + &values); + if (success == Success && actual_type == XA_ATOM && actual_format == 32 && + nitems == 1) { Atom value = reinterpret_cast<Atom*>(values)[0]; if (full_aspect_atom == value) ret = true; diff --git a/chromeos/display/real_output_configurator_delegate.h b/chromeos/display/native_display_delegate_x11.h index 7c7d62b..fbce154 100644 --- a/chromeos/display/real_output_configurator_delegate.h +++ b/chromeos/display/native_display_delegate_x11.h @@ -1,9 +1,9 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_DISPLAY_REAL_OUTPUT_CONFIGURATOR_DELEGATE_H_ -#define CHROMEOS_DISPLAY_REAL_OUTPUT_CONFIGURATOR_DELEGATE_H_ +#ifndef CHROMEOS_DISPLAY_NATIVE_DISPLAY_DELEGATE_X11_H_ +#define CHROMEOS_DISPLAY_NATIVE_DISPLAY_DELEGATE_X11_H_ #include <vector> @@ -22,15 +22,16 @@ typedef _XRRScreenResources XRRScreenResources; namespace chromeos { -class RealOutputConfiguratorDelegate : public OutputConfigurator::Delegate { +class NativeDisplayDelegateX11 + : public OutputConfigurator::NativeDisplayDelegate { public: - RealOutputConfiguratorDelegate(); - virtual ~RealOutputConfiguratorDelegate(); + NativeDisplayDelegateX11(); + virtual ~NativeDisplayDelegateX11(); // OutputConfigurator::Delegate overrides: virtual void InitXRandRExtension(int* event_base) OVERRIDE; - virtual void UpdateXRandRConfiguration( - const base::NativeEvent& event) OVERRIDE; + virtual void UpdateXRandRConfiguration(const base::NativeEvent& event) + OVERRIDE; virtual void GrabServer() OVERRIDE; virtual void UngrabServer() OVERRIDE; virtual void SyncWithServer() OVERRIDE; @@ -38,17 +39,15 @@ class RealOutputConfiguratorDelegate : public OutputConfigurator::Delegate { virtual void ForceDPMSOn() OVERRIDE; virtual std::vector<OutputConfigurator::OutputSnapshot> GetOutputs() OVERRIDE; virtual void AddOutputMode(RROutput output, RRMode mode) OVERRIDE; - virtual bool ConfigureCrtc( - RRCrtc crtc, - RRMode mode, - RROutput output, - int x, - int y) OVERRIDE; + virtual bool ConfigureCrtc(RRCrtc crtc, + RRMode mode, + RROutput output, + int x, + int y) OVERRIDE; virtual void CreateFrameBuffer( int width, int height, const std::vector<OutputConfigurator::OutputSnapshot>& outputs) OVERRIDE; - virtual void SendProjectingStateToPowerManager(bool projecting) OVERRIDE; virtual bool GetHDCPState(RROutput id, HDCPState* state) OVERRIDE; virtual bool SetHDCPState(RROutput id, HDCPState state) OVERRIDE; @@ -60,11 +59,10 @@ class RealOutputConfiguratorDelegate : public OutputConfigurator::Delegate { // Helper method for GetOutputs() that returns an OutputSnapshot struct based // on the passed-in information. Further initialization is required (e.g. // |selected_mode|, |mirror_mode|, and |touch_device_id|). - OutputConfigurator::OutputSnapshot InitOutputSnapshot( - RROutput id, - XRROutputInfo* info, - RRCrtc* last_used_crtc, - int index); + OutputConfigurator::OutputSnapshot InitOutputSnapshot(RROutput id, + XRROutputInfo* info, + RRCrtc* last_used_crtc, + int index); // Destroys unused CRTCs and parks used CRTCs in a way which allows a // framebuffer resize. This is faster than turning them off, resizing, @@ -81,9 +79,9 @@ class RealOutputConfiguratorDelegate : public OutputConfigurator::Delegate { // Initialized when the server is grabbed and freed when it's ungrabbed. XRRScreenResources* screen_; - DISALLOW_COPY_AND_ASSIGN(RealOutputConfiguratorDelegate); + DISALLOW_COPY_AND_ASSIGN(NativeDisplayDelegateX11); }; } // namespace chromeos -#endif // CHROMEOS_DISPLAY_REAL_OUTPUT_CONFIGURATOR_DELEGATE_H_ +#endif // CHROMEOS_DISPLAY_NATIVE_DISPLAY_DELEGATE_X11_H_ diff --git a/chromeos/display/output_configurator.cc b/chromeos/display/output_configurator.cc index 327d243..22b9fb3 100644 --- a/chromeos/display/output_configurator.cc +++ b/chromeos/display/output_configurator.cc @@ -14,8 +14,8 @@ #include "base/strings/stringprintf.h" #include "base/sys_info.h" #include "base/time/time.h" +#include "chromeos/display/native_display_delegate_x11.h" #include "chromeos/display/output_util.h" -#include "chromeos/display/real_output_configurator_delegate.h" #include "chromeos/display/touchscreen_delegate_x11.h" namespace chromeos { @@ -239,14 +239,13 @@ OutputConfigurator::OutputConfigurator() xrandr_event_base_(0), output_state_(STATE_INVALID), power_state_(DISPLAY_POWER_ALL_ON), - next_output_protection_client_id_(1), - casting_session_count_(0) { -} + next_output_protection_client_id_(1) {} OutputConfigurator::~OutputConfigurator() {} -void OutputConfigurator::SetDelegateForTesting(scoped_ptr<Delegate> delegate) { - delegate_ = delegate.Pass(); +void OutputConfigurator::SetNativeDisplayDelegateForTesting( + scoped_ptr<NativeDisplayDelegate> delegate) { + native_display_delegate_ = delegate.Pass(); configure_display_ = true; } @@ -265,8 +264,8 @@ void OutputConfigurator::Init(bool is_panel_fitting_enabled) { if (!configure_display_) return; - if (!delegate_) - delegate_.reset(new RealOutputConfiguratorDelegate()); + if (!native_display_delegate_) + native_display_delegate_.reset(new NativeDisplayDelegateX11()); if (!touchscreen_delegate_) touchscreen_delegate_.reset(new TouchscreenDelegateX11()); @@ -276,21 +275,20 @@ void OutputConfigurator::Start(uint32 background_color_argb) { if (!configure_display_) return; - delegate_->GrabServer(); - delegate_->InitXRandRExtension(&xrandr_event_base_); + native_display_delegate_->GrabServer(); + native_display_delegate_->InitXRandRExtension(&xrandr_event_base_); UpdateCachedOutputs(); if (cached_outputs_.size() > 1 && background_color_argb) - delegate_->SetBackgroundColor(background_color_argb); + native_display_delegate_->SetBackgroundColor(background_color_argb); const OutputState new_state = ChooseOutputState(power_state_); const bool success = EnterStateOrFallBackToSoftwareMirroring( new_state, power_state_); // Force the DPMS on chrome startup as the driver doesn't always detect // that all displays are on when signing out. - delegate_->ForceDPMSOn(); - delegate_->UngrabServer(); - SendProjectingStateToPowerManager(); + native_display_delegate_->ForceDPMSOn(); + native_display_delegate_->UngrabServer(); NotifyObservers(success, new_state); } @@ -313,7 +311,7 @@ bool OutputConfigurator::ApplyProtections(const DisplayProtections& requests) { HDCPState new_desired_state = (all_desired & OUTPUT_PROTECTION_METHOD_HDCP) ? HDCP_STATE_DESIRED : HDCP_STATE_UNDESIRED; - if (!delegate_->SetHDCPState(this_id, new_desired_state)) + if (!native_display_delegate_->SetHDCPState(this_id, new_desired_state)) return false; break; } @@ -331,22 +329,6 @@ bool OutputConfigurator::ApplyProtections(const DisplayProtections& requests) { return true; } -void OutputConfigurator::SendProjectingStateToPowerManager() { - bool has_internal_output = false; - int connected_output_count = cached_outputs_.size() + casting_session_count_; - for (size_t i = 0; i < cached_outputs_.size(); ++i) { - if (cached_outputs_[i].type == OUTPUT_TYPE_INTERNAL) { - has_internal_output = true; - break; - } - } - - // "Projecting" is defined as having more than 1 output connected while at - // least one of them is an internal output. - bool is_projecting = has_internal_output && (connected_output_count > 1); - delegate_->SendProjectingStateToPowerManager(is_projecting); -} - OutputConfigurator::OutputProtectionClientId OutputConfigurator::RegisterOutputProtectionClient() { if (!configure_display_) @@ -398,7 +380,7 @@ bool OutputConfigurator::QueryOutputProtectionStatus( case OUTPUT_TYPE_DVI: case OUTPUT_TYPE_HDMI: { HDCPState state; - if (!delegate_->GetHDCPState(this_id, &state)) + if (!native_display_delegate_->GetHDCPState(this_id, &state)) return false; if (state == HDCP_STATE_ENABLED) enabled |= OUTPUT_PROTECTION_METHOD_HDCP; @@ -485,7 +467,7 @@ bool OutputConfigurator::SetDisplayPower(DisplayPowerState power_state, if (power_state == power_state_ && !(flags & kSetDisplayPowerForceProbe)) return true; - delegate_->GrabServer(); + native_display_delegate_->GrabServer(); UpdateCachedOutputs(); const OutputState new_state = ChooseOutputState(power_state); @@ -504,10 +486,10 @@ bool OutputConfigurator::SetDisplayPower(DisplayPowerState power_state, // Force the DPMS on since the driver doesn't always detect that it // should turn on. This is needed when coming back from idle suspend. if (success && power_state != DISPLAY_POWER_ALL_OFF) - delegate_->ForceDPMSOn(); + native_display_delegate_->ForceDPMSOn(); } - delegate_->UngrabServer(); + native_display_delegate_->UngrabServer(); if (attempted_change) NotifyObservers(success, new_state); return true; @@ -527,11 +509,11 @@ bool OutputConfigurator::SetDisplayMode(OutputState new_state) { return true; } - delegate_->GrabServer(); + native_display_delegate_->GrabServer(); UpdateCachedOutputs(); const bool success = EnterStateOrFallBackToSoftwareMirroring( new_state, power_state_); - delegate_->UngrabServer(); + native_display_delegate_->UngrabServer(); NotifyObservers(success, new_state); return success; @@ -543,7 +525,7 @@ uint32_t OutputConfigurator::Dispatch(const base::NativeEvent& event) { if (event->type - xrandr_event_base_ == RRScreenChangeNotify) { VLOG(1) << "Received RRScreenChangeNotify event"; - delegate_->UpdateXRandRConfiguration(event); + native_display_delegate_->UpdateXRandRConfiguration(event); return POST_DISPATCH_PERFORM_DEFAULT; } @@ -611,18 +593,6 @@ base::EventStatus OutputConfigurator::WillProcessEvent( void OutputConfigurator::DidProcessEvent(const base::NativeEvent& event) { } -void OutputConfigurator::OnCastingSessionStartedOrStopped(bool started) { - if (started) { - ++casting_session_count_; - } else { - DCHECK_GT(casting_session_count_, 0); - --casting_session_count_; - if (casting_session_count_ < 0) - casting_session_count_ = 0; - } - SendProjectingStateToPowerManager(); -} - void OutputConfigurator::AddObserver(Observer* observer) { observers_.AddObserver(observer); } @@ -644,7 +614,7 @@ void OutputConfigurator::SuspendDisplays() { // We need to make sure that the monitor configuration we just did actually // completes before we return, because otherwise the X message could be // racing with the HandleSuspendReadiness message. - delegate_->SyncWithServer(); + native_display_delegate_->SyncWithServer(); } } @@ -668,7 +638,7 @@ void OutputConfigurator::ScheduleConfigureOutputs() { } void OutputConfigurator::UpdateCachedOutputs() { - cached_outputs_ = delegate_->GetOutputs(); + cached_outputs_ = native_display_delegate_->GetOutputs(); touchscreen_delegate_->AssociateTouchscreens(&cached_outputs_); // Set |selected_mode| fields. @@ -779,7 +749,7 @@ bool OutputConfigurator::FindMirrorMode(OutputSnapshot* internal_output, !external_info.interlaced; if (can_fit) { RRMode mode = external_it->first; - delegate_->AddOutputMode(internal_output->output, mode); + native_display_delegate_->AddOutputMode(internal_output->output, mode); internal_output->mode_infos.insert(std::make_pair(mode, external_info)); internal_output->mirror_mode = mode; external_output->mirror_mode = mode; @@ -794,15 +764,14 @@ bool OutputConfigurator::FindMirrorMode(OutputSnapshot* internal_output, void OutputConfigurator::ConfigureOutputs() { configure_timer_.reset(); - delegate_->GrabServer(); + native_display_delegate_->GrabServer(); UpdateCachedOutputs(); const OutputState new_state = ChooseOutputState(power_state_); const bool success = EnterStateOrFallBackToSoftwareMirroring( new_state, power_state_); - delegate_->UngrabServer(); + native_display_delegate_->UngrabServer(); NotifyObservers(success, new_state); - SendProjectingStateToPowerManager(); } void OutputConfigurator::NotifyObservers(bool success, @@ -968,14 +937,17 @@ bool OutputConfigurator::EnterState( DCHECK_EQ(cached_outputs_.size(), updated_outputs.size()); bool all_succeeded = true; if (!updated_outputs.empty()) { - delegate_->CreateFrameBuffer(width, height, updated_outputs); + native_display_delegate_->CreateFrameBuffer(width, height, updated_outputs); for (size_t i = 0; i < updated_outputs.size(); ++i) { const OutputSnapshot& output = updated_outputs[i]; bool configure_succeeded =false; while (true) { - if (delegate_->ConfigureCrtc(output.crtc, output.current_mode, - output.output, output.x, output.y)) { + if (native_display_delegate_->ConfigureCrtc(output.crtc, + output.current_mode, + output.output, + output.x, + output.y)) { configure_succeeded = true; break; } diff --git a/chromeos/display/output_configurator.h b/chromeos/display/output_configurator.h index cee949e..7432171 100644 --- a/chromeos/display/output_configurator.h +++ b/chromeos/display/output_configurator.h @@ -189,10 +189,11 @@ class CHROMEOS_EXPORT OutputConfigurator virtual void SetSoftwareMirroring(bool enabled) = 0; }; - // Interface for classes that perform actions on behalf of OutputController. - class Delegate { + // Interface for classes that perform display configuration actions on behalf + // of OutputConfigurator. + class NativeDisplayDelegate { public: - virtual ~Delegate() {} + virtual ~NativeDisplayDelegate() {} // Initializes the XRandR extension, saving the base event ID to // |event_base|. @@ -243,10 +244,6 @@ class CHROMEOS_EXPORT OutputConfigurator int height, const std::vector<OutputConfigurator::OutputSnapshot>& outputs) = 0; - // Sends a D-Bus message to the power manager telling it that the - // machine is or is not projecting. - virtual void SendProjectingStateToPowerManager(bool projecting) = 0; - // Gets HDCP state of output. virtual bool GetHDCPState(RROutput id, HDCPState* state) = 0; @@ -349,9 +346,10 @@ class CHROMEOS_EXPORT OutputConfigurator mirroring_controller_ = controller; } - // Replaces |delegate_| with |delegate| and sets |configure_display_| to - // true. Should be called before Init(). - void SetDelegateForTesting(scoped_ptr<Delegate> delegate); + // Replaces |native_display_delegate_| with |delegate| and sets + // |configure_display_| to true. Should be called before Init(). + void SetNativeDisplayDelegateForTesting( + scoped_ptr<NativeDisplayDelegate> delegate); void SetTouchscreenDelegateForTesting( scoped_ptr<TouchscreenDelegate> delegate); @@ -395,9 +393,6 @@ class CHROMEOS_EXPORT OutputConfigurator const base::NativeEvent& event) OVERRIDE; virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE; - // Called when a casting session is started or stopped. - void OnCastingSessionStartedOrStopped(bool started); - void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); @@ -522,12 +517,9 @@ class CHROMEOS_EXPORT OutputConfigurator // Applies output protections according to requests. bool ApplyProtections(const DisplayProtections& requests); - // Sends the current projecting state to power manager. - void SendProjectingStateToPowerManager(); - StateController* state_controller_; SoftwareMirroringController* mirroring_controller_; - scoped_ptr<Delegate> delegate_; + scoped_ptr<NativeDisplayDelegate> native_display_delegate_; scoped_ptr<TouchscreenDelegate> touchscreen_delegate_; // Used to enable modes which rely on panel fitting. @@ -574,9 +566,6 @@ class CHROMEOS_EXPORT OutputConfigurator // Output protection requests of each client. ProtectionRequests client_protection_requests_; - // Number of outstanding casting sessions. - int casting_session_count_; - DISALLOW_COPY_AND_ASSIGN(OutputConfigurator); }; diff --git a/chromeos/display/output_configurator_unittest.cc b/chromeos/display/output_configurator_unittest.cc index fd62430..3b53fd9 100644 --- a/chromeos/display/output_configurator_unittest.cc +++ b/chromeos/display/output_configurator_unittest.cc @@ -20,32 +20,33 @@ namespace chromeos { namespace { -// Strings returned by TestDelegate::GetActionsAndClear() to describe various -// actions that were performed. +// Strings returned by TestNativeDisplayDelegate::GetActionsAndClear() to +// describe various actions that were performed. const char kInitXRandR[] = "init"; const char kUpdateXRandR[] = "update"; const char kGrab[] = "grab"; const char kUngrab[] = "ungrab"; const char kSync[] = "sync"; const char kForceDPMS[] = "dpms"; -const char kProjectingOn[] = "projecting"; -const char kProjectingOff[] = "not_projecting"; -// String returned by TestDelegate::GetActionsAndClear() if no actions were -// requested. +// String returned by TestNativeDisplayDelegate::GetActionsAndClear() if no +// actions were requested. const char kNoActions[] = ""; -// Returns a string describing a TestDelegate::SetBackgroundColor() call. +// Returns a string describing a TestNativeDisplayDelegate::SetBackgroundColor() +// call. std::string GetBackgroundAction(uint32 color_argb) { return base::StringPrintf("background(0x%x)", color_argb); } -// Returns a string describing a TestDelegate::AddOutputMode() call. +// Returns a string describing a TestNativeDisplayDelegate::AddOutputMode() +// call. std::string GetAddOutputModeAction(RROutput output, RRMode mode) { return base::StringPrintf("add_mode(output=%lu,mode=%lu)", output, mode); } -// Returns a string describing a TestDelegate::ConfigureCrtc() call. +// Returns a string describing a TestNativeDisplayDelegate::ConfigureCrtc() +// call. std::string GetCrtcAction(RRCrtc crtc, int x, int y, @@ -55,7 +56,8 @@ std::string GetCrtcAction(RRCrtc crtc, crtc, x, y, mode, output); } -// Returns a string describing a TestDelegate::CreateFramebuffer() call. +// Returns a string describing a TestNativeDisplayDelegate::CreateFramebuffer() +// call. std::string GetFramebufferAction(int width, int height, RRCrtc crtc1, @@ -65,7 +67,7 @@ std::string GetFramebufferAction(int width, width, height, crtc1, crtc2); } -// Returns a string describing a TestDelegate::ConfigureCTM() call. +// Returns a string describing a TestNativeDisplayDelegate::ConfigureCTM() call. std::string GetCTMAction( int device_id, const OutputConfigurator::CoordinateTransformation& ctm) { @@ -73,14 +75,14 @@ std::string GetCTMAction( ctm.x_scale, ctm.x_offset, ctm.y_scale, ctm.y_offset); } -// Returns a string describing a TestDelegate::SetHDCPState() call. +// Returns a string describing a TestNativeDisplayDelegate::SetHDCPState() call. std::string GetSetHDCPStateAction(RROutput id, HDCPState state) { return base::StringPrintf("set_hdcp(id=%lu,state=%d)", id, state); } // Joins a sequence of strings describing actions (e.g. kScreenDim) such // that they can be compared against a string returned by -// TestDelegate::GetActionsAndClear(). The list of actions must be +// ActionLogger::GetActionsAndClear(). The list of actions must be // terminated by a NULL pointer. std::string JoinActions(const char* action, ...) { std::string actions; @@ -152,16 +154,17 @@ class TestTouchscreenDelegate : public OutputConfigurator::TouchscreenDelegate { DISALLOW_COPY_AND_ASSIGN(TestTouchscreenDelegate); }; -class TestDelegate : public OutputConfigurator::Delegate { +class TestNativeDisplayDelegate + : public OutputConfigurator::NativeDisplayDelegate { public: static const int kXRandREventBase = 10; // Ownership of |log| remains with the caller. - explicit TestDelegate(ActionLogger* log) + explicit TestNativeDisplayDelegate(ActionLogger* log) : max_configurable_pixels_(0), hdcp_state_(HDCP_STATE_UNDESIRED), log_(log) {} - virtual ~TestDelegate() {} + virtual ~TestNativeDisplayDelegate() {} const std::vector<OutputConfigurator::OutputSnapshot>& outputs() const { return outputs_; @@ -232,10 +235,6 @@ class TestDelegate : public OutputConfigurator::Delegate { outputs.size() >= 1 ? outputs[0].crtc : 0, outputs.size() >= 2 ? outputs[1].crtc : 0)); } - virtual void SendProjectingStateToPowerManager(bool projecting) OVERRIDE { - log_->AppendAction(projecting ? kProjectingOn : kProjectingOff); - } - virtual bool GetHDCPState(RROutput id, HDCPState* state) OVERRIDE { *state = hdcp_state_; return true; @@ -271,7 +270,7 @@ class TestDelegate : public OutputConfigurator::Delegate { ActionLogger* log_; // Not owned. - DISALLOW_COPY_AND_ASSIGN(TestDelegate); + DISALLOW_COPY_AND_ASSIGN(TestNativeDisplayDelegate); }; class TestObserver : public OutputConfigurator::Observer { @@ -383,15 +382,17 @@ class OutputConfiguratorTest : public testing::Test { OutputConfiguratorTest() : observer_(&configurator_), - test_api_(&configurator_, TestDelegate::kXRandREventBase) {} + test_api_(&configurator_, TestNativeDisplayDelegate::kXRandREventBase) { + } virtual ~OutputConfiguratorTest() {} virtual void SetUp() OVERRIDE { log_.reset(new ActionLogger()); - delegate_ = new TestDelegate(log_.get()); - configurator_.SetDelegateForTesting( - scoped_ptr<OutputConfigurator::Delegate>(delegate_)); + native_display_delegate_ = new TestNativeDisplayDelegate(log_.get()); + configurator_.SetNativeDisplayDelegateForTesting( + scoped_ptr<OutputConfigurator::NativeDisplayDelegate>( + native_display_delegate_)); touchscreen_delegate_ = new TestTouchscreenDelegate(log_.get()); configurator_.SetTouchscreenDelegateForTesting( @@ -438,7 +439,8 @@ class OutputConfiguratorTest : public testing::Test { } protected: - // Configures |delegate_| to return the first |num_outputs| entries from + // Configures |native_display_delegate_| to return the first |num_outputs| + // entries from // |outputs_|. If |send_events| is true, also sends screen-change and // output-change events to |configurator_| and triggers the configure // timeout if one was scheduled. @@ -447,7 +449,7 @@ class OutputConfiguratorTest : public testing::Test { std::vector<OutputConfigurator::OutputSnapshot> outputs; for (size_t i = 0; i < num_outputs; ++i) outputs.push_back(outputs_[i]); - delegate_->set_outputs(outputs); + native_display_delegate_->set_outputs(outputs); if (send_events) { test_api_.SendScreenChangeEvent(); @@ -479,7 +481,6 @@ class OutputConfiguratorTest : public testing::Test { .c_str(), kForceDPMS, kUngrab, - kProjectingOff, NULL), log_->GetActionsAndClear()); } @@ -490,7 +491,7 @@ class OutputConfiguratorTest : public testing::Test { OutputConfigurator configurator_; TestObserver observer_; scoped_ptr<ActionLogger> log_; - TestDelegate* delegate_; // not owned + TestNativeDisplayDelegate* native_display_delegate_; // not owned TestTouchscreenDelegate* touchscreen_delegate_; // not owned OutputConfigurator::TestApi test_api_; @@ -595,7 +596,6 @@ TEST_F(OutputConfiguratorTest, ConnectSecondOutput) { kBigModeId, outputs_[1].output).c_str(), kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); @@ -632,7 +632,6 @@ TEST_F(OutputConfiguratorTest, ConnectSecondOutput) { GetCrtcAction( outputs_[0].crtc, 0, 0, kSmallModeId, outputs_[0].output).c_str(), kUngrab, - kProjectingOff, NULL), log_->GetActionsAndClear()); EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); @@ -657,7 +656,6 @@ TEST_F(OutputConfiguratorTest, ConnectSecondOutput) { kBigModeId, outputs_[1].output).c_str(), kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); @@ -696,7 +694,6 @@ TEST_F(OutputConfiguratorTest, ConnectSecondOutput) { GetCrtcAction( outputs_[0].crtc, 0, 0, kSmallModeId, outputs_[0].output).c_str(), kUngrab, - kProjectingOff, NULL), log_->GetActionsAndClear()); EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); @@ -722,7 +719,6 @@ TEST_F(OutputConfiguratorTest, SetDisplayPower) { GetCrtcAction( outputs_[1].crtc, 0, 0, kSmallModeId, outputs_[1].output).c_str(), kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); @@ -815,7 +811,6 @@ TEST_F(OutputConfiguratorTest, SetDisplayPower) { kBigModeId, outputs_[1].output).c_str(), kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); @@ -894,53 +889,6 @@ TEST_F(OutputConfiguratorTest, SetDisplayPower) { EXPECT_EQ(1, observer_.num_changes()); } -TEST_F(OutputConfiguratorTest, Casting) { - InitWithSingleOutput(); - - // Notify configurator that casting session is started. - configurator_.OnCastingSessionStartedOrStopped(true); - EXPECT_EQ(kProjectingOn, log_->GetActionsAndClear()); - - // Verify that the configurator keeps a count of active casting sessions - // instead of treating it as a single global state. - configurator_.OnCastingSessionStartedOrStopped(true); - EXPECT_EQ(kProjectingOn, log_->GetActionsAndClear()); - configurator_.OnCastingSessionStartedOrStopped(false); - EXPECT_EQ(kProjectingOn, log_->GetActionsAndClear()); - - // Turn all displays off and check that projecting is not turned off. - configurator_.SetDisplayPower(DISPLAY_POWER_ALL_OFF, - OutputConfigurator::kSetDisplayPowerNoFlags); - EXPECT_EQ( - JoinActions( - kGrab, - GetFramebufferAction( - kSmallModeWidth, kSmallModeHeight, outputs_[0].crtc, 0).c_str(), - GetCrtcAction(outputs_[0].crtc, 0, 0, 0, outputs_[0].output).c_str(), - kUngrab, - NULL), - log_->GetActionsAndClear()); - - // Turn all displays back on. - configurator_.SetDisplayPower(DISPLAY_POWER_ALL_ON, - OutputConfigurator::kSetDisplayPowerNoFlags); - EXPECT_EQ( - JoinActions( - kGrab, - GetFramebufferAction( - kSmallModeWidth, kSmallModeHeight, outputs_[0].crtc, 0).c_str(), - GetCrtcAction( - outputs_[0].crtc, 0, 0, kSmallModeId, outputs_[0].output).c_str(), - kForceDPMS, - kUngrab, - NULL), - log_->GetActionsAndClear()); - - // Notify configurator that casting session is ended. - configurator_.OnCastingSessionStartedOrStopped(false); - EXPECT_EQ(kProjectingOff, log_->GetActionsAndClear()); -} - TEST_F(OutputConfiguratorTest, SuspendAndResume) { InitWithSingleOutput(); @@ -1020,7 +968,6 @@ TEST_F(OutputConfiguratorTest, SuspendAndResume) { GetCrtcAction( outputs_[1].crtc, 0, 0, kSmallModeId, outputs_[1].output).c_str(), kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); @@ -1064,8 +1011,7 @@ TEST_F(OutputConfiguratorTest, Headless) { configurator_.Init(false); EXPECT_EQ(kNoActions, log_->GetActionsAndClear()); configurator_.Start(0); - EXPECT_EQ(JoinActions( - kGrab, kInitXRandR, kForceDPMS, kUngrab, kProjectingOff, NULL), + EXPECT_EQ(JoinActions(kGrab, kInitXRandR, kForceDPMS, kUngrab, NULL), log_->GetActionsAndClear()); // Not much should happen when the display power state is changed while @@ -1090,7 +1036,6 @@ TEST_F(OutputConfiguratorTest, Headless) { GetCrtcAction(outputs_[0].crtc, 0, 0, kBigModeId, outputs_[0].output) .c_str(), kUngrab, - kProjectingOff, NULL), log_->GetActionsAndClear()); } @@ -1117,7 +1062,6 @@ TEST_F(OutputConfiguratorTest, StartWithTwoOutputs) { outputs_[1].crtc, 0, 0, kSmallModeId, outputs_[1].output).c_str(), kForceDPMS, kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); } @@ -1208,7 +1152,6 @@ TEST_F(OutputConfiguratorTest, AvoidUnnecessaryProbes) { GetCrtcAction( outputs_[1].crtc, 0, 0, kSmallModeId, outputs_[1].output).c_str(), kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); @@ -1229,7 +1172,6 @@ TEST_F(OutputConfiguratorTest, AvoidUnnecessaryProbes) { GetCrtcAction( outputs_[1].crtc, 0, 0, kSmallModeId, outputs_[1].output).c_str(), kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); @@ -1244,7 +1186,6 @@ TEST_F(OutputConfiguratorTest, AvoidUnnecessaryProbes) { GetCrtcAction( outputs_[0].crtc, 0, 0, kSmallModeId, outputs_[0].output).c_str(), kUngrab, - kProjectingOff, NULL), log_->GetActionsAndClear()); @@ -1257,7 +1198,7 @@ TEST_F(OutputConfiguratorTest, AvoidUnnecessaryProbes) { // Lower the limit for which the delegate will succeed, which should result // in the second output sticking with its native mode. - delegate_->set_max_configurable_pixels(1); + native_display_delegate_->set_max_configurable_pixels(1); UpdateOutputs(2, true); EXPECT_EQ( JoinActions( @@ -1289,13 +1230,12 @@ TEST_F(OutputConfiguratorTest, AvoidUnnecessaryProbes) { kSmallModeId, outputs_[1].output).c_str(), kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); // A change event reporting a mode change on the second output should // trigger another reconfigure. - delegate_->set_max_configurable_pixels(0); + native_display_delegate_->set_max_configurable_pixels(0); test_api_.SendOutputChangeEvent( outputs_[1].output, outputs_[1].crtc, outputs_[1].mirror_mode, true); EXPECT_TRUE(test_api_.TriggerConfigureTimeout()); @@ -1311,7 +1251,6 @@ TEST_F(OutputConfiguratorTest, AvoidUnnecessaryProbes) { GetCrtcAction( outputs_[1].crtc, 0, 0, kSmallModeId, outputs_[1].output).c_str(), kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); } @@ -1370,7 +1309,6 @@ TEST_F(OutputConfiguratorTest, PanelFitting) { outputs_[1].crtc, 0, 0, kSmallModeId, outputs_[1].output).c_str(), kForceDPMS, kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); @@ -1435,7 +1373,7 @@ TEST_F(OutputConfiguratorTest, OutputProtection) { log_->GetActionsAndClear()); // Enable protection. - delegate_->set_hdcp_state(HDCP_STATE_ENABLED); + native_display_delegate_->set_hdcp_state(HDCP_STATE_ENABLED); EXPECT_TRUE(configurator_.QueryOutputProtectionStatus(id, outputs_[1].display_id, &link_mask, @@ -1471,7 +1409,7 @@ TEST_F(OutputConfiguratorTest, OutputProtectionTwoClients) { EXPECT_EQ( GetSetHDCPStateAction(outputs_[1].output, HDCP_STATE_DESIRED).c_str(), log_->GetActionsAndClear()); - delegate_->set_hdcp_state(HDCP_STATE_ENABLED); + native_display_delegate_->set_hdcp_state(HDCP_STATE_ENABLED); uint32_t link_mask = 0; uint32_t protection_mask = 0; @@ -1572,7 +1510,7 @@ TEST_F(OutputConfiguratorTest, HandleConfigureCrtcFailure) { // First test simply fails in STATE_SINGLE mode. This is probably // unrealistic but the want to make sure any assumptions don't // creep in. - delegate_->set_max_configurable_pixels( + native_display_delegate_->set_max_configurable_pixels( outputs_[0].mode_infos[kFirstMode + 2].width * outputs_[0].mode_infos[kFirstMode + 2].height); state_controller_.set_state(STATE_SINGLE); @@ -1592,13 +1530,12 @@ TEST_F(OutputConfiguratorTest, HandleConfigureCrtcFailure) { outputs_[0].crtc, 0, 0, kFirstMode + 2, outputs_[0].output) .c_str(), kUngrab, - kProjectingOff, NULL), log_->GetActionsAndClear()); // This test should attempt to configure a mirror mode that will not succeed // and should end up in extended mode. - delegate_->set_max_configurable_pixels( + native_display_delegate_->set_max_configurable_pixels( outputs_[0].mode_infos[kFirstMode + 3].width * outputs_[0].mode_infos[kFirstMode + 3].height); state_controller_.set_state(STATE_DUAL_MIRROR); @@ -1653,7 +1590,6 @@ TEST_F(OutputConfiguratorTest, HandleConfigureCrtcFailure) { kFirstMode + 3, outputs_[1].output).c_str(), kUngrab, - kProjectingOn, NULL), log_->GetActionsAndClear()); } |