diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn index 55f6d0d2145f3e..9121907f7ad509 100644 --- a/chromecast/browser/BUILD.gn +++ b/chromecast/browser/BUILD.gn @@ -309,8 +309,6 @@ cast_source_set("browser_base") { "cast_content_window_aura.cc", "cast_content_window_aura.h", "cast_web_service_aura.cc", - "display_configurator_observer.cc", - "display_configurator_observer.h", ] deps += [ diff --git a/chromecast/browser/cast_browser_main_parts.cc b/chromecast/browser/cast_browser_main_parts.cc index b45428bb6d8cf5..f7f5e76e2e367e 100644 --- a/chromecast/browser/cast_browser_main_parts.cc +++ b/chromecast/browser/cast_browser_main_parts.cc @@ -616,9 +616,6 @@ int CastBrowserMainParts::PreMainMessageLoopRun() { std::make_unique(window_manager_.get()); } - display_change_observer_ = std::make_unique( - cast_browser_process_->display_configurator(), window_manager_.get()); - #if BUILDFLAG(ENABLE_CHROMECAST_EXTENSIONS) cast_browser_process_->SetAccessibilityManager( std::make_unique(window_manager_.get())); diff --git a/chromecast/browser/cast_browser_main_parts.h b/chromecast/browser/cast_browser_main_parts.h index dd51c863053638..e4b7be644e7552 100644 --- a/chromecast/browser/cast_browser_main_parts.h +++ b/chromecast/browser/cast_browser_main_parts.h @@ -12,7 +12,6 @@ #include "base/util/memory_pressure/multi_source_memory_pressure_monitor.h" #include "build/build_config.h" #include "build/buildflag.h" -#include "chromecast/browser/display_configurator_observer.h" #include "chromecast/chromecast_buildflags.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_main_parts.h" @@ -106,7 +105,6 @@ class CastBrowserMainParts : public content::BrowserMainParts { std::unique_ptr cast_screen_; std::unique_ptr window_manager_; std::unique_ptr rounded_window_corners_manager_; - std::unique_ptr display_change_observer_; #else std::unique_ptr window_manager_; #endif // defined(USE_AURA) diff --git a/chromecast/browser/cast_display_configurator.cc b/chromecast/browser/cast_display_configurator.cc index 5eefbfad52f794..bfbaac873679c6 100644 --- a/chromecast/browser/cast_display_configurator.cc +++ b/chromecast/browser/cast_display_configurator.cc @@ -141,7 +141,6 @@ void CastDisplayConfigurator::EnableDisplay( config_request.push_back(std::move(display_config_params)); delegate_->Configure(config_request, std::move(callback)); - NotifyObservers(); } void CastDisplayConfigurator::DisableDisplay( @@ -168,7 +167,6 @@ void CastDisplayConfigurator::SetColorMatrix( if (!delegate_ || !display_) return; delegate_->SetColorMatrix(display_->display_id(), color_matrix); - NotifyObservers(); } void CastDisplayConfigurator::SetGammaCorrection( @@ -178,12 +176,6 @@ void CastDisplayConfigurator::SetGammaCorrection( return; delegate_->SetGammaCorrection(display_->display_id(), degamma_lut, gamma_lut); - NotifyObservers(); -} - -void CastDisplayConfigurator::NotifyObservers() { - for (Observer& observer : observers_) - observer.OnDisplayStateChanged(); } void CastDisplayConfigurator::ForceInitialConfigure() { @@ -273,13 +265,5 @@ void CastDisplayConfigurator::UpdateScreen( touch_device_manager_->OnDisplayConfigured(display_id, rotation, bounds); } -void CastDisplayConfigurator::AddObserver(Observer* observer) { - observers_.AddObserver(observer); -} - -void CastDisplayConfigurator::RemoveObserver(Observer* observer) { - observers_.RemoveObserver(observer); -} - } // namespace shell } // namespace chromecast diff --git a/chromecast/browser/cast_display_configurator.h b/chromecast/browser/cast_display_configurator.h index d9c679151d4779..0c45c3b330f3cb 100644 --- a/chromecast/browser/cast_display_configurator.h +++ b/chromecast/browser/cast_display_configurator.h @@ -11,7 +11,6 @@ #include "base/containers/flat_map.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "base/observer_list.h" #include "ui/display/display.h" #include "ui/display/types/display_configuration_params.h" #include "ui/display/types/native_display_delegate.h" @@ -41,12 +40,6 @@ class CastTouchDeviceManager; // doesn't really do anything when using OzonePlatformCast. class CastDisplayConfigurator : public display::NativeDisplayObserver { public: - class Observer { - public: - virtual ~Observer() = default; - virtual void OnDisplayStateChanged() = 0; - }; - explicit CastDisplayConfigurator(CastScreen* screen); ~CastDisplayConfigurator() override; @@ -57,9 +50,6 @@ class CastDisplayConfigurator : public display::NativeDisplayObserver { void EnableDisplay(display::ConfigureCallback callback); void DisableDisplay(display::ConfigureCallback callback); - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - void ConfigureDisplayFromCommandLine(); void SetColorMatrix(const std::vector& color_matrix); void SetGammaCorrection( @@ -68,7 +58,6 @@ class CastDisplayConfigurator : public display::NativeDisplayObserver { private: void ForceInitialConfigure(); - void NotifyObservers(); void OnDisplaysAcquired( bool force_initial_configure, const std::vector& displays); @@ -81,8 +70,6 @@ class CastDisplayConfigurator : public display::NativeDisplayObserver { float device_scale_factor, display::Display::Rotation rotation); - base::ObserverList::Unchecked observers_; - std::unique_ptr delegate_; std::unique_ptr touch_device_manager_; display::DisplaySnapshot* display_; diff --git a/chromecast/browser/display_configurator_observer.cc b/chromecast/browser/display_configurator_observer.cc deleted file mode 100644 index caabcd3006d4ae..00000000000000 --- a/chromecast/browser/display_configurator_observer.cc +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 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 "display_configurator_observer.h" - -namespace chromecast { - -DisplayConfiguratorObserver::DisplayConfiguratorObserver( - chromecast::shell::CastDisplayConfigurator* display_configurator, - chromecast::CastWindowManagerAura* manager) - : display_configurator_(display_configurator), window_manager_(manager) { - display_configurator_->AddObserver(this); -} - -DisplayConfiguratorObserver::~DisplayConfiguratorObserver() { - display_configurator_->RemoveObserver(this); -} - -void DisplayConfiguratorObserver::OnDisplayStateChanged() { - window_manager_->GetRootWindow() - ->GetHost() - ->compositor() - ->ScheduleFullRedraw(); -} - -} // namespace chromecast \ No newline at end of file diff --git a/chromecast/browser/display_configurator_observer.h b/chromecast/browser/display_configurator_observer.h deleted file mode 100644 index 6f33bc197680eb..00000000000000 --- a/chromecast/browser/display_configurator_observer.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 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 CHROMECAST_BROWSER_DISPLAY_CONFIGURATOR_OBSERVER_H_ -#define CHROMECAST_BROWSER_DISPLAY_CONFIGURATOR_OBSERVER_H_ - -#include - -#include "chromecast/browser/cast_display_configurator.h" -#include "chromecast/graphics/cast_window_manager_aura.h" - -namespace chromecast { - -// Observer class that can respond to Display Configurator state changes. -// Forces a repaint to ensure content is refreshed post display configuration -// change. -class DisplayConfiguratorObserver - : public shell::CastDisplayConfigurator::Observer { - public: - DisplayConfiguratorObserver( - shell::CastDisplayConfigurator* display_configurator, - CastWindowManagerAura* manager); - - ~DisplayConfiguratorObserver() override; - - DisplayConfiguratorObserver(const DisplayConfiguratorObserver&) = delete; - - DisplayConfiguratorObserver& operator=(const DisplayConfiguratorObserver&) = - delete; - - // CastDisplayConfigurator::Observer - void OnDisplayStateChanged() override; - - private: - shell::CastDisplayConfigurator* display_configurator_; - CastWindowManagerAura* window_manager_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BROWSER_DISPLAY_CONFIGURATOR_OBSERVER_H_ diff --git a/chromecast/ui/display_settings/color_temperature_animation.cc b/chromecast/ui/display_settings/color_temperature_animation.cc index d7e4e0e3c00678..98784414264554 100644 --- a/chromecast/ui/display_settings/color_temperature_animation.cc +++ b/chromecast/ui/display_settings/color_temperature_animation.cc @@ -9,6 +9,10 @@ #include "base/numerics/ranges.h" #include "base/time/time.h" +#include "chromecast/graphics/cast_window_manager.h" +#include "ui/aura/window.h" +#include "ui/aura/window_tree_host.h" +#include "ui/compositor/compositor.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" #if defined(USE_AURA) @@ -35,16 +39,19 @@ float Interpolate(const std::vector& vec, float idx) { } // namespace ColorTemperatureAnimation::ColorTemperatureAnimation( + CastWindowManager* window_manager, shell::CastDisplayConfigurator* display_configurator, const DisplaySettingsManager::ColorTemperatureConfig& config) : gfx::LinearAnimation(kManualAnimationDuration, kAnimationFrameRate, nullptr), + window_manager_(window_manager), display_configurator_(display_configurator), config_(config), start_temperature_(config.neutral_temperature), current_temperature_(config.neutral_temperature), target_temperature_(config_.neutral_temperature) { + DCHECK(window_manager_); #if defined(USE_AURA) DCHECK(display_configurator_); #endif // defined(USE_AURA) @@ -116,6 +123,12 @@ void ColorTemperatureAnimation::ApplyValuesToDisplay() { std::vector color_matrix = {red_scale, 0, 0, 0, green_scale, 0, 0, 0, blue_scale}; display_configurator_->SetColorMatrix(color_matrix); + // The CTM is applied on the next swap buffers, so we need to make sure the + // root window triggers a swap buffer otherwise the content will not update. + window_manager_->GetRootWindow() + ->GetHost() + ->compositor() + ->ScheduleFullRedraw(); #endif // defined(USE_AURA) } } diff --git a/chromecast/ui/display_settings/color_temperature_animation.h b/chromecast/ui/display_settings/color_temperature_animation.h index 8d4aeb8d0a4221..f92d79794c31fe 100644 --- a/chromecast/ui/display_settings/color_temperature_animation.h +++ b/chromecast/ui/display_settings/color_temperature_animation.h @@ -13,6 +13,8 @@ namespace chromecast { +class CastWindowManager; + namespace shell { class CastDisplayConfigurator; } @@ -22,6 +24,7 @@ class CastDisplayConfigurator; class ColorTemperatureAnimation : public gfx::LinearAnimation { public: ColorTemperatureAnimation( + CastWindowManager* window_manager, shell::CastDisplayConfigurator* display_configurator, const DisplaySettingsManager::ColorTemperatureConfig& config); ColorTemperatureAnimation(const ColorTemperatureAnimation&) = delete; @@ -44,6 +47,7 @@ class ColorTemperatureAnimation : public gfx::LinearAnimation { void ApplyValuesToDisplay(); + CastWindowManager* const window_manager_; shell::CastDisplayConfigurator* const display_configurator_; const DisplaySettingsManager::ColorTemperatureConfig config_; diff --git a/chromecast/ui/display_settings/gamma_configurator.cc b/chromecast/ui/display_settings/gamma_configurator.cc index 639f48fee0e7e0..427eb22348a7fc 100644 --- a/chromecast/ui/display_settings/gamma_configurator.cc +++ b/chromecast/ui/display_settings/gamma_configurator.cc @@ -7,6 +7,10 @@ #include #include "chromecast/browser/cast_display_configurator.h" +#include "chromecast/graphics/cast_window_manager.h" +#include "ui/aura/window.h" +#include "ui/aura/window_tree_host.h" +#include "ui/compositor/compositor.h" namespace chromecast { namespace { @@ -41,8 +45,11 @@ std::vector InvertGammaLut( } // namespace GammaConfigurator::GammaConfigurator( + CastWindowManager* window_manager, shell::CastDisplayConfigurator* display_configurator) - : display_configurator_(display_configurator) { + : window_manager_(window_manager), + display_configurator_(display_configurator) { + DCHECK(window_manager_); DCHECK(display_configurator_); } @@ -62,6 +69,13 @@ void GammaConfigurator::ApplyGammaLut() { display_configurator_->SetGammaCorrection({}, InvertGammaLut(gamma_lut_)); else display_configurator_->SetGammaCorrection({}, gamma_lut_); + + // The LUT is applied on the next swap buffers, so we need to make sure the + // root window triggers a swap buffer otherwise the content will not update. + window_manager_->GetRootWindow() + ->GetHost() + ->compositor() + ->ScheduleFullRedraw(); } void GammaConfigurator::SetColorInversion(bool invert) { diff --git a/chromecast/ui/display_settings/gamma_configurator.h b/chromecast/ui/display_settings/gamma_configurator.h index 9b29bcd99bf698..dcf53f97178a23 100644 --- a/chromecast/ui/display_settings/gamma_configurator.h +++ b/chromecast/ui/display_settings/gamma_configurator.h @@ -11,14 +11,16 @@ namespace chromecast { +class CastWindowManager; + namespace shell { class CastDisplayConfigurator; } // namespace shell class GammaConfigurator { public: - explicit GammaConfigurator( - shell::CastDisplayConfigurator* display_configurator); + GammaConfigurator(CastWindowManager* window_manager, + shell::CastDisplayConfigurator* display_configurator); GammaConfigurator(const GammaConfigurator&) = delete; GammaConfigurator& operator=(const GammaConfigurator&) = delete; ~GammaConfigurator(); @@ -31,6 +33,7 @@ class GammaConfigurator { private: void ApplyGammaLut(); + CastWindowManager* const window_manager_; shell::CastDisplayConfigurator* display_configurator_; bool is_initialized_ = false; diff --git a/chromecast/ui/display_settings_manager_impl.cc b/chromecast/ui/display_settings_manager_impl.cc index b5a1d63a5c2207..156dd26ab4e584 100644 --- a/chromecast/ui/display_settings_manager_impl.cc +++ b/chromecast/ui/display_settings_manager_impl.cc @@ -17,6 +17,8 @@ #include "chromecast/browser/cast_browser_process.h" #include "chromecast/browser/cast_display_configurator.h" #include "chromecast/ui/display_settings/gamma_configurator.h" +#include "ui/aura/window.h" +#include "ui/aura/window_tree_host.h" #endif // defined(USE_AURA) namespace chromecast { @@ -40,13 +42,15 @@ DisplaySettingsManagerImpl::DisplaySettingsManagerImpl( display_configurator_( shell::CastBrowserProcess::GetInstance()->display_configurator()), gamma_configurator_( - std::make_unique(display_configurator_)), + std::make_unique(window_manager_, + display_configurator_)), #else display_configurator_(nullptr), #endif // defined(USE_AURA) brightness_(-1.0f), screen_power_controller_(ScreenPowerController::Create(this)), color_temperature_animation_(std::make_unique( + window_manager_, display_configurator_, color_temperature_config)), weak_factory_(this) { @@ -96,7 +100,9 @@ void DisplaySettingsManagerImpl::AddReceiver( void DisplaySettingsManagerImpl::SetScreenPowerOn(PowerToggleCallback callback) { #if defined(USE_AURA) - display_configurator_->EnableDisplay(std::move(callback)); + display_configurator_->EnableDisplay( + base::BindOnce(&DisplaySettingsManagerImpl::OnScreenEnabled, + weak_factory_.GetWeakPtr(), std::move(callback))); #endif // defined(USE_AURA) } @@ -190,4 +196,17 @@ void DisplaySettingsManagerImpl::UpdateBrightness(float brightness, brightness_animation_->AnimateToNewValue(brightness, duration); } +void DisplaySettingsManagerImpl::OnScreenEnabled(PowerToggleCallback callback, + bool status) { +#if defined(USE_AURA) + // Force a swap buffers otherwise we might be stuck showing the modeset + // buffer. + window_manager_->GetRootWindow() + ->GetHost() + ->compositor() + ->ScheduleFullRedraw(); +#endif // defined(USE_AURA) + std::move(callback).Run(status); +} + } // namespace chromecast diff --git a/chromecast/ui/display_settings_manager_impl.h b/chromecast/ui/display_settings_manager_impl.h index ec0bef595c0f7c..f1398e3b357abc 100644 --- a/chromecast/ui/display_settings_manager_impl.h +++ b/chromecast/ui/display_settings_manager_impl.h @@ -80,6 +80,8 @@ class DisplaySettingsManagerImpl : public DisplaySettingsManager, void UpdateBrightness(float brightness, base::TimeDelta duration); + void OnScreenEnabled(PowerToggleCallback callback, bool status); + CastWindowManager* const window_manager_; shell::CastDisplayConfigurator* const display_configurator_;